diff --git a/server/scripts/seed-data/role.js b/server/scripts/seed-data/role.js index 88c5025..cd61646 100644 --- a/server/scripts/seed-data/role.js +++ b/server/scripts/seed-data/role.js @@ -1,5 +1,6 @@ const { faker } = require('@faker-js/faker'); const { MongoManager } = require('../../src/modules/db/mongo'); +const logger = require('../../src/logger'); const getFakeRolesData = (x) => { const roles = [] @@ -27,7 +28,7 @@ const seedData = async () => { let i = 0; for await (const role of roles) { const result = await insert(role); - console.log(`${index} - ${i++}`, '\t', result.insertedId); + logger.info(`${index} - ${i++}`, '\t', result.insertedId); } } }; diff --git a/server/scripts/seed-data/video.js b/server/scripts/seed-data/video.js index 75654ec..c0076fd 100644 --- a/server/scripts/seed-data/video.js +++ b/server/scripts/seed-data/video.js @@ -1,10 +1,11 @@ const { faker } = require('@faker-js/faker'); const { MongoManager } = require('../../src/modules/db/mongo'); const { VIDEO_STATUS, VIDEO_VISIBILITIES } = require('../../src/modules/db/constant'); +const logger = require('../../src/logger'); const getFakeVideosData = (x) => { const videos = []; - console.log('getting new batch', x); + logger.info('getting new batch', x); for (let i = 0; i < 1000; i++) { videos.push({ title: faker.lorem.sentence(5), @@ -44,7 +45,7 @@ const seedData = async () => { let i = 0; for await (const video of videos) { const result = await insert(video); - console.log(`${index} - ${i++}`, '\t', result.insertedId); + logger.info(`${index} - ${i++}`, '\t', result.insertedId); } } }; diff --git a/server/src/modules/db/collections.js b/server/src/modules/db/collections.js index fc9a16c..7aac4ec 100644 --- a/server/src/modules/db/collections.js +++ b/server/src/modules/db/collections.js @@ -1,6 +1,7 @@ const { ObjectId } = require('mongodb'); const { MongoManager } = require('./mongo'); const { baseDefaults } = require('./schemas/common'); +const logger = require('../../logger'); const insertItem = async (collection, item) => { try { @@ -9,10 +10,10 @@ const insertItem = async (collection, item) => { ...item, }); } catch (error) { - console.error(error.errInfo?.details); + logger.error(error.errInfo?.details); if (error.code.toString() === '121') { // MongoServerError: Document failed validation - console.log('schemaErrors', JSON.stringify(error.errInfo?.details)); + logger.info('schemaErrors', JSON.stringify(error.errInfo?.details)); } return error; } @@ -31,7 +32,7 @@ const updateItem = async (collection, item) => { } ); } catch (error) { - console.error(error); + logger.error(error); return null; } }; @@ -45,7 +46,7 @@ const getObjectById = async (collectionName, id) => { ); return item; } catch (error) { - console.error(error); + logger.error(error); return error; } }; @@ -55,7 +56,7 @@ const search = async ( { filter, projection, sort, pageNumber = 1, limit = 10 } ) => { const skip = (pageNumber - 1) * limit; - console.log( + logger.info( 'search filter, projection, sort, pageNumber', collectionName, filter, @@ -78,7 +79,7 @@ const count = async (collectionName, { filter }) => { const countDocuments = filter ? await cursor.countDocuments(filter) : await cursor.estimatedDocumentCount(); - console.log('count:', collectionName, filter, countDocuments); + logger.info('count:', collectionName, filter, countDocuments); return countDocuments; }; @@ -92,7 +93,7 @@ const deleteObjectById = async (collectionName, id) => { return result; } catch (error) { - console.error(error); + logger.error(error); return error; } }; diff --git a/server/src/modules/db/mongo.js b/server/src/modules/db/mongo.js index 10a9fe4..28ea83e 100644 --- a/server/src/modules/db/mongo.js +++ b/server/src/modules/db/mongo.js @@ -12,7 +12,7 @@ const logger = require('../../logger'); class MongoManager { static async setInstance(instance) { if (!MongoManager.instance) { - console.log('setting instance'); + logger.info('setting instance'); MongoManager.instance = instance; } } @@ -38,7 +38,7 @@ class MongoManager { const client = new MongoClient(mongoUrl, { useNewUrlParser: true, }); - console.log('connecting to MongoDB'); + logger.info('connecting to MongoDB'); await client.connect(); const db = client.db('videodb'); if (process.env.ENABLE_WINSTON_MONGODB === 'true') { diff --git a/server/src/modules/db/schemas/common.js b/server/src/modules/db/schemas/common.js index 95e062f..4d40df5 100644 --- a/server/src/modules/db/schemas/common.js +++ b/server/src/modules/db/schemas/common.js @@ -1,4 +1,5 @@ const { ObjectId } = require('mongodb'); +const logger = require('../../../logger'); /** * Common properties for all of the collections @@ -51,10 +52,10 @@ const baseDefaults = () => ({ const ensureCollection = async ({ db, name, validator, indexes }) => { const collections = await db.listCollections({ name }).toArray(); if (collections.length === 0) { - console.log(`creating collection ${name}`); + logger.info(`creating collection ${name}`); await db.createCollection(name, { validator }); } else { - console.log(`updating collection ${name}`); + logger.info(`updating collection ${name}`); await db.command({ collMod: name, validator, diff --git a/server/src/modules/models/role/controller.js b/server/src/modules/models/role/controller.js index e3a91cf..dc92346 100644 --- a/server/src/modules/models/role/controller.js +++ b/server/src/modules/models/role/controller.js @@ -1,12 +1,13 @@ +const logger = require('../../../logger'); const { insert, update, getById } = require('./service'); const BASE_URL = `/api/roles`; const setupRoutes = (app) => { - console.log(`Setting up routes for ${BASE_URL}`); + logger.info(`Setting up routes for ${BASE_URL}`); app.post(`${BASE_URL}/create`, async (req, res) => { - console.log('rolecreate create', req.body); + logger.info('rolecreate create', req.body); const result = await insert(req.body); if (result instanceof Error) { res.status(400).json(JSON.parse(result.message)); @@ -25,7 +26,7 @@ const setupRoutes = (app) => { }); app.get(`${BASE_URL}/detail/:id`, async (req, res) => { - console.log(`GET`, req.params); + logger.info(`GET`, req.params); const item = await getById(req.params.id); if (item instanceof Error) { return res.status(400).json(JSON.parse(item.message)); diff --git a/server/src/modules/models/role/service.js b/server/src/modules/models/role/service.js index ad847cf..f66b55d 100644 --- a/server/src/modules/models/role/service.js +++ b/server/src/modules/models/role/service.js @@ -1,6 +1,7 @@ const { ObjectId } = require('mongodb'); const { MongoManager } = require('../../db/mongo'); const { Role } = require('../../db/collections'); +const logger = require('../../../logger'); const insert = async (role) => { try { @@ -15,7 +16,7 @@ const update = async (role) => { try { return await Role.update(role); } catch (error) { - console.error(error); + logger.error(error); return error; } }; diff --git a/server/src/modules/models/video/controller.js b/server/src/modules/models/video/controller.js index 861536b..c1a0727 100644 --- a/server/src/modules/models/video/controller.js +++ b/server/src/modules/models/video/controller.js @@ -13,15 +13,16 @@ const { addQueueItem } = require('../../queues/queue'); const { getVideoDurationAndResolution, } = require('../../queues/video-processor'); +const logger = require('../../../logger'); const BASE_URL = `/api/videos`; const setupRoutes = (app) => { - console.log(`Setting up routes for ${BASE_URL}`); + logger.info(`Setting up routes for ${BASE_URL}`); // return empty response with success message for the base route app.get(`${BASE_URL}/`, async (req, res) => { - console.log(`GET`, req.params); + logger.info(`GET`, req.params); const data = await search({}); res.send({ status: 'success', @@ -32,7 +33,7 @@ const setupRoutes = (app) => { }); app.get(`${BASE_URL}/detail/:id`, async (req, res) => { - console.log(`GET`, req.params); + logger.info(`GET`, req.params); const video = await updateViewCount(req.params.id); if (video instanceof Error) { return res.status(400).json(JSON.parse(video.message)); @@ -42,13 +43,13 @@ const setupRoutes = (app) => { // TODO: Proper searching with paging and ordering app.post(`${BASE_URL}/search`, async (req, res) => { - console.log('POST search', req.body); + logger.info('POST search', req.body); const result = await search(req.body); res.send(result); }); app.post(`${BASE_URL}/count`, async (req, res) => { - console.log('POST count', req.body); + logger.info('POST count', req.body); const result = await count(req.body); res.send({count: result}); }); @@ -84,7 +85,7 @@ const setupRoutes = (app) => { }); app.delete(`${BASE_URL}/delete/:id`, async (req, res) => { - console.log('DELETE', req.params.id); + logger.info('DELETE', req.params.id); if (req.params.id) { const result = await deleteById(req.params.id); if (result instanceof Error) { @@ -110,10 +111,10 @@ const setupRoutes = (app) => { const fileFilter = (req, file, cb) => { if (file.mimetype === 'video/mp4' || file.mimetype === 'video/webm') { - console.log('file type supported', file); + logger.info('file type supported', file); cb(null, true); } else { - console.log('file type not supported', file); + logger.info('file type not supported', file); cb(new multer.MulterError('File type not supported'), false); } }; @@ -132,7 +133,7 @@ const setupRoutes = (app) => { res.status(400).json({ status: 'error', error: err }); return; } else { - console.log('upload success', req.file); + logger.info('upload success', req.file); // res.status(200).json({ status: "success", message: "upload success" }); next(); } @@ -155,10 +156,10 @@ const setupRoutes = (app) => { viewCount: 0, duration: 0, }; - console.log('dbPayload', dbPayload); + logger.info('dbPayload', dbPayload); // TODO: save the file info and get the id from the database const result = await insert(dbPayload); - console.log('result', result); + logger.info('result', result); await addQueueItem(QUEUE_EVENTS.VIDEO_UPLOADED, { id: result.insertedId.toString(), ...req.body, @@ -172,7 +173,7 @@ const setupRoutes = (app) => { }); return; } catch (error) { - console.error(error); + logger.error(error); res.send(error); } }); diff --git a/server/src/modules/models/video/service.js b/server/src/modules/models/video/service.js index 138052f..5bb7c27 100644 --- a/server/src/modules/models/video/service.js +++ b/server/src/modules/models/video/service.js @@ -1,6 +1,7 @@ const { ObjectId } = require('mongodb'); const { Video } = require('../../db/collections'); const { VIDEO_STATUS } = require('../../db/constant'); +const logger = require('../../../logger'); const insert = async (document) => { try { @@ -19,7 +20,7 @@ const update = async (document) => { }; const search = async (searchObject) => { - console.log('searchObject', searchObject); + logger.info('searchObject', searchObject); const filter = searchObject.filterKey ? { [searchObject.filterKey]: new RegExp(searchObject.filterValue, 'i'), @@ -59,7 +60,7 @@ const search = async (searchObject) => { }; const count = async (searchObject) => { - console.log('searchObject', searchObject); + logger.info('searchObject', searchObject); const filter = searchObject.filterKey ? { [searchObject.filterKey]: new RegExp(searchObject.filterValue, 'i'), @@ -82,7 +83,7 @@ const updateHistory = async (id, { history, ...rest }) => { ); return updatedDoc; } catch (error) { - console.error(error); + logger.error(error); return error; } }; diff --git a/server/src/modules/queues/handlers.js b/server/src/modules/queues/handlers.js index 59b3b53..cb9230a 100644 --- a/server/src/modules/queues/handlers.js +++ b/server/src/modules/queues/handlers.js @@ -8,10 +8,11 @@ const { generateThumbnail, } = require('./video-processor'); const { addQueueItem } = require('./queue'); +const logger = require('../../logger'); const eventEmitter = require('../../event-manager').getInstance(); const uploadedHandler = async (job) => { - console.log('uploaded handler!', job.data.title); + logger.info('uploaded handler!', job.data.title); await addQueueItem(QUEUE_EVENTS.VIDEO_PROCESSING, { ...job.data, completed: true, @@ -20,7 +21,7 @@ const uploadedHandler = async (job) => { }; const processingHandler = async (job) => { - console.log('processing handler!', job.data.path); + logger.info('processing handler!', job.data.path); await processRawFileToMp4(`./${job.data.path}`, `./uploads/processed`, { ...job.data, completed: true, @@ -30,7 +31,7 @@ const processingHandler = async (job) => { }; const processedHandler = async (job) => { - console.log('processed handler!', job.data.path); + logger.info('processed handler!', job.data.path); await addQueueItem(QUEUE_EVENTS.VIDEO_HLS_CONVERTING, { ...job.data, completed: true, @@ -40,7 +41,7 @@ const processedHandler = async (job) => { }; const hlsConvertingHandler = async (job) => { - console.log('HLS converting handler!', job.data.path); + logger.info('HLS converting handler!', job.data.path); const hlsConverted = await processMp4ToHls( `./${job.data.path}`, `./uploads/hls`, @@ -50,12 +51,12 @@ const hlsConvertingHandler = async (job) => { next: QUEUE_EVENTS.VIDEO_HLS_CONVERTED, } ); - console.log('hlsConverted', hlsConverted); + logger.info('hlsConverted', hlsConverted); return; }; const hlsConvertedHandler = async (job) => { - console.log('hls converted handler!', job.data.filename); + logger.info('hls converted handler!', job.data.filename); await addQueueItem(NOTIFY_EVENTS.NOTIFY_VIDEO_HLS_CONVERTED, { ...job.data, completed: true, @@ -65,7 +66,7 @@ const hlsConvertedHandler = async (job) => { }; const notifyVideoHlsConvertedHandler = async (job) => { - console.log('notifyVideoHlsConvertedHandler handler!', job.data); + logger.info('notifyVideoHlsConvertedHandler handler!', job.data); eventEmitter.emit(`${NOTIFY_EVENTS.NOTIFY_VIDEO_HLS_CONVERTED}`, job.data); return { ...job.data, completed: true, next: null }; }; diff --git a/server/src/modules/queues/queue.js b/server/src/modules/queues/queue.js index ada9fa2..6e2cc80 100644 --- a/server/src/modules/queues/queue.js +++ b/server/src/modules/queues/queue.js @@ -1,5 +1,6 @@ const { Queue } = require('bullmq'); const { ALL_EVENTS: QUEUE_EVENTS } = require('./constants'); +const logger = require('../../logger'); const eventEmitter = require('../../event-manager').getInstance(); const redisConnection = { @@ -15,7 +16,7 @@ const queues = Object.values(QUEUE_EVENTS).map((queueName) => { }); const addQueueItem = async (queueName, item) => { - console.log('addQueueItem', queueName, item); + logger.info('addQueueItem', queueName, item); const queue = queues.find((q) => q.name === queueName); if (!queue) { throw new Error(`queue ${queueName} not found`); diff --git a/server/src/modules/queues/video-processor.js b/server/src/modules/queues/video-processor.js index cda063a..19630c5 100644 --- a/server/src/modules/queues/video-processor.js +++ b/server/src/modules/queues/video-processor.js @@ -11,6 +11,7 @@ configureFFMPEG(); const path = require('path'); const { VIDEO_QUEUE_EVENTS: QUEUE_EVENTS } = require('./constants'); const { addQueueItem } = require('./queue'); +const logger = require('../../logger'); const processRawFileToMp4 = async (filePath, outputFolder, jobData) => { const fileExt = path.extname(filePath); @@ -21,15 +22,15 @@ const processRawFileToMp4 = async (filePath, outputFolder, jobData) => { ffmpeg(filePath) .output(outputFileName) .on('start', function (commandLine) { - console.log('Spawned Ffmpeg with command: ' + commandLine); + logger.info('Spawned Ffmpeg with command: ' + commandLine); }) .on('progress', function (progress) { if (parseInt(progress.percent) % 20 === 0) { - console.log('Processing: ' + progress.percent + '% done'); + logger.info('Processing: ' + progress.percent + '% done'); } }) .on('end', async function () { - console.log('Finished processing', outputFileName); + logger.info('Finished processing', outputFileName); await addQueueItem(QUEUE_EVENTS.VIDEO_PROCESSED, { ...jobData, completed: true, @@ -37,7 +38,7 @@ const processRawFileToMp4 = async (filePath, outputFolder, jobData) => { }); }) .on('error', function (err) { - console.log('An error occurred: ' + err.message); + logger.info('An error occurred: ' + err.message); }) .run(); @@ -76,7 +77,7 @@ const processMp4ToHls = async (filePath, outputFolder, jobData) => { const outputFileName = `${outputFolder}/${fileNameWithoutExt}.m3u8`; ffmpeg.ffprobe(filePath, function (err, metadata) { - console.log('metadata', err, metadata); + logger.info('metadata', err, metadata); }); ffmpeg(filePath) @@ -89,22 +90,22 @@ const processMp4ToHls = async (filePath, outputFolder, jobData) => { `${outputFolder}/${fileNameWithoutExt}_%03d.ts`, ]) .on('start', function (commandLine) { - console.log('Spawned Ffmpeg with command: ' + commandLine); + logger.info('Spawned Ffmpeg with command: ' + commandLine); }) .on('progress', function (progress) { if (parseInt(progress.percent) % 20 === 0) { - console.log('Processing: ' + progress.percent + '% done'); + logger.info('Processing: ' + progress.percent + '% done'); } }) .on('end', function (x) { - console.log('Finished processing', outputFileName, x); + logger.info('Finished processing', outputFileName, x); addQueueItem(QUEUE_EVENTS.VIDEO_HLS_CONVERTED, { ...jobData, path: outputFileName, }); }) .on('error', function (err) { - console.log('An error occurred: ' + err.message); + logger.info('An error occurred: ' + err.message); }) .run(); @@ -133,7 +134,7 @@ const getVideoDurationAndResolution = async (filePath) => { }); return; } - console.error(err); + logger.error(err); reject(err); }); }); diff --git a/server/src/modules/queues/worker.js b/server/src/modules/queues/worker.js index 6ee5d3d..f3d6d8d 100644 --- a/server/src/modules/queues/worker.js +++ b/server/src/modules/queues/worker.js @@ -1,6 +1,7 @@ const { Worker, QueueEvents } = require('bullmq'); const { VIDEO_QUEUE_EVENTS } = require('./constants'); const { QUEUE_EVENT_HANDLERS } = require('./handlers'); +const logger = require('../../logger'); const redisConnection = { host: process.env.REDIS_SERVER || 'localhost', @@ -28,7 +29,7 @@ const listenQueueEvent = (queueName) => { // }); queueEvents.on('failed', ({ jobId, failedReason }) => { - console.log(`${jobId} has failed with reason ${failedReason}`); + logger.info(`${jobId} has failed with reason ${failedReason}`); }); const worker = new Worker( @@ -44,14 +45,14 @@ const listenQueueEvent = (queueName) => { ); worker.on('completed', (job) => { - console.log(`${job.id} has completed!`); + logger.info(`${job.id} has completed!`); }); worker.on('failed', (job, err) => { - console.log(`${job.id} has failed with ${err.message}`); + logger.info(`${job.id} has failed with ${err.message}`); }); - console.log(queueName, ' worker started', new Date().toTimeString()); + logger.info(queueName, ' worker started', new Date().toTimeString()); }; const setupAllQueueEvents = () => { diff --git a/server/src/queue.js b/server/src/queue.js index a8eea85..08c4d1d 100644 --- a/server/src/queue.js +++ b/server/src/queue.js @@ -1,4 +1,5 @@ require('dotenv').config(); +const logger = require('./logger'); const { MongoManager } = require('./modules/db/mongo'); const { setupAllQueueEvents } = require('./modules/queues/worker'); @@ -6,7 +7,7 @@ const { setupAllQueueEvents } = require('./modules/queues/worker'); const setup = async () => { await MongoManager.connect(); const status = setupAllQueueEvents(); - console.log('setupAllQueueEvents: ', status); + logger.info('setupAllQueueEvents: ', status); }; setup(); diff --git a/server/src/server.js b/server/src/server.js index ae89384..eda65b1 100644 --- a/server/src/server.js +++ b/server/src/server.js @@ -1,4 +1,5 @@ const app = require('./app'); +const logger = require('./logger'); const { MongoManager } = require('./modules/db/mongo'); const { NOTIFY_EVENTS } = require('./modules/queues/constants'); const eventEmitter = require('./event-manager').getInstance(); @@ -18,7 +19,7 @@ const setup = async () => { listenQueueEvent(NOTIFY_EVENTS.NOTIFY_VIDEO_HLS_CONVERTED); eventEmitter.on(NOTIFY_EVENTS.NOTIFY_VIDEO_HLS_CONVERTED, (data) => { - console.log('NOTIFY_EVENTS.NOTIFY_VIDEO_HLS_CONVERTED Event handler', data); + logger.info('NOTIFY_EVENTS.NOTIFY_VIDEO_HLS_CONVERTED Event handler', data); io.emit('hello', data); }); }; @@ -29,8 +30,8 @@ const { Server } = require('socket.io'); const io = new Server(server, { cors: { origin: '*' } }); io.on('connection', (socket) => { - console.log('a user connected'); - console.dir(socket.id); + logger.info('a user connected'); + logger.info(socket.id); // setInterval(() => { // console.log("sending", new Date().toTimeString()); @@ -39,17 +40,17 @@ io.on('connection', (socket) => { }); server.listen(PORT, async () => { - console.log(`listening on port ${PORT}`); + logger.info(`listening on port ${PORT}`); await MongoManager.connect(); await setup(); - console.log('application setup completed'); + logger.info('application setup completed'); // which request, what handler app.use('/', (req, res) => { - console.log(`request received at ${new Date()}`); - console.log('req', req.body); + logger.info(`request received at ${new Date()}`); + logger.info('req', req.body); //console.dir(res); res.send(`request received at ${new Date()}`); }); - console.log('application started', new Date().toTimeString()); + logger.info('application started', new Date().toTimeString()); }); diff --git a/server/src/video-server.js b/server/src/video-server.js index 91f11a6..956cec2 100644 --- a/server/src/video-server.js +++ b/server/src/video-server.js @@ -2,13 +2,14 @@ require('dotenv').config(); const http = require('http'); const fs = require('fs'); const path = require('path'); +const logger = require('./logger'); const port = 4001; const publicDirectory = './uploads/hls'; const requestHandler = (req, res) => { const filePath = path.join(publicDirectory, req.url); - console.log('filePath', filePath); + logger.info('filePath', filePath); fs.exists(filePath, (exists) => { if (!exists) { res.statusCode = 404; @@ -34,9 +35,9 @@ const server = http.createServer(requestHandler); server.listen(port, (err) => { if (err) { - console.error(`Error starting server: ${err}`); + logger.error(`Error starting server: ${err}`); return; } - console.log(`Video server started on port ${port}`); + logger.info(`Video server started on port ${port}`); });