mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-26 18:42:49 +00:00
- Implement ShippingLineCompaniesService for registering and managing shipping line companies. - Create ResendActivationAction component for resending activation links to shipping lines. - Develop ShippingLineCompaniesPage for listing and registering shipping lines with validation. - Introduce shippingLineCompanies.service for API interactions related to shipping lines. - Define types for shipping line companies, including registration and pagination. - Add placeholder pages for shipping line portal, including home, bookings, help, invoices, and settings.
96 lines
3.1 KiB
TypeScript
96 lines
3.1 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
Get,
|
|
Param,
|
|
ParseUUIDPipe,
|
|
Post,
|
|
Query,
|
|
} from "@nestjs/common";
|
|
import { ApiBearerAuth, ApiOperation, ApiTags } from "@nestjs/swagger";
|
|
|
|
import { BookingStaff } from "../../common/booking-guards";
|
|
import { FREIGHT_PERMS } from "../../seed/freight-permissions.registry";
|
|
import { BackofficeResetPasswordDto } from "../auth/dto/forgot-password.dto";
|
|
import { CreateShippingLineDto } from "./dto/create-shipping-line.dto";
|
|
import {
|
|
RegisterShippingLineResponseDto,
|
|
ShippingLineResponseDto,
|
|
} from "./dto/shipping-line-response.dto";
|
|
import { ShippingLineCompaniesService } from "./shipping-line-companies.service";
|
|
|
|
/**
|
|
* Shipping line *companies* — carriers with a portal login, registered by staff
|
|
* (there is no self-signup). The line receives a single-use activation link and
|
|
* sets its own password, so staff never see or handle a credential.
|
|
*
|
|
* Distinct from `freight.shipping_lines` behind `/shipping-lines`
|
|
* (rule-engine): that is a pricing lookup list — a code/label a booking points
|
|
* at via `shipping_line_id` — with no account, no user and no login. Same words,
|
|
* different concept, hence the separate route.
|
|
*/
|
|
@ApiTags("shipping-line-companies")
|
|
@Controller("shipping-line-companies")
|
|
@ApiBearerAuth()
|
|
export class ShippingLineCompaniesController {
|
|
constructor(private readonly shippingLineCompaniesService: ShippingLineCompaniesService) {}
|
|
|
|
@Post()
|
|
@BookingStaff(FREIGHT_PERMS.shippingLines.create)
|
|
@ApiOperation({
|
|
summary: "Register a shipping line and send its activation link",
|
|
})
|
|
async register(
|
|
@Body() dto: CreateShippingLineDto,
|
|
): Promise<RegisterShippingLineResponseDto> {
|
|
const { shippingLine, activationSentTo } =
|
|
await this.shippingLineCompaniesService.register(dto);
|
|
return new RegisterShippingLineResponseDto(shippingLine, activationSentTo);
|
|
}
|
|
|
|
@Get()
|
|
@BookingStaff(FREIGHT_PERMS.shippingLines.view)
|
|
@ApiOperation({ summary: "List shipping lines (paginated)" })
|
|
async list(
|
|
@Query("page") page?: string,
|
|
@Query("limit") limit?: string,
|
|
): Promise<{
|
|
items: ShippingLineResponseDto[];
|
|
total: number;
|
|
page: number;
|
|
limit: number;
|
|
}> {
|
|
const result = await this.shippingLineCompaniesService.list(
|
|
page ? Number(page) : undefined,
|
|
limit ? Number(limit) : undefined,
|
|
);
|
|
return {
|
|
...result,
|
|
items: result.items.map((item) => new ShippingLineResponseDto(item)),
|
|
};
|
|
}
|
|
|
|
@Get(":id")
|
|
@BookingStaff(FREIGHT_PERMS.shippingLines.view)
|
|
@ApiOperation({ summary: "Get a shipping line by id" })
|
|
async findOne(
|
|
@Param("id", ParseUUIDPipe) id: string,
|
|
): Promise<ShippingLineResponseDto> {
|
|
return new ShippingLineResponseDto(
|
|
await this.shippingLineCompaniesService.findById(id),
|
|
);
|
|
}
|
|
|
|
@Post(":id/resend-activation")
|
|
@BookingStaff(FREIGHT_PERMS.shippingLines.resetPassword)
|
|
@ApiOperation({
|
|
summary: "Resend a shipping line's activation / password-reset link",
|
|
})
|
|
async resendActivation(
|
|
@Param("id", ParseUUIDPipe) id: string,
|
|
@Body() dto: BackofficeResetPasswordDto,
|
|
) {
|
|
return this.shippingLineCompaniesService.resendActivation(id, dto.channel);
|
|
}
|
|
}
|