Browse Source

done audio chat

unknown 2 years ago
parent
commit
49e93eee2d

+ 14 - 18
app.js

@@ -4,37 +4,33 @@ const logger = require('morgan');
 const cors = require('cors');
 const helmet = require('helmet');
 const apiLimiter = require('./helpers/apiLimiter');
-
 const chatsRouter = require('./routes/chats');
 const messagesRouter = require('./routes/messages');
 const contactsRouter = require('./routes/contacts');
 const userRoute = require('./routes/user');
 const app = express();
-
-const FOLDER_IMAGES = process.env.DIR_IMAGES;
-const FOLDER_NOTIFICATIONS = process.env.DIR_NOTIFICATIONS;
-
+const DIR_IMAGES = process.env.DIR_IMAGES;
+const DIR_AUDIOS = process.env.DIR_AUDIOS;
+const DIR_VIDEOS = process.env.DIR_VIDEOS;
+const DIR_FILES = process.env.DIR_FILES;
+const DIR_NOTIFICATIONS = process.env.DIR_NOTIFICATIONS;
 const formatsLogger = app.get('env') === 'development' ? 'dev' : 'short';
-
 app.use(helmet());
 app.use(logger(formatsLogger));
 app.use(cors());
 app.use(express.json());
-
-app.use(express.static(path.join(__dirname, FOLDER_IMAGES)));
-app.use(express.static(path.join(__dirname, FOLDER_NOTIFICATIONS)));
-
+app.use(express.static(path.join(__dirname, DIR_IMAGES)));
+app.use(express.static(path.join(__dirname, DIR_AUDIOS)));
+app.use(express.static(path.join(__dirname, DIR_VIDEOS)));
+app.use(express.static(path.join(__dirname, DIR_FILES)));
+app.use(express.static(path.join(__dirname, DIR_NOTIFICATIONS)));
 app.use('/api/chats', apiLimiter, chatsRouter);
 app.use('/api/messages', apiLimiter, messagesRouter);
 app.use('/api/contacts', apiLimiter, contactsRouter);
 app.use('/api', apiLimiter, userRoute);
-
-app.use((_req, res) => {
-	res.status(404).json({ message: 'Not found' });
-});
-
-app.use((err, _req, res, _next) => {
-	res.status(500).json({ message: err.message });
-});
+app.use((_req, res) => res.status(404).json({ message: 'Not found' }));
+app.use((err, _req, res, _next) =>
+	res.status(500).json({ message: err.message })
+);
 
 module.exports = app;

BIN
audios/62275dbc1f60894d30cce0c9/send.mp3


BIN
audios/62275dbc1f60894d30cce0c9/song.mp3


BIN
audios/62275e151f60894d30cce0ca/send(1).mp3


+ 158 - 2
controllers/messages.js

@@ -86,7 +86,7 @@ const sentMessage = async (req, res, next) => {
 	}
 };
 
-const imgMessage = async (req, res, next) => {
+const imageMessage = async (req, res, next) => {
 	try {
 		const userId = req.user.id;
 		const id = req.params.companionId;
@@ -138,9 +138,165 @@ const imgMessage = async (req, res, next) => {
 	}
 };
 
+const audioMessage = async (req, res, next) => {
+	try {
+		const userId = req.user.id;
+		const id = req.params.companionId;
+		const isChat = await ChatModel.getByField(id, userId);
+		const isCompanionChat = await ChatModel.getByField(userId, id);
+		const DIR_AUDIOS = process.env.DIR_AUDIOS;
+		const pathToFile = req.file.path;
+		const newNameAudio = req.file.originalname;
+		await createFolderIsExist(path.join(DIR_AUDIOS, userId));
+		await fs.rename(pathToFile, path.join(DIR_AUDIOS, userId, newNameAudio));
+		const audioUrl = path.normalize(path.join(userId, newNameAudio));
+		if (isChat && isCompanionChat && audioUrl) {
+			const { name, lastName, avatarUrl, color, number } = req.user;
+			const newMessage = await MessageModel.add({
+				message: audioUrl,
+				name,
+				lastName,
+				avatarUrl,
+				color,
+				number,
+				type: 'audio',
+				companionId: id,
+				owner: userId,
+			});
+			await MessageModel.add({
+				message: audioUrl,
+				name,
+				lastName,
+				avatarUrl,
+				color,
+				number,
+				type: 'audio',
+				companionId: userId,
+				owner: id,
+			});
+			const { total } = await MessageModel.getList(userId, {});
+			await ChatModel.update(isChat._id, { total, seen: total });
+			const { total: Total } = await MessageModel.getList(id, {});
+			await ChatModel.update(isCompanionChat._id, { total: Total });
+			return res.status(201).json({
+				status: 'success',
+				code: 201,
+				data: newMessage,
+			});
+		}
+	} catch (e) {
+		next(e);
+	}
+};
+
+const videoMessage = async (req, res, next) => {
+	try {
+		const userId = req.user.id;
+		const id = req.params.companionId;
+		const isChat = await ChatModel.getByField(id, userId);
+		const isCompanionChat = await ChatModel.getByField(userId, id);
+		const DIR_VIDEOS = process.env.DIR_VIDEOS;
+		const pathToFile = req.file.path;
+		const newNameVideo = req.file.originalname;
+		await createFolderIsExist(path.join(DIR_VIDEOS, userId));
+		await fs.rename(pathToFile, path.join(DIR_VIDEOS, userId, newNameVideo));
+		const videoUrl = path.normalize(path.join(userId, newNameVideo));
+		if (isChat && isCompanionChat && videoUrl) {
+			const { name, lastName, avatarUrl, color, number } = req.user;
+			const newMessage = await MessageModel.add({
+				message: videoUrl,
+				name,
+				lastName,
+				avatarUrl,
+				color,
+				number,
+				type: 'video',
+				companionId: id,
+				owner: userId,
+			});
+			await MessageModel.add({
+				message: videoUrl,
+				name,
+				lastName,
+				avatarUrl,
+				color,
+				number,
+				type: 'video',
+				companionId: userId,
+				owner: id,
+			});
+			const { total } = await MessageModel.getList(userId, {});
+			await ChatModel.update(isChat._id, { total, seen: total });
+			const { total: Total } = await MessageModel.getList(id, {});
+			await ChatModel.update(isCompanionChat._id, { total: Total });
+			return res.status(201).json({
+				status: 'success',
+				code: 201,
+				data: newMessage,
+			});
+		}
+	} catch (e) {
+		next(e);
+	}
+};
+
+const fileMessage = async (req, res, next) => {
+	try {
+		const userId = req.user.id;
+		const id = req.params.companionId;
+		const isChat = await ChatModel.getByField(id, userId);
+		const isCompanionChat = await ChatModel.getByField(userId, id);
+		const DIR_FILES = process.env.DIR_FILES;
+		const pathToFile = req.file.path;
+		const newNameFile = req.file.originalname;
+		await createFolderIsExist(path.join(DIR_FILES, userId));
+		await fs.rename(pathToFile, path.join(DIR_FILES, userId, newNameFile));
+		const fileUrl = path.normalize(path.join(userId, newNameFile));
+		if (isChat && isCompanionChat && fileUrl) {
+			const { name, lastName, avatarUrl, color, number } = req.user;
+			const newMessage = await MessageModel.add({
+				message: fileUrl,
+				name,
+				lastName,
+				avatarUrl,
+				color,
+				number,
+				type: 'file',
+				companionId: id,
+				owner: userId,
+			});
+			await MessageModel.add({
+				message: fileUrl,
+				name,
+				lastName,
+				avatarUrl,
+				color,
+				number,
+				type: 'file',
+				companionId: userId,
+				owner: id,
+			});
+			const { total } = await MessageModel.getList(userId, {});
+			await ChatModel.update(isChat._id, { total, seen: total });
+			const { total: Total } = await MessageModel.getList(id, {});
+			await ChatModel.update(isCompanionChat._id, { total: Total });
+			return res.status(201).json({
+				status: 'success',
+				code: 201,
+				data: newMessage,
+			});
+		}
+	} catch (e) {
+		next(e);
+	}
+};
+
 module.exports = {
 	listMessages,
 	listMessagesById,
 	sentMessage,
-	imgMessage,
+	imageMessage,
+	audioMessage,
+	videoMessage,
+	fileMessage,
 };

+ 31 - 5
helpers/upload.js

@@ -12,14 +12,40 @@ const storage = multer.diskStorage({
 	},
 });
 
-const uploadImg = multer({
+const uploadImage = multer({
 	storage: storage,
-	limits: { fileSize: 2000000 },
+	limits: { fileSize: 8000000 },
 	fileFilter: (_req, file, cb) => {
-		if (file.mimetype === 'image/png' || file.mimetype === 'image/jpeg')
-			return cb(null, true);
+		if (file.mimetype.includes('image')) return cb(null, true);
 		cb(null, false);
 	},
 });
 
-module.exports = { uploadImg };
+const uploadAudio = multer({
+	storage: storage,
+	limits: { fileSize: 20000000 },
+	fileFilter: (_req, file, cb) => {
+		if (file.mimetype.includes('audio')) return cb(null, true);
+		cb(null, false);
+	},
+});
+
+const uploadVideo = multer({
+	storage: storage,
+	limits: { fileSize: 200000000 },
+	fileFilter: (_req, file, cb) => {
+		if (file.mimetype.includes('video')) return cb(null, true);
+		cb(null, false);
+	},
+});
+
+const uploadFile = multer({
+	storage: storage,
+	limits: { fileSize: 200000000 },
+	fileFilter: (_req, file, cb) => {
+		if (file.mimetype.includes('application')) return cb(null, true);
+		cb(null, false);
+	},
+});
+
+module.exports = { uploadImage, uploadAudio, uploadVideo, uploadFile };

BIN
images/62275dbc1f60894d30cce0c9/NicePng_face-clipart-png_3622337(1).png


BIN
images/62275dbc1f60894d30cce0c9/clipart289625.png


BIN
images/62275dbc1f60894d30cce0c9/qrcode_telegram.png


BIN
images/62275dbc1f60894d30cce0c9/telegram.png


BIN
images/62275dbc1f60894d30cce0c9/путин.jpeg


BIN
images/62275e151f60894d30cce0ca/monkey.png


BIN
images/62275e151f60894d30cce0ca/путин.jpeg


BIN
notifications/song.mp3


+ 18 - 3
routes/messages.js

@@ -9,9 +9,24 @@ router
 	.get('/', guard, controllers.listMessages)
 	.post('/', guard, validation.sentMessage, controllers.sentMessage)
 	.post(
-		'/img/:companionId',
-		[guard, upload.uploadImg.single('img'), validation.validateUploadFile],
-		controllers.imgMessage
+		'/image/:companionId',
+		[guard, upload.uploadImage.single('image'), validation.validateUploadFile],
+		controllers.imageMessage
+	)
+	.post(
+		'/audio/:companionId',
+		[guard, upload.uploadAudio.single('audio'), validation.validateUploadFile],
+		controllers.audioMessage
+	)
+	.post(
+		'/video/:companionId',
+		[guard, upload.uploadVideo.single('video'), validation.validateUploadFile],
+		controllers.videoMessage
+	)
+	.post(
+		'/file/:companionId',
+		[guard, upload.uploadFile.single('file'), validation.validateUploadFile],
+		controllers.fileMessage
 	);
 
 router.get('/:companionId', guard, controllers.listMessagesById);

+ 1 - 1
routes/user.js

@@ -18,7 +18,7 @@ router
 	.get('/users/current', guard, controllers.getCurrent)
 	.patch(
 		'/users/avatars',
-		[guard, upload.uploadImg.single('avatar'), validation.validateUploadFile],
+		[guard, upload.uploadImage.single('avatar'), validation.validateUploadFile],
 		controllers.updateAvatar
 	);
 module.exports = router;

BIN
uploads/song.mp3