Skip to content

Commit

Permalink
Merge pull request #142 from 00sOrg/Fix/139
Browse files Browse the repository at this point in the history
✨ [Feat] Implement update member detail api
  • Loading branch information
gitwub5 authored Sep 30, 2024
2 parents 513cf6e + ff6f13a commit f626226
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 2 deletions.
52 changes: 52 additions & 0 deletions src/modules/members/dto/update-member-detail.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { ApiProperty } from '@nestjs/swagger';
import { Member, MemberDetail } from '../entities';
import { MemberDetailBuilder } from '../entities/builder/memberDetail.builder';

export class UpdateMemberDetailDto {
@ApiProperty()
sex?: string;

@ApiProperty()
birthDate?: Date;

@ApiProperty()
height?: number;

@ApiProperty()
weight?: number;

@ApiProperty()
bloodType?: string;

@ApiProperty()
disease?: string;

@ApiProperty()
medication?: string;

toEntity(member: Member): MemberDetail {
const builder = new MemberDetailBuilder().member(member);
if (this.sex !== undefined) {
builder.sex(this.sex);
}
if (this.weight !== undefined) {
builder.weight(this.weight);
}
if (this.height !== undefined) {
builder.height(this.height);
}
if (this.birthDate !== undefined) {
builder.birthDate(this.birthDate);
}
if (this.bloodType !== undefined) {
builder.bloodType(this.bloodType);
}
if (this.disease !== undefined) {
builder.disease(this.disease);
}
if (this.medication !== undefined) {
builder.medication(this.medication);
}
return builder.build();
}
}
18 changes: 16 additions & 2 deletions src/modules/members/members.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import { UpdateMemberDto } from './dto/update-member.dto';
import { SearchMemberDto } from './dto/search-member.dto';
import { GetMemberInfoDto } from './dto/get-memberInfo.dto';
import { GetMemberDetailInfoDto } from './dto/get-memberDetail-info.dto';
import { UpdateMemberDetailDto } from './dto/update-member-detail.dto';

@ApiTags('Members')
@UseGuards(AuthGuard('jwt'))
Expand Down Expand Up @@ -219,12 +220,25 @@ export class MembersController {
return await this.favoritesService.deleteFavorite(memberId, Number(id));
}

@Get('/info')
@Get('/detail')
@ApiOperation({ summary: 'Get member info' })
@ApiSuccessResponse(GetMemberDetailInfoDto)
@ApiFailureResponse(ErrorStatus.INTERNAL_SERVER_ERROR)
async getMemberInfo(@Req() req): Promise<GetMemberDetailInfoDto> {
async getMemberDetail(@Req() req): Promise<GetMemberDetailInfoDto> {
const memberId = req.user.id;
return await this.membersService.findMemberDetailById(memberId);
}

@Patch('/detail')
@ApiOperation({ summary: 'Update member info' })
@ApiBody({ type: UpdateMemberDetailDto })
@ApiSuccessResponse()
@ApiFailureResponse(ErrorStatus.INTERNAL_SERVER_ERROR)
async updateMemberDetail(
@Req() req,
@Body() request: UpdateMemberDetailDto,
): Promise<void> {
const member = req.user;
return await this.membersService.updateMemberDetailById(member, request);
}
}
12 changes: 12 additions & 0 deletions src/modules/members/repository/membersDetail.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,16 @@ export class MembersDetailRepository {
.leftJoinAndSelect('memberDetail.member', 'member')
.getOne();
}

async updateByMemberId(
memberId: number,
updateData: Partial<MemberDetail>,
): Promise<void> {
await this.memberDetailRepository
.createQueryBuilder('memberDetail')
.update()
.set(updateData)
.where('memberId = :memberId', { memberId })
.execute();
}
}
12 changes: 12 additions & 0 deletions src/modules/members/services/members.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { NaverService } from '../../../external/naver/naver.service';
import { SearchMemberDto } from '../dto/search-member.dto';
import { GetMemberInfoDto } from '../dto/get-memberInfo.dto';
import { GetMemberDetailInfoDto } from '../dto/get-memberDetail-info.dto';
import { UpdateMemberDetailDto } from '../dto/update-member-detail.dto';

@Injectable()
export class MembersService {
Expand Down Expand Up @@ -164,4 +165,15 @@ export class MembersService {
}
return GetMemberDetailInfoDto.of(memberDetail);
}

async updateMemberDetailById(
member: Member,
request: UpdateMemberDetailDto,
): Promise<void> {
const memberDetail = request.toEntity(member);
await this.membersDetailRepository.updateByMemberId(
member.id,
memberDetail,
);
}
}
21 changes: 21 additions & 0 deletions test/unit/members/members.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { SearchMemberDto } from '../../../src/modules/members/dto/search-member.
import { MemberDetailBuilder } from '../../../src/modules/members/entities/builder/memberDetail.builder';
import { GetMemberInfoDto } from '../../../src/modules/members/dto/get-memberInfo.dto';
import { GetMemberDetailInfoDto } from '../../../src/modules/members/dto/get-memberDetail-info.dto';
import { UpdateMemberDetailDto } from '../../../src/modules/members/dto/update-member-detail.dto';

describe('MembersService', () => {
let service: MembersService;
Expand Down Expand Up @@ -41,6 +42,7 @@ describe('MembersService', () => {
useValue: {
update: jest.fn(),
findByMemberId: jest.fn(),
updateByMemberId: jest.fn(),
},
},
{
Expand Down Expand Up @@ -250,4 +252,23 @@ describe('MembersService', () => {
);
});
});

describe('updateMemberDetailById', () => {
it('should update the member detail successfully', async () => {
const member = new MemberBuilder().id(1).build();
const request = new UpdateMemberDetailDto();
const memberDetail = request.toEntity(member);

jest
.spyOn(membersDetailRepository, 'updateByMemberId')
.mockResolvedValue(undefined);

await service.updateMemberDetailById(member, request);
expect(membersDetailRepository.updateByMemberId).toHaveBeenCalledTimes(1);
expect(membersDetailRepository.updateByMemberId).toHaveBeenCalledWith(
member.id,
memberDetail,
);
});
});
});

0 comments on commit f626226

Please sign in to comment.