들어가기
Order status를 Cooking, Cooked, 등등의
상태로 바꾸는것.
owner가 Cooking, Cooked로 바꿀 수 있고,
driver가 PickedUp, Deliverd등으로 바꿀 수 있다.
import { InputType, ObjectType, PickType } from '@nestjs/graphql';
import { MutationOutput } from 'src/common/dtos/output.dto';
import { Order } from '../entities/order.entity';
@InputType()
export class EditOrderInput extends PickType(Order, ['id', 'status']) {}
///Order의 id와 Status만 입력한다~
@ObjectType()
export class EditOrderOutput extends MutationOutput {}
@Mutation(() => EditOrderOutput)
@Role(['Any'])
async editOrder(
@AuthUser() user: User,
@Args('input') editOrderInput: EditOrderInput,
): Promise<EditOrderOutput> {
return this.ordersService.editOrder(user, editOrderInput);
}
async editOrder(
user: User,
{ id: orderId, status }: EditOrderInput,
): Promise<EditOrderOutput> {
try {
const order = await this.orders.findOne(orderId, {
relations: ['restaurant'],
});
///입력받은 id로 order를 찾는다.
///restaurant를 relation으로 불러준다.
///'restaurant'는 order.entity.ts에 @ManyToOne으로 있음.
if (!order) {
return {
ok: false,
error: 'Order not found',
};
}
///order 못찾으면 ok: false
if (!this.canSeeOrder(user, order)) {
return {
ok: false,
error: 'Can not see this',
};
}
///canSeeOrder이 false이면, return{ok: fasle~}로
///stop시킴!!
let canEdit = true;
///canEdit를 let으로 설정시켜놔서
///!canEdit이면 return{ok:false}로 stop시킴.
if (user.role === UserRole.Client) {
canEdit = false;
}
///user가 Clinet이면, 바로 false, client가 order를 edit할 일은 없음.
if (user.role === UserRole.Owner) {
if (status !== OrderStatus.Cooking && status !== OrderStatus.Cooked) {
canEdit = false;
}
}
///Owner는 status가 Cooking, Cooked가 아닐떄는, canEdit할 수 없음.
if (user.role === UserRole.Delivery) {
if (
status !== OrderStatus.PickedUp &&
status !== OrderStatus.Deliverd
) {
canEdit = false;
}
}
///Delivery도 위와 마찬가지
if (!canEdit) {
return {
ok: false,
error: 'You Can not do that',
};
}
///canEdit가 false이면 여기서 stop.
await this.orders.save([
{
id: orderId,
status,
},
]);
return {
ok: true,
};
///orders에 입력받은 id:orderId에 입력받은 status를 save(update)함.
} catch {
return {
ok: false,
error: 'Could not edit order',
};
}
}
EditOrder는 Defensive Programing부분이 햇갈릴 수 가 있음.
집중해서 check할 것!!