diff --git a/api/package-lock.json b/api/package-lock.json index 2339e6e..142006d 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -18,6 +18,11 @@ "mysql2": "^3.14.3", "passport": "^0.7.0", "passport-openidconnect": "^0.1.2" + }, + "devDependencies": { + "@types/express": "^5.0.3", + "@types/node": "^24.8.1", + "typescript": "^5.9.3" } }, "node_modules/@gar/promisify": { @@ -63,19 +68,126 @@ "node": ">= 6" } }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/geojson": { "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "license": "MIT" }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "version": "24.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz", + "integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==", "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.14.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz", + "integrity": "sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", + "integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" } }, "node_modules/abbrev": { @@ -2338,9 +2450,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "license": "MIT", "dependencies": { "chownr": "^1.1.1", @@ -2415,6 +2527,20 @@ "node": ">= 0.6" } }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/uid-safe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", @@ -2428,9 +2554,9 @@ } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", "license": "MIT" }, "node_modules/unique-filename": { diff --git a/api/package.json b/api/package.json index 2c05b2c..b3fa69e 100644 --- a/api/package.json +++ b/api/package.json @@ -19,5 +19,10 @@ "mysql2": "^3.14.3", "passport": "^0.7.0", "passport-openidconnect": "^0.1.2" + }, + "devDependencies": { + "@types/express": "^5.0.3", + "@types/node": "^24.8.1", + "typescript": "^5.9.3" } } diff --git a/api/services/calendarService.js b/api/services/calendarService.js deleted file mode 100644 index 1ae34ad..0000000 --- a/api/services/calendarService.js +++ /dev/null @@ -1,21 +0,0 @@ -const pool = require('../db') - -export async function createEvent(eventObject) { - -} - -export async function updateEvent(eventObject) { - -} - -export async function cancelEvent(eventID) { - -} - -export async function getShortEventsInRange(startDate, endDate) { - -} - -export async function getEventDetailed(eventID) { - -} \ No newline at end of file diff --git a/api/db.js b/api/src/db.ts similarity index 73% rename from api/db.js rename to api/src/db.ts index 9612d9d..40fde15 100644 --- a/api/db.js +++ b/api/src/db.ts @@ -1,11 +1,12 @@ -const mariadb = require('mariadb') +// const mariadb = require('mariadb') +import * as mariadb from 'mariadb'; const dotenv = require('dotenv') dotenv.config(); const pool = mariadb.createPool({ host: process.env.DB_HOST, - port: process.env.DB_PORT, + port: Number(process.env.DB_PORT), user: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, connectionLimit: 5, diff --git a/api/index.js b/api/src/index.js similarity index 100% rename from api/index.js rename to api/src/index.js diff --git a/api/routes/applications.js b/api/src/routes/applications.js similarity index 100% rename from api/routes/applications.js rename to api/src/routes/applications.js diff --git a/api/routes/auth.js b/api/src/routes/auth.js similarity index 100% rename from api/routes/auth.js rename to api/src/routes/auth.js diff --git a/api/routes/calendar.js b/api/src/routes/calendar.js similarity index 100% rename from api/routes/calendar.js rename to api/src/routes/calendar.js diff --git a/api/routes/loa.js b/api/src/routes/loa.js similarity index 100% rename from api/routes/loa.js rename to api/src/routes/loa.js diff --git a/api/routes/members.js b/api/src/routes/members.js similarity index 100% rename from api/routes/members.js rename to api/src/routes/members.js diff --git a/api/routes/ranks.js b/api/src/routes/ranks.js similarity index 100% rename from api/routes/ranks.js rename to api/src/routes/ranks.js diff --git a/api/routes/roles.js b/api/src/routes/roles.js similarity index 100% rename from api/routes/roles.js rename to api/src/routes/roles.js diff --git a/api/routes/statuses.js b/api/src/routes/statuses.js similarity index 100% rename from api/routes/statuses.js rename to api/src/routes/statuses.js diff --git a/api/src/services/calendarService.d.ts b/api/src/services/calendarService.d.ts new file mode 100644 index 0000000..6273805 --- /dev/null +++ b/api/src/services/calendarService.d.ts @@ -0,0 +1,6 @@ +export declare function createEvent(eventObject: any): Promise; +export declare function updateEvent(eventObject: any): Promise; +export declare function cancelEvent(eventID: any): Promise; +export declare function getShortEventsInRange(startDate: any, endDate: any): Promise; +export declare function getEventDetailed(eventID: any): Promise; +//# sourceMappingURL=calendarService.d.ts.map \ No newline at end of file diff --git a/api/src/services/calendarService.d.ts.map b/api/src/services/calendarService.d.ts.map new file mode 100644 index 0000000..156c9d6 --- /dev/null +++ b/api/src/services/calendarService.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"calendarService.d.ts","sourceRoot":"","sources":["calendarService.ts"],"names":[],"mappings":"AAEA,wBAAsB,WAAW,CAAC,WAAW,KAAA,iBAE5C;AAED,wBAAsB,WAAW,CAAC,WAAW,KAAA,iBAE5C;AAED,wBAAsB,WAAW,CAAC,OAAO,KAAA,iBAExC;AAED,wBAAsB,qBAAqB,CAAC,SAAS,KAAA,EAAE,OAAO,KAAA,iBAE7D;AAED,wBAAsB,gBAAgB,CAAC,OAAO,KAAA,iBAE7C"} \ No newline at end of file diff --git a/api/src/services/calendarService.js b/api/src/services/calendarService.js new file mode 100644 index 0000000..ee8e08e --- /dev/null +++ b/api/src/services/calendarService.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createEvent = createEvent; +exports.updateEvent = updateEvent; +exports.cancelEvent = cancelEvent; +exports.getShortEventsInRange = getShortEventsInRange; +exports.getEventDetailed = getEventDetailed; +const pool = require('../db'); +async function createEvent(eventObject) { +} +async function updateEvent(eventObject) { +} +async function cancelEvent(eventID) { +} +async function getShortEventsInRange(startDate, endDate) { +} +async function getEventDetailed(eventID) { +} +//# sourceMappingURL=calendarService.js.map \ No newline at end of file diff --git a/api/src/services/calendarService.js.map b/api/src/services/calendarService.js.map new file mode 100644 index 0000000..e8a02ee --- /dev/null +++ b/api/src/services/calendarService.js.map @@ -0,0 +1 @@ +{"version":3,"file":"calendarService.js","sourceRoot":"","sources":["calendarService.ts"],"names":[],"mappings":";;AAEA,kCAEC;AAED,kCAEC;AAED,kCAEC;AAED,sDAEC;AAED,4CAEC;AApBD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;AAEtB,KAAK,UAAU,WAAW,CAAC,WAAW;AAE7C,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,WAAW;AAE7C,CAAC;AAEM,KAAK,UAAU,WAAW,CAAC,OAAO;AAEzC,CAAC;AAEM,KAAK,UAAU,qBAAqB,CAAC,SAAS,EAAE,OAAO;AAE9D,CAAC;AAEM,KAAK,UAAU,gBAAgB,CAAC,OAAO;AAE9C,CAAC"} \ No newline at end of file diff --git a/api/src/services/calendarService.ts b/api/src/services/calendarService.ts new file mode 100644 index 0000000..48ea943 --- /dev/null +++ b/api/src/services/calendarService.ts @@ -0,0 +1,36 @@ +// const pool = require('../db'); +import pool from '../db'; + +export interface CalendarEvent { + id: number; + name: string; + start: Date; // DATETIME → Date + end: Date; // DATETIME → Date + location: string; + color: string; // CHAR(7) like "#3b82f6" + description?: string | null; + creator?: number | null; // foreign key to members.id, nullable + cancelled: boolean; // TINYINT(1) → boolean + created_at: Date; // TIMESTAMP → Date + updated_at: Date; // TIMESTAMP → Date +} + +export async function createEvent(eventObject) { + +} + +export async function updateEvent(eventObject) { + +} + +export async function cancelEvent(eventID) { + +} + +export async function getShortEventsInRange(startDate, endDate) { + +} + +export async function getEventDetailed(eventID) { + +} \ No newline at end of file diff --git a/api/services/rankService.js b/api/src/services/rankService.js similarity index 100% rename from api/services/rankService.js rename to api/src/services/rankService.js diff --git a/api/tsconfig.json b/api/tsconfig.json new file mode 100644 index 0000000..60ac138 --- /dev/null +++ b/api/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "outDir": "./built", + "allowJs": true, + "target": "es5", + "types": [ + "node", + "express" + ] + }, + "include": [ + "./src/**/*" + ] +} \ No newline at end of file