Skip to content

Commit

Permalink
Merge pull request #93 from 00sOrg/Feat/92
Browse files Browse the repository at this point in the history
🔨 [Feat] Feat get member api
  • Loading branch information
gitwub5 authored Sep 19, 2024
2 parents c0d617e + 30361a0 commit 57cb78c
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 3 deletions.
42 changes: 42 additions & 0 deletions src/modules/members/dto/get-memberInfo.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { ApiProperty } from '@nestjs/swagger';
import { Member } from '../entities';

export class GetMemberInfoDto {
@ApiProperty()
memberId: number;

@ApiProperty()
nickname: string;

@ApiProperty()
profilePicture?: string;

@ApiProperty()
longitude: number;

@ApiProperty()
latitude: number;

constructor(
memberId: number,
nickname: string,
longitude: number,
latitude: number,
profilePicture?: string,
) {
this.memberId = memberId;
this.nickname = nickname;
this.profilePicture = profilePicture;
this.longitude = longitude;
this.latitude = latitude;
}
static of(member: Member): GetMemberInfoDto {
return new GetMemberInfoDto(
member.id,
member.nickname,
member.longitude,
member.latitude,
member.memberDetail!.profilePicture,
);
}
}
12 changes: 12 additions & 0 deletions src/modules/members/members.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import { FindFavoriteListDto } from './dto/find-favorite-list.dto';
import { FileInterceptor } from '@nestjs/platform-express';
import { UpdateMemberDto } from './dto/update-member.dto';
import { SearchMemberDto } from './dto/search-member.dto';
import { GetMemberInfoDto } from './dto/get-memberInfo.dto';

@ApiTags('Members')
@UseGuards(AuthGuard('jwt'))
Expand Down Expand Up @@ -194,4 +195,15 @@ export class MembersController {
): Promise<SearchMemberDto> {
return await this.membersService.findMemberAndAddressByNickname(nickname);
}

@Get('/:id')
@ApiOperation({ summary: 'Get member by id' })
@ApiSuccessResponse(GetMemberInfoDto)
@ApiFailureResponse(
ErrorStatus.INTERNAL_SERVER_ERROR,
ErrorStatus.MEMBER_NOT_FOUND,
)
async findMemberById(@Param('id') id: string): Promise<GetMemberInfoDto> {
return await this.membersService.findMemberById(Number(id));
}
}
8 changes: 5 additions & 3 deletions src/modules/members/repository/members.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ export class MembersRepository {
}

async findById(memberId: number): Promise<Member | null> {
return this.memberRepository.findOne({
where: { id: memberId },
});
return this.memberRepository
.createQueryBuilder('member')
.where('member.id=:memberId', { memberId })
.leftJoinAndSelect('member.memberDetail', 'memberDetail')
.getOne();
}

async findByIds(ids: number[]): Promise<Member[] | undefined> {
Expand Down
9 changes: 9 additions & 0 deletions src/modules/members/services/members.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { S3Service } from 'src/external/s3/s3.service';
import { MembersDetailRepository } from '../repository/membersDetail.repository';
import { NaverService } from '../../../external/naver/naver.service';
import { SearchMemberDto } from '../dto/search-member.dto';
import { GetMemberInfoDto } from '../dto/get-memberInfo.dto';

@Injectable()
export class MembersService {
Expand Down Expand Up @@ -131,4 +132,12 @@ export class MembersService {
);
return SearchMemberDto.of(member, address);
}

async findMemberById(memberId: number): Promise<GetMemberInfoDto> {
const member = await this.membersRepository.findById(memberId);
if (!member) {
throw new ExceptionHandler(ErrorStatus.MEMBER_NOT_FOUND);
}
return GetMemberInfoDto.of(member);
}
}
31 changes: 31 additions & 0 deletions test/unit/members/members.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { MemberBuilder } from '../../../src/modules/members/entities/builder/mem
import { NaverService } from '../../../src/external/naver/naver.service';
import { SearchMemberDto } from '../../../src/modules/members/dto/search-member.dto';
import { MemberDetailBuilder } from '../../../src/modules/members/entities/builder/memberDetail.builder';
import { GetMemberInfoDto } from '../../../src/modules/members/dto/get-memberInfo.dto';

describe('MembersService', () => {
let service: MembersService;
Expand Down Expand Up @@ -191,4 +192,34 @@ describe('MembersService', () => {
).rejects.toThrow(new ExceptionHandler(ErrorStatus.MEMBER_NOT_FOUND));
});
});

describe('findMemberById', () => {
let member: Member;
beforeEach(() => {
const memberDetail = new MemberDetailBuilder()
.id(1)
.profilePicture('profile1')
.build();
member = new MemberBuilder()
.id(1)
.memberDetail(memberDetail)
.nickname('nickname')
.logitude(0)
.latitude(0)
.build();
});
it('should return memberInfo successfully', async () => {
jest.spyOn(membersRepository, 'findById').mockResolvedValue(member);
const result = await service.findMemberById(1);
expect(result).toBeInstanceOf(GetMemberInfoDto);
expect(membersRepository.findById).toHaveBeenCalledTimes(1);
expect(membersRepository.findById).toHaveBeenCalledWith(member.id);
});
it('should throw MEMBER_NOT_FOUND if member does not exist', async () => {
jest.spyOn(membersRepository, 'findById').mockResolvedValue(null);
await expect(service.findMemberById(1)).rejects.toThrow(
new ExceptionHandler(ErrorStatus.MEMBER_NOT_FOUND),
);
});
});
});

0 comments on commit 57cb78c

Please sign in to comment.