import { HttpCodes } from '../../config/Errors'; import { db } from '../../settings'; import { ResultSetHeader } from 'mysql2'; import { ErrorResponseC, SuccessResponseC } from '../services.response'; import courseLogs, { ICourseLogs, courseLogger } from './course.logs'; import { formatString } from '../../utils/Strings'; export class VideoServices { static insertVideos = async (videos: VideoI[]): Promise<ResponseT> => { try { const sqlInsertQuery = 'INSERT INTO videos (chapter_id, title, url, videoLength, position) VALUES ?'; const values = videos.map((video) => [ video.chapter_id, video.title, video.url, video.videoLength, video.position, ]); const [result]: any = await db.query<ResultSetHeader[]>(sqlInsertQuery, [ values, ]); const videoIds = videos.map((_, position) => result.insertId + position); const resp: ICode<ICourseLogs> = courseLogs.INSERT_VIDEOS_SUCCESS; const msg = formatString(resp.message, { videoIds: videoIds.join(', '), }); courseLogger.info(msg, { type: resp.type }); return new SuccessResponseC(resp.type, {}, msg, HttpCodes.Created.code); } catch (err) { const msg = formatString(courseLogs.VIDEO_ERROR_GENERIC.message, { error: (err as Error)?.message || '', }); courseLogger.error(msg, err as Error); return new ErrorResponseC( courseLogs.VIDEO_ERROR_GENERIC.type, HttpCodes.InternalServerError.code, msg ); } }; static updateVideos = async (videos: VideoI[]): Promise<ResponseT> => { try { const sqlUpdateQuery = 'UPDATE videos SET title = ?, url = ?, videoLength = ? WHERE video_id = ?'; const values: any = videos.map((video) => [ video.title, video.url, video.videoLength, video.video_id, ]); for (const value of values) { // const [result]: any = await db.query<ResultSetHeader>(sqlUpdateQuery, [ value.title, value.url, value.videoLength, value.video_id, ]); // if (result.affectedRows === 0) { // const msg = formatString(courseLogs.VIDEO_ERROR_NOT_FOUND.message, { // videoId: videos.map((video) => video.video_id).join(', '), // }); // courseLogger.error(msg); // return new ErrorResponseC( // courseLogs.VIDEO_ERROR_NOT_FOUND.type, // HttpCodes.NotFound.code, // msg // ); // } } const resp: ICode<ICourseLogs> = courseLogs.UPDATE_VIDEOS_SUCCESS; const msg = formatString(resp.message, { videoIds: videos.map((video) => video.video_id).join(', '), }); courseLogger.info(msg, { type: resp.type }); return new SuccessResponseC(resp.type, {}, msg, HttpCodes.Accepted.code); } catch (err) { const msg = formatString(courseLogs.VIDEO_ERROR_GENERIC.message, { error: (err as Error)?.message || '', }); courseLogger.error(msg, err as Error); return new ErrorResponseC( courseLogs.VIDEO_ERROR_GENERIC.type, HttpCodes.InternalServerError.code, msg ); } }; static deleteVideos = async (video_ids: number[]): Promise<ResponseT> => { try { const sqlDeleteQuery = 'DELETE FROM videos WHERE video_id IN (?)'; const [result]: any = await db.query<ResultSetHeader[]>(sqlDeleteQuery, [ video_ids, ]); if (result.affectedRows === 0) { const msg = formatString(courseLogs.VIDEO_ERROR_NOT_FOUND.message, { videoId: video_ids.join(', '), }); courseLogger.error(msg); return new ErrorResponseC( courseLogs.VIDEO_ERROR_NOT_FOUND.type, HttpCodes.NotFound.code, msg ); } const resp: ICode<ICourseLogs> = courseLogs.DELETE_VIDEOS_SUCCESS; const msg = formatString(resp.message, { videoIds: video_ids.join(', '), }); courseLogger.info(msg, { type: resp.type }); return new SuccessResponseC(resp.type, {}, msg, HttpCodes.Accepted.code); } catch (err) { const msg = formatString(courseLogs.VIDEO_ERROR_GENERIC.message, { error: (err as Error)?.message || '', }); courseLogger.error(msg, err as Error); return new ErrorResponseC( courseLogs.VIDEO_ERROR_GENERIC.type, HttpCodes.InternalServerError.code, msg ); } }; static identifyAddedVideos = (oldVideos: VideoI[], newVideos: VideoI[]) => { const addedVideos = newVideos.filter( (newVideo) => !oldVideos.some((oldVideo) => oldVideo.video_id === newVideo.video_id) ); return addedVideos; }; static identifyDeletedVideos = (oldVideos: VideoI[], newVideos: VideoI[]) => { const deletedVideos = oldVideos.filter( (oldVideo) => !newVideos.some((newVideo) => newVideo.video_id === oldVideo.video_id) ); return deletedVideos; }; static identifyUpdatedVideos = (oldVideos: VideoI[], newVideos: VideoI[]) => { const updatedVideos = newVideos.filter((newVideo) => oldVideos.some( (oldVideo) => oldVideo.video_id === newVideo.video_id && (oldVideo.title !== newVideo.title || oldVideo.url !== newVideo.url || oldVideo.position !== newVideo.position || oldVideo.videoLength !== newVideo.videoLength) ) ); return updatedVideos; }; }