Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 13 additions & 33 deletions src/order/controllers/order-delivery.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ import {
UpdateDeliveryDTO,
} from '../dto/order-delivery.dto';
import { User } from 'src/user/entities/user.entity';
import { plainToInstance } from 'class-transformer';

@Controller('delivery')
export class OrderDeliveryController {
constructor(private readonly orderService: OrderService) {}

@Get()
@UseGuards(AuthGuard)
@ApiBearerAuth()
Expand Down Expand Up @@ -101,14 +103,11 @@ export class OrderDeliveryController {
employeeId,
});

const results: OrderDeliveryDTO[] = data.map((delivery) => ({
id: delivery.id,
orderId: delivery.order.id,
deliveryStatus: delivery.deliveryStatus,
estimatedTime: delivery.estimatedTime,
branchId: delivery.branch ? delivery.branch.id : null,
employeeId: delivery.employee ? delivery.employee.id : null,
}));
const results = data.map((delivery) =>
plainToInstance(OrderDeliveryDTO, delivery, {
excludeExtraneousValues: true,
}),
);

return { data: results, total };
}
Expand All @@ -124,23 +123,9 @@ export class OrderDeliveryController {
): Promise<OrderDeliveryDTO> {
const delivery = await this.orderService.getDelivery(deliveryId);

return {
id: delivery.id,
orderId: delivery.order.id,
deliveryStatus: delivery.deliveryStatus,
estimatedTime: delivery.estimatedTime,
branchId: delivery.branch ? delivery.branch.id : null,
employeeId: delivery.employee ? delivery.employee.id : null,
// Data of user:
userName:
delivery.order.user.firstName + ' ' + delivery.order.user.lastName,
userPhone: delivery.order.user.phoneNumber,
// data of the address:
address: delivery.address.adress,
zipCode: delivery.address.zipCode,
additionalInformation: delivery.address.additionalInformation,
referencePoint: delivery.address.referencePoint,
};
return plainToInstance(OrderDeliveryDTO, delivery, {
excludeExtraneousValues: true,
});
}

@Patch('/:deliveryId')
Expand All @@ -161,13 +146,8 @@ export class OrderDeliveryController {
updateDeliveryDto,
);

return {
id: updatedDelivery.id,
orderId: updatedDelivery.order.id,
deliveryStatus: updatedDelivery.deliveryStatus,
estimatedTime: updatedDelivery.estimatedTime,
branchId: updatedDelivery.branch ? updatedDelivery.branch.id : null,
employeeId: updatedDelivery.employee ? updatedDelivery.employee.id : null,
};
return plainToInstance(OrderDeliveryDTO, updatedDelivery, {
excludeExtraneousValues: true,
});
}
}
85 changes: 62 additions & 23 deletions src/order/dto/order-delivery.dto.ts
Original file line number Diff line number Diff line change
@@ -1,60 +1,100 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import {
IsDateString,
IsOptional,
IsString,
IsBoolean,
IsUUID,
} from 'class-validator';
import { IsDateString, IsOptional, IsString, IsUUID } from 'class-validator';
import { PaginationQueryDTO } from 'src/utils/dto/pagination.dto';
import { Expose, Transform, Type } from 'class-transformer';
import { BaseUserDTO } from 'src/user/dto/user.dto';
import { UserAddressDTO } from 'src/user/dto/user-address.dto';

export class OrderDeliveryDTO {
@ApiProperty({ description: 'Unique identifier of the delivery' })
@Expose()
id: string;

@ApiProperty({ description: 'Id of the associated order' })
@Expose()
@Transform(({ obj }: { obj: { order?: { id: string } } }) => obj.order?.id)
orderId: string;

@ApiProperty({
description: 'Delivery status (e.g., pending, delivered, etc.)',
})
@Expose()
deliveryStatus: string;

@ApiProperty({ description: 'Estimated time for delivery' })
@IsDateString()
@Expose()
estimatedTime: Date;

@ApiProperty({
description: 'Id of the branch associated with the delivery',
nullable: true,
})
@Expose()
@Transform(({ obj }: { obj: { branch?: { id: string } } }) => obj.branch?.id)
branchId: string | null;

@ApiProperty({
description: 'Id of the employee ("motorizado") assigned to the delivery',
nullable: true,
})
@Expose()
@Transform(
({ obj }: { obj: { employee?: { id: string } } }) => obj.employee?.id,
)
employeeId: string | null;

// User contact information (extracted from the order)
@ApiProperty({ description: 'Full name of the user' })
userName?: string;

@ApiProperty({ description: 'Phone number of the user', nullable: true })
userPhone?: string;
@ApiProperty({ description: 'User contact info', type: BaseUserDTO })
@Expose()
@Transform(
({
obj,
}: {
obj: {
order: {
user: { firstName: string; lastName: string; phoneNumber?: string };
};
};
}) => ({
firstName: obj.order.user.firstName,
lastName: obj.order.user.lastName,
phoneNumber: obj.order.user.phoneNumber,
}),
{ toClassOnly: true },
)
@Type(() => BaseUserDTO)
user: BaseUserDTO;

// Delivery address information
@ApiProperty({ description: 'Address street', nullable: true })
address?: string;
@ApiProperty({ description: 'Zip code', nullable: true })
zipCode?: string;
@ApiProperty({
description: 'Additional address information',
@ApiPropertyOptional({
description: 'Delivery address info',
type: UserAddressDTO,
nullable: true,
})
additionalInformation?: string;
@ApiProperty({ description: 'Reference point for delivery', nullable: true })
referencePoint?: string;
@Expose()
@Transform(
({
obj,
}: {
obj: {
adress?: {
adress?: string;
zipCode?: string;
additionalInformation?: string;
referencePoint?: string;
};
};
}) => ({
adress: obj.adress?.adress,
zipCode: obj.adress?.zipCode,
additionalInformation: obj.adress?.additionalInformation,
referencePoint: obj.adress?.referencePoint,
}),
{ toClassOnly: true },
)
@Type(() => UserAddressDTO)
address?: UserAddressDTO;
}

export class UpdateDeliveryDTO {
Expand All @@ -67,8 +107,7 @@ export class UpdateDeliveryDTO {
description: 'indicate the delivery is rejected (employee unassign)',
})
@IsOptional()
@IsBoolean()
reject?: boolean;
employeeId?: string;
}

export class OrderDeliveryQueryDTO extends PaginationQueryDTO {
Expand Down
32 changes: 21 additions & 11 deletions src/order/order.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,13 @@ export class OrderService {
const query = this.orderDeliveryRepository
.createQueryBuilder('delivery')
.leftJoinAndSelect('delivery.order', 'order')
.leftJoinAndSelect('order.user', 'orderUser')
.leftJoinAndSelect('delivery.adress', 'adress')
.leftJoinAndSelect('delivery.branch', 'branch')
.leftJoinAndSelect('delivery.employee', 'employee')
.leftJoinAndSelect('adress.city', 'city')
.leftJoinAndSelect('city.state', 'state')
.leftJoinAndSelect('state.country', 'country')
.where('delivery.deletedAt IS NULL');

if (user.role !== UserRole.ADMIN) {
Expand Down Expand Up @@ -270,20 +275,25 @@ export class OrderService {
): Promise<OrderDelivery> {
const delivery = await this.orderDeliveryRepository.findOne({
where: { id: deliveryId },
relations: ['employee', 'order'],
relations: [
'order',
'order.user',
'adress',
'adress.city',
'adress.city.state',
'adress.city.state.country',
'employee',
'branch',
],
});
if (!delivery) {
throw new NotFoundException('Delivery not found.');
}
if (updateData.reject) {
if (delivery.employee && delivery.employee.id !== user.id) {
throw new NotFoundException(
'You are not authorized to reject this delivery.',
);
}
} else if (updateData.deliveryStatus) {
delivery.deliveryStatus = updateData.deliveryStatus;
}
return await this.orderDeliveryRepository.save(delivery);

const updateDelivery = this.orderDeliveryRepository.merge(
delivery,
updateData,
);
return await this.orderDeliveryRepository.save(updateDelivery);
}
}
Loading