From bcedd8c6f3ce77a8ecdd47eedb9913c4f1caf8c1 Mon Sep 17 00:00:00 2001 From: SepehrYahyaee <7heycallmegray@gmail.com> Date: Tue, 28 Apr 2026 10:01:45 +0330 Subject: [PATCH] Added GET car-other-parts in v2 as well; deprecated old endpoints and reordered swagger documents --- .../claim-request-management.controller.ts | 22 +++++++++++++++++- .../claim-request-management.v2.controller.ts | 23 +++++++++++++++++++ src/expert-blame/expert-blame.controller.ts | 11 +++++++++ src/expert-claim/expert-claim.controller.ts | 14 +++++++++++ src/main.ts | 10 ++++++++ .../expert-initiated.controller.ts | 11 +++++++-- .../request-management.controller.ts | 20 ++++++++++++---- 7 files changed, 104 insertions(+), 7 deletions(-) diff --git a/src/claim-request-management/claim-request-management.controller.ts b/src/claim-request-management/claim-request-management.controller.ts index 9f2619c..ed386cb 100644 --- a/src/claim-request-management/claim-request-management.controller.ts +++ b/src/claim-request-management/claim-request-management.controller.ts @@ -22,9 +22,9 @@ import { ApiParam, ApiQuery, ApiTags, + ApiOperation, } from "@nestjs/swagger"; import { diskStorage } from "multer"; -import { GlobalGuard } from "src/auth/guards/global.guard"; import { ClaimAccessGuard } from "src/auth/guards/claim-access.guard"; import { RolesGuard } from "src/auth/guards/role.guard"; import { Roles } from "src/decorators/roles.decorator"; @@ -49,6 +49,7 @@ export class ClaimRequestManagementController { ) {} @ApiParam({ name: "blameId" }) + @ApiOperation({ deprecated: true }) @Post("/:blameId") async createClaimRequest( @Param("blameId") requestId: string, @@ -62,6 +63,7 @@ export class ClaimRequestManagementController { } @ApiBody({ type: CarDamagePartDto }) + @ApiOperation({ deprecated: true }) @Patch("/car-part-damage/:claimRequestID") @ApiParam({ name: "claimRequestID" }) async carPartDamage( @@ -76,6 +78,7 @@ export class ClaimRequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Get("/car-other-part") async getCarOtherParts() { const carOtherPart = await readFile( @@ -104,6 +107,7 @@ export class ClaimRequestManagementController { }), ) @ApiConsumes("multipart/form-data") + @ApiOperation({ deprecated: true }) @Patch("/car-other-part-damage/:claimRequestID") async carOtherPartDamage( @Param("claimRequestID") requestId: string, @@ -119,6 +123,7 @@ export class ClaimRequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Get("required-documents-status/:claimRequestID") @ApiParam({ name: "claimRequestID" }) async getRequiredDocumentsStatus( @@ -129,6 +134,7 @@ export class ClaimRequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Get("car-part-image-required/:claimRequestID") @ApiParam({ name: "claimRequestID" }) async getImageRequired(@Param("claimRequestID") requestId) { @@ -171,6 +177,7 @@ export class ClaimRequestManagementController { enum: ClaimRequiredDocumentType, description: "Type of required document to upload", }) + @ApiOperation({ deprecated: true }) @Patch("upload-required-document/:claimRequestID") async uploadRequiredDocument( @Param("claimRequestID") requestId: string, @@ -223,6 +230,7 @@ export class ClaimRequestManagementController { name: "partId", description: "The ID of the specific car part being photographed.", }) + @ApiOperation({ deprecated: true }) @Patch("capture-car-part-damage/:claimRequestID/:partId") async captureCarPartDamage( @Param("partId") partId: string, @@ -263,6 +271,7 @@ export class ClaimRequestManagementController { ) @ApiConsumes("multipart/form-data") @ApiParam({ name: "claimRequestID" }) + @ApiOperation({ deprecated: true }) @Patch("car-capture/:claimRequestID") async captureVideoCapture( @Param("claimRequestID") requestId: string, @@ -274,11 +283,13 @@ export class ClaimRequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Get("requests/") async getRequest(@CurrentUser() currentUser) { return await this.claimRequestManagementService.myRequests(currentUser); } + @ApiOperation({ deprecated: true }) @Get("request/:claimRequestId") @ApiParam({ name: "claimRequestId" }) myRequests( @@ -288,6 +299,7 @@ export class ClaimRequestManagementController { return this.claimRequestManagementService.requestDetails(requestId, user); } + @ApiOperation({ deprecated: true }) @Put("request/reply/:claimRequestId") @ApiParam({ name: "claimRequestId" }) @UseInterceptors( @@ -326,6 +338,7 @@ export class ClaimRequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Put("request/resend/:claimRequestId/objection") @ApiParam({ name: "claimRequestId" }) @ApiConsumes("application/json") @@ -343,6 +356,7 @@ export class ClaimRequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Patch("request/resend/:claimRequestId") @ApiConsumes("multipart/form-data") @ApiParam({ name: "claimRequestId" }) @@ -393,6 +407,7 @@ export class ClaimRequestManagementController { * User satisfaction rating for a completed claim file. * Only the damaged user (claim owner) can rate their claim after it is closed. */ + @ApiOperation({ deprecated: true }) @Put("request/:claimRequestId/user-rating") @ApiParam({ name: "claimRequestId" }) @ApiBody({ type: UserRatingDto }) @@ -408,6 +423,7 @@ export class ClaimRequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Patch("request/reply/:claimRequestId/:partId/upload-factor") @ApiConsumes("multipart/form-data") @ApiParam({ name: "claimRequestId" }) @@ -452,6 +468,7 @@ export class ClaimRequestManagementController { @ApiBody({ type: InPersonVisitDto }) @ApiParam({ name: "id" }) + @ApiOperation({ deprecated: true }) @Patch(":id/visit") async inPersonVisit( @Param("id") requestId: string, @@ -466,6 +483,7 @@ export class ClaimRequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Get("branches/:insuranceId") async insuranceBranches(@Param("insuranceId") insuranceId: string) { return await this.claimRequestManagementService.retrieveInsuranceBranches( @@ -473,6 +491,7 @@ export class ClaimRequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Get("fanavaran-submit/:claimRequestId") @ApiParam({ name: "claimRequestId" }) async fanavaranSubmit(@Param("claimRequestId") claimRequestId: string) { @@ -481,6 +500,7 @@ export class ClaimRequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Post("fanavaran-submit/:claimRequestId") @ApiParam({ name: "claimRequestId" }) async submitToFanavaran(@Param("claimRequestId") claimRequestId: string) { diff --git a/src/claim-request-management/claim-request-management.v2.controller.ts b/src/claim-request-management/claim-request-management.v2.controller.ts index 14165db..22bc1e5 100644 --- a/src/claim-request-management/claim-request-management.v2.controller.ts +++ b/src/claim-request-management/claim-request-management.v2.controller.ts @@ -13,6 +13,7 @@ import { UseInterceptors, UploadedFile, } from "@nestjs/common"; +import { readFile } from "node:fs/promises"; import { ApiBearerAuth, ApiParam, ApiTags, ApiOperation, ApiResponse, ApiBody, ApiConsumes } from "@nestjs/swagger"; import { FileInterceptor } from "@nestjs/platform-express"; import { diskStorage } from "multer"; @@ -273,6 +274,28 @@ export class ClaimRequestManagementV2Controller { return this.claimRequestManagementService.getOuterPartsCatalogV2(carType); } + @Get("car-other-part") + @ApiOperation({ + summary: "Get other (non-body) parts catalog", + description: + "Returns legacy other-parts catalog used by frontend. Response is parsed JSON.", + }) + @ApiResponse({ + status: 200, + description: "Other parts catalog", + }) + async getCarOtherPartsV2() { + const raw = await readFile( + `${process.cwd()}/src/static/car-part.json`, + "utf-8", + ); + try { + return JSON.parse(raw); + } catch { + return raw; + } + } + @Patch("select-outer-parts/:claimRequestId") @ApiOperation({ summary: "Select Damaged Outer Car Parts (V2 - Step 2)", diff --git a/src/expert-blame/expert-blame.controller.ts b/src/expert-blame/expert-blame.controller.ts index b6e5699..427ccf6 100644 --- a/src/expert-blame/expert-blame.controller.ts +++ b/src/expert-blame/expert-blame.controller.ts @@ -18,6 +18,7 @@ import { ApiParam, ApiProduces, ApiTags, + ApiOperation, } from "@nestjs/swagger"; import { Response, Request } from "express"; import { LocalActorAuthGuard } from "src/auth/guards/actor-local.guard"; @@ -45,30 +46,35 @@ export class ExpertBlameController { // TODO role guard for expert fix @Roles(RoleEnum.EXPERT) + @ApiOperation({ deprecated: true }) @Get() async findAll(@CurrentUser() actor, @ClientKey() client) { return await this.expertBlameService.findAll(actor); } @Roles(RoleEnum.EXPERT) + @ApiOperation({ deprecated: true }) @Get(":id") async findOne(@Param("id") id: string, @CurrentUser() actor) { return await this.expertBlameService.findOne(id, actor.sub); } @Roles(RoleEnum.EXPERT) + @ApiOperation({ deprecated: true }) @Put("lock/:id") async lockRequest(@Param("id") id: string, @CurrentUser() actor) { return await this.expertBlameService.lockRequest(id, actor); } @Roles(RoleEnum.EXPERT) + @ApiOperation({ deprecated: true }) @Get("request/accident-fields") async getAccidentFields() { return await this.expertBlameService.getAccidentField(); } @Roles(RoleEnum.EXPERT) + @ApiOperation({ deprecated: true }) @Put("reply/submit/:id") @ApiBody({ type: SubmitReplyDto }) @ApiParam({ name: "id" }) @@ -95,6 +101,7 @@ export class ExpertBlameController { } @Roles(RoleEnum.EXPERT) + @ApiOperation({ deprecated: true }) @Put("reply/resend/first/:id") @ApiBody({ type: ResendFirstPartyDto }) @ApiParam({ name: "id" }) @@ -107,6 +114,7 @@ export class ExpertBlameController { return this.handleResendRequest(id, body, actor.sub, req); } @Roles(RoleEnum.EXPERT) + @ApiOperation({ deprecated: true }) @Put("reply/resend/second/:id") @Roles(RoleEnum.EXPERT) @ApiBody({ type: ResendSecondPartyDto }) @@ -120,6 +128,7 @@ export class ExpertBlameController { return this.handleResendRequest(id, body, actor.sub, req); } @Roles(RoleEnum.EXPERT) + @ApiOperation({ deprecated: true }) @Get("stream/:requestId") @ApiParam({ name: "requestId" }) async streamVideo(@Param("requestId") requestId: string) { @@ -127,6 +136,7 @@ export class ExpertBlameController { } @UseInterceptors(LoggingInterceptor) + @ApiOperation({ deprecated: true }) @Get("voice/:requestId/:voiceId") @Roles(RoleEnum.EXPERT, RoleEnum.DAMAGE_EXPERT) @ApiParam({ name: "requestId" }) @@ -149,6 +159,7 @@ export class ExpertBlameController { } @ApiParam({ name: "id" }) + @ApiOperation({ deprecated: true }) @Patch(":id/visit") async inPersonVisit(@Param("id") requestId: string, @CurrentUser() actor) { return await this.expertBlameService.inPersonVisit(requestId, actor); diff --git a/src/expert-claim/expert-claim.controller.ts b/src/expert-claim/expert-claim.controller.ts index 2b64117..0eab237 100644 --- a/src/expert-claim/expert-claim.controller.ts +++ b/src/expert-claim/expert-claim.controller.ts @@ -17,6 +17,7 @@ import { ApiParam, ApiQuery, ApiTags, + ApiOperation, } from "@nestjs/swagger"; import { LocalActorAuthGuard } from "src/auth/guards/actor-local.guard"; import { RolesGuard } from "src/auth/guards/role.guard"; @@ -40,11 +41,13 @@ import { FactorValidationDto } from "./dto/factor-validation.dto"; export class ExpertClaimController { constructor(private readonly expertClaimService: ExpertClaimService) {} + @ApiOperation({ deprecated: true }) @Get() async getAllClaimRequests(@CurrentUser() actor, @ClientKey() client) { return await this.expertClaimService.getClaimRequestsListForExpert(actor); } + @ApiOperation({ deprecated: true }) @Get("/:id") @ApiParam({ name: "id" }) @ApiQuery({ @@ -64,12 +67,14 @@ export class ExpertClaimController { ); } + @ApiOperation({ deprecated: true }) @Get("imageRequired/:id") @ApiParam({ name: "id" }) async getImageRequired(@Param("id") id: string, @CurrentUser() currentUser) { return await this.expertClaimService.imageRequired(id, currentUser); } + @ApiOperation({ deprecated: true }) @Get("required-documents/:id") @ApiParam({ name: "id" }) async getRequiredDocuments( @@ -79,11 +84,13 @@ export class ExpertClaimController { return await this.expertClaimService.getRequiredDocuments(id, currentUser); } + @ApiOperation({ deprecated: true }) @Put("lock/:id") async lockClaimRequest(@Param("id") requestId: string, @CurrentUser() actor) { return await this.expertClaimService.lockClaimRequest(requestId, actor); } + @ApiOperation({ deprecated: true }) @Put("reply/submit/:id") @ApiParam({ name: "id" }) async submitReplyRequest( @@ -98,6 +105,7 @@ export class ExpertClaimController { ); } + @ApiOperation({ deprecated: true }) @Put("resend/submit/:id") @ApiParam({ name: "id" }) async submitResend( @@ -117,6 +125,7 @@ export class ExpertClaimController { enum: ["car-capture", "accident"], required: true, }) + @ApiOperation({ deprecated: true }) @Get("stream/:id/video") @Header("Accept-Ranges", "bytes") @Header("Content-Type", "video/mp4") @@ -134,6 +143,7 @@ export class ExpertClaimController { enum: ["car-capture", "accident"], required: true, }) + @ApiOperation({ deprecated: true }) @Get("link/:id/video") @ApiParam({ name: "id" }) async getClaimVideoLink( @@ -143,12 +153,14 @@ export class ExpertClaimController { return this.expertClaimService.getVideoLink(id, query); } + @ApiOperation({ deprecated: true }) @Get("stream/:id/voice") @ApiParam({ name: "id" }) async getClaimVoiceLink(@Param("id") id: string) { return await this.expertClaimService.getVoiceLink(id); } + @ApiOperation({ deprecated: true }) @Patch("validate-factors/:claimId") @ApiParam({ name: "claimId" }) @ApiBody({ type: FactorValidationDto }) @@ -166,11 +178,13 @@ export class ExpertClaimController { } @ApiParam({ name: "id" }) + @ApiOperation({ deprecated: true }) @Patch(":id/visit") async inPersonVisit(@Param("id") requestId: string, @CurrentUser() actor) { return await this.expertClaimService.inPersonVisit(requestId, actor); } + @ApiOperation({ deprecated: true }) @Get("branches/:insuranceId") @ApiParam({ name: "insuranceId" }) async getInsuranceBranches(@Param("insuranceId") insuranceId: string) { diff --git a/src/main.ts b/src/main.ts index 3e66699..09e0018 100644 --- a/src/main.ts +++ b/src/main.ts @@ -42,6 +42,16 @@ async function bootstrap() { swaggerOptions: { persistAuthorization: true, docExpansion: "none", + tagsSorter: (a: string, b: string) => { + const priority: Record = { + user: 0, + actor: 1, + }; + const pa = priority[a] ?? 100; + const pb = priority[b] ?? 100; + if (pa !== pb) return pa - pb; + return a.localeCompare(b); + }, }, }); await app.listen(process.env.PORT); diff --git a/src/request-management/expert-initiated.controller.ts b/src/request-management/expert-initiated.controller.ts index f99ce73..eb2a38f 100644 --- a/src/request-management/expert-initiated.controller.ts +++ b/src/request-management/expert-initiated.controller.ts @@ -6,7 +6,6 @@ import { Param, UseGuards, Get, - Query, UseInterceptors, UploadedFile, } from "@nestjs/common"; @@ -18,7 +17,6 @@ import { ApiBearerAuth, ApiBody, ApiParam, - ApiQuery, ApiTags, ApiOperation, ApiResponse, @@ -48,6 +46,7 @@ export class ExpertInitiatedController { private readonly claimRequestManagementService: ClaimRequestManagementService, ) {} + @ApiOperation({ deprecated: true }) @Get("my-files") @ApiOperation({ summary: "List my expert-initiated files", @@ -61,6 +60,7 @@ export class ExpertInitiatedController { ); } + @ApiOperation({ deprecated: true }) @Post("complete-blame-data/:requestId") @ApiOperation({ summary: "Submit all blame-needed data", @@ -86,6 +86,7 @@ export class ExpertInitiatedController { ); } + @ApiOperation({ deprecated: true }) @Post("complete-claim-data/:claimRequestId") @ApiOperation({ summary: "Submit claim-needed data", @@ -111,6 +112,7 @@ export class ExpertInitiatedController { ); } + @ApiOperation({ deprecated: true }) @Post("create") @ApiOperation({ summary: "Create expert-initiated blame file", @@ -138,6 +140,7 @@ export class ExpertInitiatedController { ); } + @ApiOperation({ deprecated: true }) @Post("complete-form-third-party/:requestId") @ApiOperation({ summary: "Expert completes all information for IN_PERSON THIRD_PARTY file", @@ -167,6 +170,7 @@ export class ExpertInitiatedController { ); } + @ApiOperation({ deprecated: true }) @Post("complete-form-car-body/:requestId") @ApiOperation({ summary: "Expert completes all information for IN_PERSON CAR_BODY file", @@ -196,6 +200,7 @@ export class ExpertInitiatedController { ); } + @ApiOperation({ deprecated: true }) @Post("upload-video/:requestId") @ApiOperation({ summary: "Expert uploads video for expert-initiated file", @@ -252,6 +257,7 @@ export class ExpertInitiatedController { ); } + @ApiOperation({ deprecated: true }) @Post("upload-voice/:requestId") @ApiOperation({ summary: "Expert uploads voice for expert-initiated file", @@ -309,6 +315,7 @@ export class ExpertInitiatedController { ); } + @ApiOperation({ deprecated: true }) @Post("add-accident-fields/:requestId") @ApiOperation({ summary: "Expert adds accident fields to expert-initiated file", diff --git a/src/request-management/request-management.controller.ts b/src/request-management/request-management.controller.ts index 6151187..ac656bb 100644 --- a/src/request-management/request-management.controller.ts +++ b/src/request-management/request-management.controller.ts @@ -11,8 +11,6 @@ import { Req, Put, UploadedFiles, - Patch, - Query, } from "@nestjs/common"; import { FileFieldsInterceptor, @@ -23,8 +21,8 @@ import { ApiBody, ApiConsumes, ApiParam, - ApiQuery, ApiTags, + ApiOperation, } from "@nestjs/swagger"; import { Request } from "express"; import { diskStorage } from "multer"; @@ -44,7 +42,6 @@ import { LocationDto, } from "./dto/create-request-management.dto"; import { RequestManagementService } from "./request-management.service"; -import { InPersonVisitDto } from "src/claim-request-management/dto/in-person-visit.dto"; @Controller("blame-request-management") @ApiTags("blame-request-management") @@ -56,6 +53,7 @@ export class RequestManagementController { private readonly requestManagementService: RequestManagementService, ) {} + @ApiOperation({ deprecated: true }) @Post() @UseGuards(GlobalGuard) async createRequest( @@ -68,6 +66,7 @@ export class RequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Post("/initial-form/:requestId") @ApiParam({ name: "requestId" }) @ApiBody({ type: InitialFormDto }) @@ -115,6 +114,7 @@ export class RequestManagementController { ) @UseGuards(GlobalGuard) @ApiParam({ name: "requestId" }) + @ApiOperation({ deprecated: true }) @Post("upload-video/:requestId") @UseGuards(GlobalGuard) async videoUploader( @@ -129,6 +129,7 @@ export class RequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Post("/add-plate/:requestId") @ApiParam({ name: "requestId" }) @ApiBody({ type: AddPlateDto }) @@ -146,6 +147,7 @@ export class RequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Post("/carbody-form/:requestId") @ApiParam({ name: "requestId" }) @ApiBody({ type: CarBodyFormDto }) @@ -163,6 +165,7 @@ export class RequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Post("/carbody-secondform/:requestId") @ApiParam({ name: "requestId" }) @ApiBody({ type: CarBodySecondForm }) @@ -180,6 +183,7 @@ export class RequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Post("/add-detail-location/:requestId") @ApiParam({ name: "requestId" }) @ApiBody({ type: LocationDto }) @@ -228,6 +232,7 @@ export class RequestManagementController { }), ) @ApiParam({ name: "requestId" }) + @ApiOperation({ deprecated: true }) @Post("upload-voice/:requestId") @UseGuards(GlobalGuard) async voiceUploader( @@ -242,6 +247,7 @@ export class RequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Post("/add-detail-description/:requestId") @ApiParam({ name: "requestId" }) @ApiBody({ type: DescriptionDto }) @@ -259,6 +265,7 @@ export class RequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Post("add-second-party-details/:phoneNumber/:requestId/:frontendRoutes") @ApiParam({ name: "phoneNumber" }) @ApiParam({ name: "requestId" }) @@ -280,17 +287,20 @@ export class RequestManagementController { ); } + @ApiOperation({ deprecated: true }) @Get("requests") async requests(@CurrentUser() user) { return await this.requestManagementService.myRequests(user.username); } + @ApiOperation({ deprecated: true }) @Get("creatable-claims") @UseGuards(GlobalGuard) async getCreatableClaims(@CurrentUser() user) { return await this.requestManagementService.getCreatableClaims(user); } + @ApiOperation({ deprecated: true }) @Get("request/:requestId") @ApiParam({ name: "requestId" }) @Roles(RoleEnum.USER) @@ -329,6 +339,7 @@ export class RequestManagementController { }), }), ) + @ApiOperation({ deprecated: true }) @Put("request/reply/:requestId") @ApiParam({ name: "requestId" }) @UseGuards(GlobalGuard) @@ -385,6 +396,7 @@ export class RequestManagementController { ) @UseGuards(GlobalGuard) @ApiParam({ name: "requestId" }) + @ApiOperation({ deprecated: true }) @Put("request/resend/:requestId") userResendReply( @Body("description") description: string,