Browse Source

almost finshed reply message

unknown 1 year ago
parent
commit
cf811e6e9d
5 changed files with 135 additions and 4 deletions
  1. 97 0
      controllers/messages.js
  2. 10 0
      model/message.js
  3. 12 4
      model/schemas/message.js
  4. 6 0
      routes/messages.js
  5. 10 0
      validation/message.js

+ 97 - 0
controllers/messages.js

@@ -296,6 +296,102 @@ const sentMessage = async (req, res, next) => {
 	}
 };
 
+const sentMessageReply = async (req, res, next) => {
+	try {
+		const { id, newMessage, newCaption } = req.body;
+		const idTime = Math.round(Date.now() / 1000);
+		const userId = req.user.id;
+		const number = req.user.number;
+		const userMessage = await MessageModel.getById(id, userId);
+		const companionMessage = await MessageModel.findByFields(
+			userId,
+			userMessage.idTime,
+			userMessage.companionId
+		);
+		const isChat = await ChatModel.getByField(userMessage.companionId, userId);
+		const isCompanionChat = await ChatModel.getByField(
+			userId,
+			userMessage.companionId
+		);
+		if (isChat && isCompanionChat && userMessage && companionMessage) {
+			const {
+				message,
+				name,
+				lastName,
+				avatarUrl,
+				color,
+				caption,
+				fullType,
+				newMessage: oldMessage,
+				newCaption: oldCaption,
+			} = userMessage;
+			const sentMessage = await MessageModel.add({
+				message: oldMessage ? oldMessage : message,
+				newMessage,
+				name,
+				lastName,
+				avatarUrl,
+				color,
+				number,
+				type: 'text',
+				fullType,
+				caption: oldCaption ? oldCaption : caption,
+				newCaption,
+				idTime,
+				oldId: id,
+				companionIdFlow: userId,
+				companionId: userMessage.companionId,
+				owner: userId,
+			});
+			await MessageModel.add({
+				message,
+				newMessage,
+				name,
+				lastName,
+				avatarUrl,
+				color,
+				number,
+				type: 'text',
+				fullType,
+				caption,
+				newCaption,
+				idTime,
+				oldId: companionMessage._id,
+				companionIdFlow: userId,
+				companionId: userId,
+				owner: userMessage.companionId,
+			});
+			const { total } = await MessageModel.getList(
+				{ owner: userId, companionId: userMessage.companionId },
+				{}
+			);
+			await ChatModel.update(isChat._id, userId, {
+				total,
+				seen: total,
+				watched: false,
+				lastMessage: newMessage,
+				lastMessageCreatedAt: sentMessage.createdAt,
+			});
+			const { total: Total } = await MessageModel.getList(
+				{ owner: userMessage.companionId, companionId: userId },
+				{}
+			);
+			await ChatModel.update(isCompanionChat._id, userMessage.companionId, {
+				total: Total,
+				lastMessage: newMessage,
+				lastMessageCreatedAt: sentMessage.createdAt,
+			});
+			return res.status(201).json({
+				status: 'success',
+				code: 201,
+				data: sentMessage,
+			});
+		}
+	} catch (e) {
+		next(e);
+	}
+};
+
 const imageMessage = async (req, res, next) => {
 	try {
 		const userId = req.user.id;
@@ -661,6 +757,7 @@ module.exports = {
 	unpinAllMessage,
 	listMessagesById,
 	sentMessage,
+	sentMessageReply,
 	imageMessage,
 	audioMessage,
 	videoMessage,

+ 10 - 0
model/message.js

@@ -69,6 +69,15 @@ const findByFieldsAndUpdate = async (companionId, idTime, userId, body) => {
 	return message;
 };
 
+const findByFields = async (companionId, idTime, userId) => {
+	const message = await Message.findOne({
+		companionId,
+		idTime,
+		owner: userId,
+	});
+	return message;
+};
+
 const removeAll = async (companionId, userId) => {
 	const removedAllMessages = await Message.deleteMany({
 		companionId,
@@ -103,6 +112,7 @@ module.exports = {
 	remove,
 	removeByFields,
 	findByFieldsAndUpdate,
+	findByFields,
 	removeAll,
 	updateCompanionsMessages,
 	updateOwnerMessages,

+ 12 - 4
model/schemas/message.js

@@ -10,6 +10,10 @@ const messageSchema = new Schema(
 			type: String,
 			default: null,
 		},
+		newMessage: {
+			type: String,
+			default: null,
+		},
 		companionId: {
 			type: String,
 			default: null,
@@ -50,10 +54,18 @@ const messageSchema = new Schema(
 			type: String,
 			default: null,
 		},
+		oldId: {
+			type: String,
+			default: null,
+		},
 		caption: {
 			type: String,
 			default: null,
 		},
+		newCaption: {
+			type: String,
+			default: null,
+		},
 		emoji: {
 			type: String,
 			default: null,
@@ -66,10 +78,6 @@ const messageSchema = new Schema(
 			type: Boolean,
 			default: false,
 		},
-		reply: {
-			type: Boolean,
-			default: false,
-		},
 		owner: {
 			type: SchemaTypes.ObjectId,
 			ref: 'user',

+ 6 - 0
routes/messages.js

@@ -8,6 +8,12 @@ const upload = require('../helpers/upload');
 router
 	.get('/', guard, controllers.listMessages)
 	.post('/', guard, validation.sentMessage, controllers.sentMessage)
+	.post(
+		'/reply/',
+		guard,
+		validation.sentMessageReply,
+		controllers.sentMessageReply
+	)
 	.patch(
 		'/selected/',
 		guard,

+ 10 - 0
validation/message.js

@@ -8,6 +8,12 @@ const schemaSentMessage = Joi.object({
 	caption: Joi.any().optional(),
 });
 
+const schemaSentMessageReply = Joi.object({
+	id: Joi.string().required(),
+	newMessage: Joi.string().min(1).max(1400).required(),
+	newCaption: Joi.any().optional(),
+});
+
 const schemaRemoveSelected = Joi.object({
 	companionId: Joi.string().required(),
 	selectedArr: Joi.array().items(Joi.string().min(5).max(50)).required(),
@@ -21,6 +27,10 @@ module.exports.sentMessage = (req, _res, next) => {
 	return validate(schemaSentMessage, req.body, next);
 };
 
+module.exports.sentMessageReply = (req, _res, next) => {
+	return validate(schemaSentMessageReply, req.body, next);
+};
+
 module.exports.removeSelected = (req, _res, next) => {
 	return validate(schemaRemoveSelected, req.body, next);
 };