From 5ca8ca266a47d6ce5ece4a3b254f335bb570e533 Mon Sep 17 00:00:00 2001 From: paritosh18 Date: Mon, 2 Feb 2026 14:50:23 +0530 Subject: [PATCH] feat: add setUserInterests functionality to manage user interests --- serverless/functions/user.yml | 15 +++++ .../authentication/SetuserInterest.ts | 64 +++++++++++++++++++ src/modules/user/services/user.service.ts | 18 ++++++ 3 files changed, 97 insertions(+) create mode 100644 src/modules/user/handlers/authentication/SetuserInterest.ts diff --git a/serverless/functions/user.yml b/serverless/functions/user.yml index 958d7cc..ec5a4a7 100644 --- a/serverless/functions/user.yml +++ b/serverless/functions/user.yml @@ -60,4 +60,19 @@ setPasscodeForMobile: events: - httpApi: path: /user/set-passcode + method: post + +setUserInterest: + handler: src/modules/user/handlers/authentication/SetuserInterest.handler + memorySize: 384 + package: + patterns: + - 'src/modules/user/**' + - ${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: /user/set-interests method: post \ No newline at end of file diff --git a/src/modules/user/handlers/authentication/SetuserInterest.ts b/src/modules/user/handlers/authentication/SetuserInterest.ts new file mode 100644 index 0000000..be6cf17 --- /dev/null +++ b/src/modules/user/handlers/authentication/SetuserInterest.ts @@ -0,0 +1,64 @@ +import { APIGatewayProxyEvent, APIGatewayProxyResult, Context } from 'aws-lambda'; +import { prismaClient } from '../../../../common/database/prisma.lambda.service'; +import { verifyUserToken } from '../../../../common/middlewares/jwt/authForUser'; +import { safeHandler } from '../../../../common/utils/handlers/safeHandler'; +import ApiError from '../../../../common/utils/helper/ApiError'; +import { UserService } from '../../services/user.service'; + +const userService = new UserService(prismaClient); + +export const handler = safeHandler(async ( + event: APIGatewayProxyEvent, + context?: Context +): Promise => { + // Extract token from headers + 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.'); + } + + // Authenticate user using verifyUserToken + const userInfo = await verifyUserToken(token); + const userId = userInfo.id; + + if (Number.isNaN(userId)) { + throw new ApiError(400, 'User id must be a number'); + } + + const user = await userService.getUserById(userId); + if (!user) { + throw new ApiError(404, 'User not found'); + } + + // Parse request body + let body: { interest_Xid?: number[]; }; + + try { + body = event.body ? JSON.parse(event.body) : {}; + } catch (error) { + throw new ApiError(400, 'Invalid JSON in request body'); + } + + const { interest_Xid } = body; + + // Validate required fields + if (!interest_Xid || !Array.isArray(interest_Xid)) { + throw new ApiError(400, 'interest_Xid must be a non-empty array of numbers'); + } + + + // Set the interests + await userService.setUserInterests(userId, interest_Xid); + + return { + statusCode: 200, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + }, + body: JSON.stringify({ + success: true, + message: 'Interests set successfully', + }), + }; +}); \ No newline at end of file diff --git a/src/modules/user/services/user.service.ts b/src/modules/user/services/user.service.ts index b38de5d..5ce217c 100644 --- a/src/modules/user/services/user.service.ts +++ b/src/modules/user/services/user.service.ts @@ -121,4 +121,22 @@ export class UserService { return updatedUser; } + + async setUserInterests(userId: number, interest_Xid: number[]): Promise { + // Remove existing interests + await this.prisma.userInterests.deleteMany({ + where: { userXid: userId }, + }); + + // Add new interests + const interestRecords = interest_Xid.map((interestId) => ({ + userXid: userId, + interestXid: interestId, + })); + + await this.prisma.userInterests.createMany({ + data: interestRecords, + }); + } + } \ No newline at end of file