import meetingLogs, { IMeetingLogs, meetingLogger } from './meeting.logs'; import { formatString } from '../../utils/Strings'; import { HttpCodes } from '../../config/Errors'; import { ErrorResponseC, SuccessResponseC } from '../services.response'; import { db } from '../../settings'; import { ResultSetHeader, RowDataPacket } from 'mysql2'; export class MeetingServices { /** * @description Create a meeting * @param fullName - String * @param phone - String * @param email - String * @param cause - String * @param status - String * @param notes - String * @param course_id - Number * @param pack_id - Number * @returns ResponseT */ static createMeeting = async ( fullName: string, phone: string, email: string, cause: string | null = null, status: string = 'pending', course_id: number | null = null, pack_id: number | null = null, notes: string | null = null ): Promise => { try { const createdAt = new Date(); const updatedAt = createdAt; const sqlInsertQuery = 'INSERT INTO meetings (fullName, phone, email, cause, status, notes, course_id, pack_id, createdAt, updatedAt) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'; const result: any = await db.query(sqlInsertQuery, [ fullName, phone, email, cause, status, notes, course_id, pack_id, createdAt, updatedAt, ]); const meetingId = result[0].insertId; const meeting = { meeting_id: meetingId, fullName, phone, email, cause, status, notes, course_id, pack_id, }; const resp: ICode = meetingLogs.CREATE_MEETING_SUCCESS; const msg = formatString(resp.message, { meetingId, }); meetingLogger.info(msg, { type: resp.type }); return new SuccessResponseC( resp.type, meeting, msg, HttpCodes.Created.code ); } catch (err) { const msg = formatString(meetingLogs.CREATE_MEETING_ERROR.message, { error: (err as Error)?.message || '', }); meetingLogger.error(msg, err as Error); return new ErrorResponseC( meetingLogs.CREATE_MEETING_ERROR.type, HttpCodes.InternalServerError.code, msg ); } }; /** * @description update meeting status * @param meetingId - Number * @param status - String * @returns ResponseT */ static updateMeetingStatus = async ( meetingId: number, status: string ): Promise => { try { const updatedAt = new Date(); const sqlUpdateQuery = 'UPDATE meetings SET status = ?, updatedAt = ? WHERE meeting_id = ?'; await db.query(sqlUpdateQuery, [ status, updatedAt, meetingId, ]); const resp: ICode = meetingLogs.UPDATE_MEETING_STATUS_SUCCESS; const msg = formatString(resp.message, { meetingId, }); meetingLogger.info(msg, { type: resp.type }); return new SuccessResponseC( resp.type, null, msg, HttpCodes.Accepted.code ); } catch (err) { const msg = formatString( meetingLogs.UPDATE_MEETING_STATUS_ERROR.message, { error: (err as Error)?.message || '', } ); meetingLogger.error(msg, err as Error); return new ErrorResponseC( meetingLogs.UPDATE_MEETING_STATUS_ERROR.type, HttpCodes.InternalServerError.code, msg ); } }; /** * @description Get a meeting * @param meetingId - Number * @returns ResponseT */ static getMeeting = async (meetingId: number): Promise => { try { const sqlquery = 'SELECT * FROM meetings WHERE meeting_id = ?'; const [meeting] = await db.query(sqlquery, [meetingId]); if (meeting.length === 0) { const msg = formatString(meetingLogs.MEETING_ERROR_NOT_FOUND.message, { meetingId, }); meetingLogger.error(msg); return new ErrorResponseC( meetingLogs.MEETING_ERROR_NOT_FOUND.type, HttpCodes.NotFound.code, msg ); } const resp: ICode = meetingLogs.GET_MEETING_SUCCESS; const msg = formatString(resp.message, { meetingId, }); meetingLogger.info(msg, { type: resp.type }); return new SuccessResponseC( resp.type, meeting[0], msg, HttpCodes.Accepted.code ); } catch (err) { const msg = formatString(meetingLogs.MEETING_ERROR_GENERIC.message, { error: (err as Error)?.message || '', }); meetingLogger.error(msg, err as Error); return new ErrorResponseC( meetingLogs.MEETING_ERROR_GENERIC.type, HttpCodes.InternalServerError.code, msg ); } }; /** * @description Get all meetings * @returns ResponseT */ static getMeetings = async (): Promise => { try { // sort by createdAt const sqlquery = 'SELECT m.*, c.title as courseName , p.name as packName FROM meetings m JOIN courses c ON m.course_id = c.course_id JOIN packs p ON m.pack_id = p.pack_id ORDER BY m.createdAt DESC'; // const sqlquery = 'SELECT m.*, c.title as courseName , p.name as packName FROM Meetings m JOIN Courses c ON m.course_id = c.course_id JOIN Packs p ON m.pack_id = p.pack_id'; const [meetings] = await db.query(sqlquery); const resp: ICode = meetingLogs.GET_MEETINGS_SUCCESS; const msg = resp.message; meetingLogger.info(msg, { type: resp.type }); return new SuccessResponseC( resp.type, meetings, msg, HttpCodes.Accepted.code ); } catch (err) { const msg = formatString(meetingLogs.GET_MEETINGS_ERROR.message, { error: (err as Error)?.message || '', }); meetingLogger.error(msg, err as Error); return new ErrorResponseC( meetingLogs.GET_MEETINGS_ERROR.type, HttpCodes.InternalServerError.code, msg ); } }; /** * @description Get all meetings by status * @param status - String * @returns ResponseT */ static getMeetingsByStatus = async (status: string): Promise => { try { const sqlquery = 'SELECT * FROM meetings WHERE status = ?'; const [meetings] = await db.query(sqlquery, [status]); const resp: ICode = meetingLogs.GET_MEETINGS_BY_STATUS_SUCCESS; const msg = resp.message; meetingLogger.info(msg, { type: resp.type }); return new SuccessResponseC( resp.type, meetings, msg, HttpCodes.Accepted.code ); } catch (err) { const msg = formatString( meetingLogs.GET_MEETINGS_BY_STATUS_ERROR.message, { error: (err as Error)?.message || '', } ); meetingLogger.error(msg, err as Error); return new ErrorResponseC( meetingLogs.GET_MEETINGS_BY_STATUS_ERROR.type, HttpCodes.InternalServerError.code, msg ); } }; /** * @description delete a meeting * @param meetingId - Number * @returns ResponseT */ static deleteMeeting = async (meetingId: number): Promise => { try { const sqlDeleteQuery = 'DELETE FROM meetings WHERE meeting_id = ?'; await db.query(sqlDeleteQuery, [meetingId]); const resp: ICode = meetingLogs.DELETE_MEETING_SUCCESS; const msg = formatString(resp.message, { meetingId, }); meetingLogger.info(msg, { type: resp.type }); return new SuccessResponseC( resp.type, null, msg, HttpCodes.Accepted.code ); } catch (err) { const msg = formatString(meetingLogs.DELETE_MEETING_ERROR.message, { error: (err as Error)?.message || '', }); meetingLogger.error(msg, err as Error); return new ErrorResponseC( meetingLogs.DELETE_MEETING_ERROR.type, HttpCodes.InternalServerError.code, msg ); } }; }