From 0e6a3c4a016619bd1c9062247a28ce91daa39f8f Mon Sep 17 00:00:00 2001 From: ajdj100 Date: Wed, 31 Dec 2025 09:51:31 -0500 Subject: [PATCH] Restructured services to support more... services --- api/src/index.ts | 46 ++++++++++++++----- api/src/routes/applications.ts | 10 ++-- api/src/routes/auth.ts | 4 +- api/src/routes/calendar.ts | 2 +- api/src/routes/course.ts | 2 +- api/src/routes/loa.ts | 2 +- api/src/routes/members.ts | 6 +-- api/src/routes/ranks.ts | 2 +- api/src/routes/roles.ts | 2 +- api/src/services/{ => db}/CourseSerivce.ts | 2 +- .../services/{ => db}/applicationService.ts | 2 +- api/src/services/{ => db}/calendarService.ts | 2 +- api/src/services/{ => db}/loaService.ts | 2 +- api/src/services/{ => db}/memberService.ts | 2 +- api/src/services/{ => db}/rankService.ts | 2 +- api/src/services/{ => db}/rolesService.ts | 2 +- api/src/services/{ => db}/statusService.ts | 2 +- 17 files changed, 58 insertions(+), 34 deletions(-) rename api/src/services/{ => db}/CourseSerivce.ts (99%) rename api/src/services/{ => db}/applicationService.ts (99%) rename api/src/services/{ => db}/calendarService.ts (99%) rename api/src/services/{ => db}/loaService.ts (99%) rename api/src/services/{ => db}/memberService.ts (99%) rename api/src/services/{ => db}/rankService.ts (99%) rename api/src/services/{ => db}/rolesService.ts (98%) rename api/src/services/{ => db}/statusService.ts (89%) diff --git a/api/src/index.ts b/api/src/index.ts index f5331a8..cba919b 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -7,22 +7,45 @@ import morgan = require('morgan'); const app = express() app.use(morgan((tokens: morgan.TokenIndexer, req: express.Request, res: express.Response) => { - return JSON.stringify({ + + const head: LogHeader = { type: 'http', + level: 'info', + depth: 'normal', timestamp: new Date().toISOString(), + } - method: tokens.method(req, res), - path: tokens.url(req, res), - status: Number(tokens.status(req, res)), - response_time_ms: Number(tokens['response-time'](req, res)), + const payload: LogPayload = { + message: 'HTTP request completed', + data: { + method: tokens.method(req, res), + path: tokens.url(req, res), + status: Number(tokens.status(req, res)), + response_time_ms: Number(tokens['response-time'](req, res)), + user_id: req.user.id, + user_name: req.user.name, + user_agent: req.headers['user-agent'], + }, + } - ip: req.ip, - user_agent: req.headers['user-agent'], + logger.log(head.level, head.type, payload.message, payload.data, head.depth) + // { + // type: 'http', + // timestamp: new Date().toISOString(), - user: req.user - ? { id: req.user.id, name: req.user.name } - : null, - }); + // method: tokens.method(req, res), + // path: tokens.url(req, res), + // status: Number(tokens.status(req, res)), + // response_time_ms: Number(tokens['response-time'](req, res)), + + // ip: req.ip, + // user_agent: req.headers['user-agent'], + + // user: req.user + // ? { id: req.user.id, name: req.user.name } + // : null, + // } + return ''; }, { skip: (req: express.Request) => { return req.originalUrl === '/members/me'; @@ -89,6 +112,7 @@ import { roles, memberRoles } from './routes/roles'; import { courseRouter, eventRouter } from './routes/course'; import { calendarRouter } from './routes/calendar'; import { docsRouter } from './routes/docs'; +import { logger, LogHeader, LogPayload } from './services/logging/logger'; app.use('/application', applicationRouter); app.use('/ranks', ranks); diff --git a/api/src/routes/applications.ts b/api/src/routes/applications.ts index 9a1a732..a257142 100644 --- a/api/src/routes/applications.ts +++ b/api/src/routes/applications.ts @@ -2,14 +2,14 @@ const express = require('express'); const router = express.Router(); import pool from '../db'; -import { approveApplication, createApplication, denyApplication, getAllMemberApplications, getApplicationByID, getApplicationComments, getApplicationList, getMemberApplication } from '../services/applicationService'; -import { setUserState } from '../services/memberService'; +import { approveApplication, createApplication, denyApplication, getAllMemberApplications, getApplicationByID, getApplicationComments, getApplicationList, getMemberApplication } from '../services/db/applicationService'; +import { setUserState } from '../services/db/memberService'; import { MemberState } from '@app/shared/types/member'; -import { getRankByName, insertMemberRank } from '../services/rankService'; +import { getRankByName, insertMemberRank } from '../services/db/rankService'; import { ApplicationFull, CommentRow } from "@app/shared/types/application" -import { assignUserToStatus } from '../services/statusService'; +import { assignUserToStatus } from '../services/db/statusService'; import { Request, response, Response } from 'express'; -import { getUserRoles } from '../services/rolesService'; +import { getUserRoles } from '../services/db/rolesService'; import { requireLogin, requireRole } from '../middleware/auth'; //get CoC diff --git a/api/src/routes/auth.ts b/api/src/routes/auth.ts index 4925da1..d15f8c0 100644 --- a/api/src/routes/auth.ts +++ b/api/src/routes/auth.ts @@ -9,8 +9,8 @@ const router = express.Router(); import { Role } from '@app/shared/types/roles'; import pool from '../db'; import { requireLogin } from '../middleware/auth'; -import { getUserRoles } from '../services/rolesService'; -import { getUserState, mapDiscordtoID } from '../services/memberService'; +import { getUserRoles } from '../services/db/rolesService'; +import { getUserState, mapDiscordtoID } from '../services/db/memberService'; import { MemberState } from '@app/shared/types/member'; import { toDateTime } from '@app/shared/utils/time'; const querystring = require('querystring'); diff --git a/api/src/routes/calendar.ts b/api/src/routes/calendar.ts index a5c96be..c6cac45 100644 --- a/api/src/routes/calendar.ts +++ b/api/src/routes/calendar.ts @@ -1,5 +1,5 @@ import { Request, Response } from "express"; -import { createEvent, getEventAttendance, getEventDetails, getShortEventsInRange, setAttendanceStatus, setEventCancelled, updateEvent } from "../services/calendarService"; +import { createEvent, getEventAttendance, getEventDetails, getShortEventsInRange, setAttendanceStatus, setEventCancelled, updateEvent } from "../services/db/calendarService"; import { CalendarAttendance, CalendarEvent } from "@app/shared/types/calendar"; import { requireLogin, requireMemberState, requireRole } from "../middleware/auth"; import { MemberState } from "@app/shared/types/member"; diff --git a/api/src/routes/course.ts b/api/src/routes/course.ts index 91a2057..7317463 100644 --- a/api/src/routes/course.ts +++ b/api/src/routes/course.ts @@ -1,5 +1,5 @@ import { CourseAttendee, CourseEventDetails } from "@app/shared/types/course"; -import { getAllCourses, getCourseEventAttendees, getCourseEventDetails, getCourseEventRoles, getCourseEvents, insertCourseEvent } from "../services/CourseSerivce"; +import { getAllCourses, getCourseEventAttendees, getCourseEventDetails, getCourseEventRoles, getCourseEvents, insertCourseEvent } from "../services/db/CourseSerivce"; import { Request, Response, Router } from "express"; import { requireLogin, requireMemberState } from "../middleware/auth"; import { MemberState } from "@app/shared/types/member"; diff --git a/api/src/routes/loa.ts b/api/src/routes/loa.ts index 65aa115..a1ea32e 100644 --- a/api/src/routes/loa.ts +++ b/api/src/routes/loa.ts @@ -3,7 +3,7 @@ const router = express.Router(); import { Request, Response } from 'express'; import pool from '../db'; -import { closeLOA, createNewLOA, getAllLOA, getLOAbyID, getLoaTypes, getUserLOA, setLOAExtension } from '../services/loaService'; +import { closeLOA, createNewLOA, getAllLOA, getLOAbyID, getLoaTypes, getUserLOA, setLOAExtension } from '../services/db/loaService'; import { LOARequest } from '@app/shared/types/loa'; import { requireLogin, requireRole } from '../middleware/auth'; diff --git a/api/src/routes/members.ts b/api/src/routes/members.ts index c73b8f2..1bad565 100644 --- a/api/src/routes/members.ts +++ b/api/src/routes/members.ts @@ -4,9 +4,9 @@ const router = express.Router(); import { Request, Response } from 'express'; import pool from '../db'; import { requireLogin, requireMemberState, requireRole } from '../middleware/auth'; -import { getUserActiveLOA } from '../services/loaService'; -import { getAllMembersLite, getMemberSettings, getMembersFull, getMembersLite, getUserData, getUserState, setUserSettings } from '../services/memberService'; -import { getUserRoles } from '../services/rolesService'; +import { getUserActiveLOA } from '../services/db/loaService'; +import { getAllMembersLite, getMemberSettings, getMembersFull, getMembersLite, getUserData, getUserState, setUserSettings } from '../services/db/memberService'; +import { getUserRoles } from '../services/db/rolesService'; import { memberSettings, MemberState, myData } from '@app/shared/types/member'; //get all users diff --git a/api/src/routes/ranks.ts b/api/src/routes/ranks.ts index af22a03..8559495 100644 --- a/api/src/routes/ranks.ts +++ b/api/src/routes/ranks.ts @@ -1,6 +1,6 @@ import { MemberState } from "@app/shared/types/member"; import { requireLogin, requireMemberState, requireRole } from "../middleware/auth"; -import { batchInsertMemberRank, getAllRanks, getPromotionHistorySummary, getPromotionsOnDay, insertMemberRank } from "../services/rankService"; +import { batchInsertMemberRank, getAllRanks, getPromotionHistorySummary, getPromotionsOnDay, insertMemberRank } from "../services/db/rankService"; import { BatchPromotion, BatchPromotionMember } from '@app/shared/schemas/promotionSchema' import express = require('express'); diff --git a/api/src/routes/roles.ts b/api/src/routes/roles.ts index d77093f..1295ec9 100644 --- a/api/src/routes/roles.ts +++ b/api/src/routes/roles.ts @@ -5,7 +5,7 @@ const ur = express.Router(); import { MemberState } from '@app/shared/types/member'; import pool from '../db'; import { requireLogin, requireMemberState, requireRole } from '../middleware/auth'; -import { assignUserGroup, createGroup, getAllRoles, getRole, getUsersWithRole } from '../services/rolesService'; +import { assignUserGroup, createGroup, getAllRoles, getRole, getUsersWithRole } from '../services/db/rolesService'; import { Request, Response } from 'express'; r.use(requireLogin) diff --git a/api/src/services/CourseSerivce.ts b/api/src/services/db/CourseSerivce.ts similarity index 99% rename from api/src/services/CourseSerivce.ts rename to api/src/services/db/CourseSerivce.ts index d85ffd8..1fdd8bf 100644 --- a/api/src/services/CourseSerivce.ts +++ b/api/src/services/db/CourseSerivce.ts @@ -1,4 +1,4 @@ -import pool from "../db" +import pool from "../../db" import { Course, CourseAttendee, CourseAttendeeRole, CourseEventDetails, CourseEventSummary, RawAttendeeRow } from "@app/shared/types/course" import { PagedData } from "@app/shared/types/pagination"; import { toDateTime } from "@app/shared/utils/time"; diff --git a/api/src/services/applicationService.ts b/api/src/services/db/applicationService.ts similarity index 99% rename from api/src/services/applicationService.ts rename to api/src/services/db/applicationService.ts index 159dbe3..451d01c 100644 --- a/api/src/services/applicationService.ts +++ b/api/src/services/db/applicationService.ts @@ -1,5 +1,5 @@ import { ApplicationListRow, ApplicationRow, CommentRow } from "@app/shared/types/application"; -import pool from "../db"; +import pool from "../../db"; import { error } from "console"; export async function createApplication(memberID: number, appVersion: number, app: string) { diff --git a/api/src/services/calendarService.ts b/api/src/services/db/calendarService.ts similarity index 99% rename from api/src/services/calendarService.ts rename to api/src/services/db/calendarService.ts index 4862650..3c677b5 100644 --- a/api/src/services/calendarService.ts +++ b/api/src/services/db/calendarService.ts @@ -1,4 +1,4 @@ -import pool from '../db'; +import pool from '../../db'; import { CalendarEventShort, CalendarSignup, CalendarEvent, CalendarAttendance } from "@app/shared/types/calendar" import { toDateTime } from "@app/shared/utils/time" diff --git a/api/src/services/loaService.ts b/api/src/services/db/loaService.ts similarity index 99% rename from api/src/services/loaService.ts rename to api/src/services/db/loaService.ts index c2378b9..d6a9c40 100644 --- a/api/src/services/loaService.ts +++ b/api/src/services/db/loaService.ts @@ -1,5 +1,5 @@ import { toDateTime } from "@app/shared/utils/time"; -import pool from "../db"; +import pool from "../../db"; import { LOARequest, LOAType } from '@app/shared/types/loa' import { PagedData } from '@app/shared/types/pagination' diff --git a/api/src/services/memberService.ts b/api/src/services/db/memberService.ts similarity index 99% rename from api/src/services/memberService.ts rename to api/src/services/db/memberService.ts index e1f4fed..d1a2db5 100644 --- a/api/src/services/memberService.ts +++ b/api/src/services/db/memberService.ts @@ -1,5 +1,5 @@ import { Role } from "@app/shared/types/roles"; -import pool from "../db"; +import pool from "../../db"; import { Member, MemberCardDetails, MemberLight, memberSettings, MemberState } from '@app/shared/types/member' export async function getUserData(userID: number): Promise { diff --git a/api/src/services/rankService.ts b/api/src/services/db/rankService.ts similarity index 99% rename from api/src/services/rankService.ts rename to api/src/services/db/rankService.ts index cc10f94..4178c3b 100644 --- a/api/src/services/rankService.ts +++ b/api/src/services/db/rankService.ts @@ -1,6 +1,6 @@ import { BatchPromotion, BatchPromotionMember } from "@app/shared/schemas/promotionSchema"; import { PromotionDetails, PromotionSummary } from "@app/shared/types/rank" -import pool from "../db"; +import pool from "../../db"; import { PagedData } from "@app/shared/types/pagination"; import { toDateTime } from "@app/shared/utils/time"; diff --git a/api/src/services/rolesService.ts b/api/src/services/db/rolesService.ts similarity index 98% rename from api/src/services/rolesService.ts rename to api/src/services/db/rolesService.ts index 19eb228..7a857ec 100644 --- a/api/src/services/rolesService.ts +++ b/api/src/services/db/rolesService.ts @@ -1,5 +1,5 @@ import { MemberLight } from '@app/shared/types/member'; -import pool from '../db'; +import pool from '../../db'; import { Role, RoleSummary } from '@app/shared/types/roles' export async function assignUserGroup(userID: number, roleID: number) { diff --git a/api/src/services/statusService.ts b/api/src/services/db/statusService.ts similarity index 89% rename from api/src/services/statusService.ts rename to api/src/services/db/statusService.ts index 8b8fb28..c02f9e4 100644 --- a/api/src/services/statusService.ts +++ b/api/src/services/db/statusService.ts @@ -1,4 +1,4 @@ -import pool from "../db" +import pool from "../../db" export async function assignUserToStatus(userID: number, statusID: number) { const sql = `INSERT INTO members_statuses (member_id, status_id, start_date) VALUES (?, ?, NOW())`