implement chat functionality for users and hosts with message sending and retrieval
This commit is contained in:
77
src/modules/host/handlers/chat/getMessages.ts
Normal file
77
src/modules/host/handlers/chat/getMessages.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
import {
|
||||
APIGatewayProxyEvent,
|
||||
APIGatewayProxyResult,
|
||||
Context,
|
||||
} from 'aws-lambda';
|
||||
import { prismaClient } from '../../../../common/database/prisma.lambda.service';
|
||||
import { verifyHostToken } from '../../../../common/middlewares/jwt/authForHost';
|
||||
import { ChatService } from '../../../../common/services/chat.service';
|
||||
import { safeHandler } from '../../../../common/utils/handlers/safeHandler';
|
||||
import ApiError from '../../../../common/utils/helper/ApiError';
|
||||
|
||||
const chatService = new ChatService(prismaClient);
|
||||
|
||||
export const handler = safeHandler(
|
||||
async (
|
||||
event: APIGatewayProxyEvent,
|
||||
context?: Context
|
||||
): Promise<APIGatewayProxyResult> => {
|
||||
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 verifyHostToken(token);
|
||||
const hostUserId = Number(userInfo.id);
|
||||
|
||||
if (!hostUserId || isNaN(hostUserId)) {
|
||||
throw new ApiError(400, 'Invalid host user ID');
|
||||
}
|
||||
|
||||
const activityXidParam =
|
||||
event.queryStringParameters?.activityXid ||
|
||||
event.queryStringParameters?.activity_xid;
|
||||
const otherUserXidParam =
|
||||
event.queryStringParameters?.otherUserXid ||
|
||||
event.queryStringParameters?.other_user_xid ||
|
||||
event.queryStringParameters?.userXid ||
|
||||
event.queryStringParameters?.user_xid;
|
||||
const limitParam = event.queryStringParameters?.limit;
|
||||
|
||||
const activityXid = Number(activityXidParam);
|
||||
const otherUserXid = Number(otherUserXidParam);
|
||||
const limit = limitParam ? Number(limitParam) : undefined;
|
||||
|
||||
if (!activityXid || isNaN(activityXid)) {
|
||||
throw new ApiError(400, 'Valid activityXid is required');
|
||||
}
|
||||
|
||||
if (!otherUserXid || isNaN(otherUserXid)) {
|
||||
throw new ApiError(400, 'Valid otherUserXid is required');
|
||||
}
|
||||
|
||||
const messages = await chatService.getMessages({
|
||||
activityXid,
|
||||
userXid: hostUserId,
|
||||
otherUserXid,
|
||||
limit,
|
||||
});
|
||||
|
||||
return {
|
||||
statusCode: 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
success: true,
|
||||
message: 'Messages retrieved successfully',
|
||||
data: messages,
|
||||
}),
|
||||
};
|
||||
}
|
||||
);
|
||||
78
src/modules/host/handlers/chat/sendMessage.ts
Normal file
78
src/modules/host/handlers/chat/sendMessage.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
import {
|
||||
APIGatewayProxyEvent,
|
||||
APIGatewayProxyResult,
|
||||
Context,
|
||||
} from 'aws-lambda';
|
||||
import { prismaClient } from '../../../../common/database/prisma.lambda.service';
|
||||
import { verifyHostToken } from '../../../../common/middlewares/jwt/authForHost';
|
||||
import { ChatService } from '../../../../common/services/chat.service';
|
||||
import { safeHandler } from '../../../../common/utils/handlers/safeHandler';
|
||||
import ApiError from '../../../../common/utils/helper/ApiError';
|
||||
|
||||
const chatService = new ChatService(prismaClient);
|
||||
|
||||
export const handler = safeHandler(
|
||||
async (
|
||||
event: APIGatewayProxyEvent,
|
||||
context?: Context
|
||||
): Promise<APIGatewayProxyResult> => {
|
||||
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 verifyHostToken(token);
|
||||
const hostUserId = Number(userInfo.id);
|
||||
|
||||
if (!hostUserId || isNaN(hostUserId)) {
|
||||
throw new ApiError(400, 'Invalid host user ID');
|
||||
}
|
||||
|
||||
let body: any;
|
||||
try {
|
||||
body = JSON.parse(event.body || '{}');
|
||||
} catch {
|
||||
throw new ApiError(400, 'Invalid JSON in request body');
|
||||
}
|
||||
|
||||
const activityXid = Number(body.activityXid ?? body.activity_xid);
|
||||
const receiverXid = Number(
|
||||
body.receiverXid ?? body.receivedXid ?? body.received_xid
|
||||
);
|
||||
const message = body.message;
|
||||
const status = body.status;
|
||||
|
||||
if (!activityXid || isNaN(activityXid)) {
|
||||
throw new ApiError(400, 'Valid activityXid is required');
|
||||
}
|
||||
|
||||
if (!receiverXid || isNaN(receiverXid)) {
|
||||
throw new ApiError(400, 'Valid receiverXid is required');
|
||||
}
|
||||
|
||||
const result = await chatService.sendMessage({
|
||||
activityXid,
|
||||
senderXid: hostUserId,
|
||||
receiverXid,
|
||||
message,
|
||||
status,
|
||||
});
|
||||
|
||||
return {
|
||||
statusCode: 201,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
success: true,
|
||||
message: 'Message sent successfully',
|
||||
data: result,
|
||||
}),
|
||||
};
|
||||
}
|
||||
);
|
||||
77
src/modules/user/handlers/chat/getMessages.ts
Normal file
77
src/modules/user/handlers/chat/getMessages.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
import {
|
||||
APIGatewayProxyEvent,
|
||||
APIGatewayProxyResult,
|
||||
Context,
|
||||
} from 'aws-lambda';
|
||||
import { prismaClient } from '../../../../common/database/prisma.lambda.service';
|
||||
import { verifyUserToken } from '../../../../common/middlewares/jwt/authForUser';
|
||||
import { ChatService } from '../../../../common/services/chat.service';
|
||||
import { safeHandler } from '../../../../common/utils/handlers/safeHandler';
|
||||
import ApiError from '../../../../common/utils/helper/ApiError';
|
||||
|
||||
const chatService = new ChatService(prismaClient);
|
||||
|
||||
export const handler = safeHandler(
|
||||
async (
|
||||
event: APIGatewayProxyEvent,
|
||||
context?: Context
|
||||
): Promise<APIGatewayProxyResult> => {
|
||||
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 activityXidParam =
|
||||
event.queryStringParameters?.activityXid ||
|
||||
event.queryStringParameters?.activity_xid;
|
||||
const otherUserXidParam =
|
||||
event.queryStringParameters?.otherUserXid ||
|
||||
event.queryStringParameters?.other_user_xid ||
|
||||
event.queryStringParameters?.userXid ||
|
||||
event.queryStringParameters?.user_xid;
|
||||
const limitParam = event.queryStringParameters?.limit;
|
||||
|
||||
const activityXid = Number(activityXidParam);
|
||||
const otherUserXid = Number(otherUserXidParam);
|
||||
const limit = limitParam ? Number(limitParam) : undefined;
|
||||
|
||||
if (!activityXid || isNaN(activityXid)) {
|
||||
throw new ApiError(400, 'Valid activityXid is required');
|
||||
}
|
||||
|
||||
if (!otherUserXid || isNaN(otherUserXid)) {
|
||||
throw new ApiError(400, 'Valid otherUserXid is required');
|
||||
}
|
||||
|
||||
const messages = await chatService.getMessages({
|
||||
activityXid,
|
||||
userXid: userId,
|
||||
otherUserXid,
|
||||
limit,
|
||||
});
|
||||
|
||||
return {
|
||||
statusCode: 200,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
success: true,
|
||||
message: 'Messages retrieved successfully',
|
||||
data: messages,
|
||||
}),
|
||||
};
|
||||
}
|
||||
);
|
||||
78
src/modules/user/handlers/chat/sendMessage.ts
Normal file
78
src/modules/user/handlers/chat/sendMessage.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
import {
|
||||
APIGatewayProxyEvent,
|
||||
APIGatewayProxyResult,
|
||||
Context,
|
||||
} from 'aws-lambda';
|
||||
import { prismaClient } from '../../../../common/database/prisma.lambda.service';
|
||||
import { verifyUserToken } from '../../../../common/middlewares/jwt/authForUser';
|
||||
import { ChatService } from '../../../../common/services/chat.service';
|
||||
import { safeHandler } from '../../../../common/utils/handlers/safeHandler';
|
||||
import ApiError from '../../../../common/utils/helper/ApiError';
|
||||
|
||||
const chatService = new ChatService(prismaClient);
|
||||
|
||||
export const handler = safeHandler(
|
||||
async (
|
||||
event: APIGatewayProxyEvent,
|
||||
context?: Context
|
||||
): Promise<APIGatewayProxyResult> => {
|
||||
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');
|
||||
}
|
||||
|
||||
let body: any;
|
||||
try {
|
||||
body = JSON.parse(event.body || '{}');
|
||||
} catch {
|
||||
throw new ApiError(400, 'Invalid JSON in request body');
|
||||
}
|
||||
|
||||
const activityXid = Number(body.activityXid ?? body.activity_xid);
|
||||
const receiverXid = Number(
|
||||
body.receiverXid ?? body.receivedXid ?? body.received_xid
|
||||
);
|
||||
const message = body.message;
|
||||
const status = body.status;
|
||||
|
||||
if (!activityXid || isNaN(activityXid)) {
|
||||
throw new ApiError(400, 'Valid activityXid is required');
|
||||
}
|
||||
|
||||
if (!receiverXid || isNaN(receiverXid)) {
|
||||
throw new ApiError(400, 'Valid receiverXid is required');
|
||||
}
|
||||
|
||||
const result = await chatService.sendMessage({
|
||||
activityXid,
|
||||
senderXid: userId,
|
||||
receiverXid,
|
||||
message,
|
||||
status,
|
||||
});
|
||||
|
||||
return {
|
||||
statusCode: 201,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
success: true,
|
||||
message: 'Message sent successfully',
|
||||
data: result,
|
||||
}),
|
||||
};
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user