mirror of
https://github.com/detleph/server.git
synced 2026-09-07 23:44:40 +02:00
Merge branch 'main' into dev
This commit is contained in:
@@ -14,4 +14,5 @@ Before Runningthis on you local machine some things have to be setup
|
|||||||
DOMAIN: THE DOMAIN NAME OF THE SERVER
|
DOMAIN: THE DOMAIN NAME OF THE SERVER
|
||||||
MAILPASSWORD: THE PASSWORD FOR THE MAIL ACCOUNT
|
MAILPASSWORD: THE PASSWORD FOR THE MAIL ACCOUNT
|
||||||
DEV: SWITCH FOR DEV MODE AFFECTS EMAIL SERVER
|
DEV: SWITCH FOR DEV MODE AFFECTS EMAIL SERVER
|
||||||
|
ALLOW_ORIGIN: ORIGIN OF THE PRODUCTION CLIENT (FOR CORS)
|
||||||
```
|
```
|
||||||
|
|||||||
+3
-1
@@ -20,6 +20,7 @@
|
|||||||
"homepage": "https://github.com/detleph/server#readme",
|
"homepage": "https://github.com/detleph/server#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/client": "^3.3.0",
|
"@prisma/client": "^3.3.0",
|
||||||
|
"@types/cors": "^2.8.12",
|
||||||
"@types/handlebars": "^4.1.0",
|
"@types/handlebars": "^4.1.0",
|
||||||
"@types/express-fileupload": "^1.2.1",
|
"@types/express-fileupload": "^1.2.1",
|
||||||
"@types/jsonwebtoken": "^8.5.5",
|
"@types/jsonwebtoken": "^8.5.5",
|
||||||
@@ -28,13 +29,14 @@
|
|||||||
"@types/nodemailer": "^6.4.4",
|
"@types/nodemailer": "^6.4.4",
|
||||||
"@types/redis": "^2.8.32",
|
"@types/redis": "^2.8.32",
|
||||||
"argon2": "^0.28.2",
|
"argon2": "^0.28.2",
|
||||||
|
"cors": "^2.8.5",
|
||||||
"dotenv": "^10.0.0",
|
"dotenv": "^10.0.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"handlebars": "^4.7.7",
|
|
||||||
"express-async-errors": "^3.1.1",
|
"express-async-errors": "^3.1.1",
|
||||||
"express-fileupload": "^1.2.1",
|
"express-fileupload": "^1.2.1",
|
||||||
"file-type": "^16.5.3",
|
"file-type": "^16.5.3",
|
||||||
"is-svg": "^4.3.2",
|
"is-svg": "^4.3.2",
|
||||||
|
"handlebars": "^4.7.7",
|
||||||
"jsonwebtoken": "^8.5.1",
|
"jsonwebtoken": "^8.5.1",
|
||||||
"mjml": "^4.11.0",
|
"mjml": "^4.11.0",
|
||||||
"nanoid": "^3.3.3",
|
"nanoid": "^3.3.3",
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
import { Request, Response } from "express";
|
||||||
|
|
||||||
|
// Only called when no other route matches
|
||||||
|
export function notFoundHandler(req: Request, res: Response) {
|
||||||
|
return res.status(404).json({
|
||||||
|
type: "error",
|
||||||
|
payload: {
|
||||||
|
message: `The ${req.method} HTTP method is implemented for '${req.path}'`,
|
||||||
|
_links: [
|
||||||
|
{
|
||||||
|
rel: "root",
|
||||||
|
href: "/api",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function rootHandler(req: Request, res: Response) {
|
||||||
|
return res.status(200).json({
|
||||||
|
type: "success",
|
||||||
|
payload: {
|
||||||
|
message: "Detleph event API",
|
||||||
|
detail: "This is the API for the Detleph event system",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
+40
-14
@@ -3,6 +3,7 @@ import prisma from "./lib/prisma";
|
|||||||
import eventRouter from "./Routes/event.routes";
|
import eventRouter from "./Routes/event.routes";
|
||||||
import adminAuthRouter from "./Routes/admin_auth.routes";
|
import adminAuthRouter from "./Routes/admin_auth.routes";
|
||||||
import argon2 from "argon2";
|
import argon2 from "argon2";
|
||||||
|
import cors from "cors";
|
||||||
import adminRouter from "./Routes/admin.routes";
|
import adminRouter from "./Routes/admin.routes";
|
||||||
import organisationRouter from "./Routes/organisation.routes";
|
import organisationRouter from "./Routes/organisation.routes";
|
||||||
import groupRouter from "./Routes/group.routes";
|
import groupRouter from "./Routes/group.routes";
|
||||||
@@ -12,6 +13,7 @@ import defaultErrorHandler from "./Middleware/error/handler";
|
|||||||
import logger from "./Middleware/error/logger";
|
import logger from "./Middleware/error/logger";
|
||||||
import debugLogger from "./Middleware/debug/logger";
|
import debugLogger from "./Middleware/debug/logger";
|
||||||
import mediaRouter from "./Routes/media.routes";
|
import mediaRouter from "./Routes/media.routes";
|
||||||
|
import { notFoundHandler, rootHandler } from "./Middleware/error/defaultRoutes";
|
||||||
|
|
||||||
// Set up async error handling
|
// Set up async error handling
|
||||||
require("express-async-errors");
|
require("express-async-errors");
|
||||||
@@ -20,21 +22,40 @@ require("dotenv").config(); // Load dotenv config
|
|||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
|
|
||||||
if (process.env.NODE_ENV === "development") {
|
|
||||||
logger.info("Using development mode");
|
|
||||||
}
|
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
// Dev
|
if (process.env.NODE_ENV === "development") {
|
||||||
await prisma.admin.upsert({
|
logger.info("Using development mode");
|
||||||
where: { id: 1 },
|
logger.warning(
|
||||||
create: {
|
"This mode should not be used in any production-near environment as it is significantly less secure than the production mode"
|
||||||
name: "admin",
|
);
|
||||||
password: await argon2.hash("test", { type: argon2.argon2id }),
|
|
||||||
permission_level: "ELEVATED",
|
// TODO: How should you login to the prod server by default? Maybe random password?
|
||||||
},
|
await prisma.admin.upsert({
|
||||||
update: {},
|
where: { id: 1 },
|
||||||
});
|
create: {
|
||||||
|
name: "admin",
|
||||||
|
password: await argon2.hash("test", { type: argon2.argon2id }),
|
||||||
|
permission_level: "ELEVATED",
|
||||||
|
},
|
||||||
|
update: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Allow all CORS requests
|
||||||
|
app.use(cors());
|
||||||
|
} else {
|
||||||
|
logger.info("Using production mode");
|
||||||
|
|
||||||
|
// Configure cors
|
||||||
|
app.use(
|
||||||
|
cors({
|
||||||
|
origin: process.env.ALLOW_ORIGIN,
|
||||||
|
allowedHeaders: ["Content-Type", "Authorization"],
|
||||||
|
preflightContinue: false,
|
||||||
|
methods: ["GET", "PUT", "PATCH", "POST", "DELETE"],
|
||||||
|
optionsSuccessStatus: 204,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Todo: Everything
|
// Todo: Everything
|
||||||
|
|
||||||
@@ -61,6 +82,9 @@ async function main() {
|
|||||||
app.use("/api/role-schemas", roleSchemaRouter);
|
app.use("/api/role-schemas", roleSchemaRouter);
|
||||||
|
|
||||||
app.use("/api/media", mediaRouter);
|
app.use("/api/media", mediaRouter);
|
||||||
|
|
||||||
|
app.get("/", rootHandler);
|
||||||
|
app.get("/api", rootHandler);
|
||||||
|
|
||||||
// Error handling
|
// Error handling
|
||||||
app.use(defaultErrorHandler); // This has to be the LAST ROUTE
|
app.use(defaultErrorHandler); // This has to be the LAST ROUTE
|
||||||
@@ -68,6 +92,8 @@ async function main() {
|
|||||||
// Disable the media router for now
|
// Disable the media router for now
|
||||||
// app.use("/api/media", mediaRouter);
|
// app.use("/api/media", mediaRouter);
|
||||||
|
|
||||||
|
app.use(notFoundHandler);
|
||||||
|
|
||||||
app.listen(process.env.PORT, () => {
|
app.listen(process.env.PORT, () => {
|
||||||
logger.info(`Listening on port ${process.env.PORT}`);
|
logger.info(`Listening on port ${process.env.PORT}`);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user