From 781212277a6c033e62774cc422900cecbddc9337 Mon Sep 17 00:00:00 2001 From: paritosh18 Date: Mon, 2 Mar 2026 13:01:53 +0530 Subject: [PATCH] ghfghf --- serverless/functions/host.yml | 16 ++++++ .../onboarding/getLatestAgreement.ts | 54 +++++++++++++++++++ src/modules/host/services/host.service.ts | 41 ++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 src/modules/host/handlers/Host_Admin/onboarding/getLatestAgreement.ts diff --git a/serverless/functions/host.yml b/serverless/functions/host.yml index 62e1482..40e67bc 100644 --- a/serverless/functions/host.yml +++ b/serverless/functions/host.yml @@ -258,6 +258,22 @@ acceptAggrement: path: /host/Host_Admin/onboarding/accept-agreement method: patch +getLatestAgreement: + handler: src/modules/host/handlers/Host_Admin/onboarding/getLatestAgreement.handler + memorySize: 384 + package: + patterns: + - 'src/modules/host/handlers/Host_Admin/onboarding/getLatestAgreement.*' + - 'src/modules/host/services/**' + - ${file(./serverless/patterns/base.yml):pattern1} + - ${file(./serverless/patterns/base.yml):pattern2} + - ${file(./serverless/patterns/base.yml):pattern3} + - ${file(./serverless/patterns/base.yml):pattern4} + events: + - httpApi: + path: /host/Host_Admin/onboarding/get-latest-agreement + method: get + getStepperInfo: handler: src/modules/host/handlers/getStepper.handler memorySize: 384 diff --git a/src/modules/host/handlers/Host_Admin/onboarding/getLatestAgreement.ts b/src/modules/host/handlers/Host_Admin/onboarding/getLatestAgreement.ts new file mode 100644 index 0000000..976dbc1 --- /dev/null +++ b/src/modules/host/handlers/Host_Admin/onboarding/getLatestAgreement.ts @@ -0,0 +1,54 @@ +import { verifyMinglarAdminHostToken } from '../../../../../common/middlewares/jwt/authForMinglarAdminHost'; +import { APIGatewayProxyEvent, APIGatewayProxyResult, Context } from 'aws-lambda'; +import { prismaClient } from '../../../../../common/database/prisma.lambda.service'; +import { safeHandler } from '../../../../../common/utils/handlers/safeHandler'; +import ApiError from '../../../../../common/utils/helper/ApiError'; +import { HostService } from '../../../services/host.service'; + +const hostService = new HostService(prismaClient); + +/** + * Get latest active agreement for a specific host by hostXid. + * Accessible for Minglar Admin / Host Admin using admin-host token. + */ +export const handler = safeHandler(async ( + event: APIGatewayProxyEvent, + context?: Context, +): Promise => { + const token = event.headers['x-auth-token'] || event.headers['X-Auth-Token']; + if (!token) { + throw new ApiError(400, 'This is a protected route. Please provide a valid token.'); + } + + // Validate admin/host admin token + await verifyMinglarAdminHostToken(token); + + const hostXidParam = + event.queryStringParameters?.hostXid ?? event.queryStringParameters?.host_xid; + + const hostXid = Number(hostXidParam); + + if (!hostXidParam) { + throw new ApiError(400, 'hostXid is required'); + } + + if (Number.isNaN(hostXid)) { + throw new ApiError(400, 'Invalid hostXid format'); + } + + const agreement = await hostService.getLatestHostAgreement(hostXid); + + return { + statusCode: 200, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + }, + body: JSON.stringify({ + success: true, + message: 'Latest host agreement retrieved successfully', + data: agreement, + }), + }; +}); + diff --git a/src/modules/host/services/host.service.ts b/src/modules/host/services/host.service.ts index c13b212..0f29883 100644 --- a/src/modules/host/services/host.service.ts +++ b/src/modules/host/services/host.service.ts @@ -970,6 +970,47 @@ export class HostService { }); } + /** + * Get the latest (active) agreement for a specific host by hostXid. + */ + async getLatestHostAgreement(hostXid: number) { + if (!hostXid || Number.isNaN(hostXid)) { + throw new ApiError(400, 'Valid hostXid is required'); + } + + const agreement = await this.prisma.hostAgreement.findFirst({ + where: { hostXid, isActive: true }, + orderBy: { createdAt: 'desc' }, + select: { + id: true, + hostXid: true, + filePath: true, + versionNumber: true, + createdAt: true, + updatedAt: true, + }, + }); + + if (!agreement) { + throw new ApiError(404, 'No active agreement found for this host'); + } + + const filePath = agreement.filePath; + + // If full URL is saved, extract only S3 key part + const key = filePath.startsWith('http') + ? filePath.split('.com/')[1] + : filePath; + + const bucket = config.aws.bucketName; + const presignedUrl = await getPresignedUrl(bucket, key); + + return { + ...agreement, + presignedUrl, + }; + } + async getPQQQuestionDetail(question_xid: number, activity_xid: number) { const detailsOfQuestion = await this.prisma.activityPQQheader.findFirst({ where: {