diff --git a/serverless/functions/user.yml b/serverless/functions/user.yml index d26ee52..5f1cd49 100644 --- a/serverless/functions/user.yml +++ b/serverless/functions/user.yml @@ -288,6 +288,21 @@ getActivityFromConnectionsInterest: path: /connections/get-activity-from-connections-interest method: get +searchConnectionPeople: + handler: src/modules/user/handlers/connections/searchConnectionPeople.handler + memorySize: 384 + package: + patterns: + - 'src/modules/user/handlers/connections/**' + - ${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: /connections/search-connection-people + method: get + viewMoreActivitiesByInterest: handler: src/modules/user/handlers/activities/viewMoreActivities.handler memorySize: 384 diff --git a/src/modules/user/handlers/connections/searchConnectionPeople.ts b/src/modules/user/handlers/connections/searchConnectionPeople.ts new file mode 100644 index 0000000..a6abba7 --- /dev/null +++ b/src/modules/user/handlers/connections/searchConnectionPeople.ts @@ -0,0 +1,44 @@ +import { APIGatewayProxyEvent, APIGatewayProxyResult, Context } from 'aws-lambda'; +import { safeHandler } from '../../../../common/utils/handlers/safeHandler'; +import { prismaClient } from '../../../../common/database/prisma.lambda.service'; +import ApiError from '../../../../common/utils/helper/ApiError'; +import { UserService } from '../../services/user.service'; +import { verifyUserToken } from '../../../../common/middlewares/jwt/authForUser'; + +const userService = new UserService(prismaClient); + +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.', + ); + } + + const userInfo = await verifyUserToken(token); + const userId = Number(userInfo.id); + + if (!userId || isNaN(userId)) { + throw new ApiError(400, 'Invalid user ID'); + } + + const searchQuery = event.queryStringParameters?.searchQuery ?? ''; + const result = await userService.searchConnectionPeople(userId, searchQuery); + + return { + statusCode: 200, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + }, + body: JSON.stringify({ + success: true, + message: 'Connection people retrieved successfully', + data: result, + }), + }; +}); diff --git a/src/modules/user/services/user.service.ts b/src/modules/user/services/user.service.ts index f169ffb..745606b 100644 --- a/src/modules/user/services/user.service.ts +++ b/src/modules/user/services/user.service.ts @@ -2863,6 +2863,111 @@ export class UserService { }); } + async searchConnectionPeople(userXid: number, searchQuery?: string) { + const userConnectionDetails = await this.prisma.connectDetails.findMany({ + where: { + userXid, + isActive: true, + deletedAt: null, + }, + select: { + schoolCompanyXid: true, + }, + }); + + const schoolCompanyXids = [ + ...new Set(userConnectionDetails.map((item) => item.schoolCompanyXid)), + ]; + + if (!schoolCompanyXids.length) { + return { + count: 0, + people: [], + }; + } + + const trimmedSearchQuery = searchQuery?.trim() ?? ''; + + const connectionPeople = await this.prisma.connectDetails.findMany({ + where: { + isActive: true, + deletedAt: null, + schoolCompanyXid: { in: schoolCompanyXids }, + userXid: { not: userXid }, + user: { + isActive: true, + deletedAt: null, + ...(trimmedSearchQuery + ? { + OR: [ + { + firstName: { + contains: trimmedSearchQuery, + mode: 'insensitive', + }, + }, + { + lastName: { + contains: trimmedSearchQuery, + mode: 'insensitive', + }, + }, + ], + } + : {}), + }, + }, + distinct: ['userXid'], + orderBy: { + createdAt: 'desc', + }, + take: 10, + select: { + userXid: true, + schoolCompany: { + select: { + id: true, + schoolCompanyName: true, + isSchool: true, + }, + }, + user: { + select: { + id: true, + firstName: true, + lastName: true, + profileImage: true, + }, + }, + }, + }); + + const people = await Promise.all( + connectionPeople.map(async (item) => { + const firstName = item.user.firstName?.trim() ?? ''; + const lastName = item.user.lastName?.trim() ?? ''; + const fullName = `${firstName} ${lastName}`.trim(); + + return { + userXid: item.user.id, + fullName, + firstName: item.user.firstName, + lastName: item.user.lastName, + profileImage: item.user.profileImage, + profileImagePresignedUrl: await attachPresignedUrl( + item.user.profileImage, + ), + schoolCompany: item.schoolCompany, + }; + }), + ); + + return { + count: people.length, + people, + }; + } + async searchSchoolsAndCompanies(searchQuery: string, isSchool: boolean) { if (!searchQuery) { throw new ApiError( @@ -4322,4 +4427,4 @@ export class UserService { oneDay, }; } -} \ No newline at end of file +}