과제 정보 요약
구현 기간 : 21.11.22(18시) ~ 21.11.28 (22시)
자세한 내용은 Github 참고
Django
Nest.js
입력데이터 예시
[
{
"id": "candycandy",
"trimId": 5000
},
{
"id": "mylovewolkswagen",
"trimId": 9000
},
{
"id": "bmwwow",
"trimId": 11000
},
{
"id": "dreamcar",
"trimId": 15000
}
]
타이어 정보를 등록하는 로직은 django와 nest.js와 조금 차이가 있습니다.
그래서 각각 설명하도록 하겠습니다.
UserTireRegisterSerializer
를 이용해서 데이터를 받습니다. many=True 옵션이 있으면 데이터를 여러개 받을 수 있습니다. 즉 위에 예시처럼 데이터를 받을 수 있습니다.serializer = UserTireRegisterSerializer(data=request.data, many=True)
transaction
를 걸었습니다.get_or_creat()
를 사용해서 진행하였습니다tire_obj, _ = Tire.objects.get_or_create(**tire)
UserTire.objects.get_or_create(user=user_obj, tire=tire_obj)
@Post('/register-tires')
@HttpCode(200)
@UseGuards(AuthGuard())
registerTires(
@Body(new ParseArrayMaxMinLenPipe({ items: TrimRegistrationDto }, 1, 5))
trimRegistrationDto: TrimRegistrationDto[],
) {
return this.userService.registerTires(trimRegistrationDto);
}
async registerTires(trimRegistrationDto: TrimRegistrationDto[]) {
// 등록하기 편하게 아래와 같이 trimID기준으로 data를 조작한다. 타이어 정보도 획득한다.
// [{trimID : {id:[ids..], tires:[dto...]}}]
const organizedData = trimRegistrationDto.reduce((pre, cur) => {
if (pre[cur.trimId]) {
pre[cur.trimId].id.add(cur.id);
} else {
pre[cur.trimId] = {
id: new Set([cur.id]),
tires: this.getTireInfo(cur.trimId),
};
}
return pre;
}, {});
# 입력된 값 중 5000번 trimId을 입력한 user는 cardoc, cardoc2이고
# 5000번 trimId에 해당되는 타이어 요소는 tires입니다,
[
{
"5000" : {
"id":["cardoc", "cardoc2"],
"tires":[
{"width": 260, "aspectRatio:60", "wheelSize":15},
{"width": 255, "aspectRatio:50", "wheelSize":16}
]
}
}
]
export class ExtendedRepository<Entity> extends Repository<Entity> {
async getOrCreate(dto: any): Promise<Entity> {
const instance = await this.findOne(dto);
if (instance) return instance;
return this.save(dto);
}
}