From 2e3d0a755cc51619c90a5ed407420fbaa6ab692b Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Fri, 25 Apr 2025 08:18:49 +0200 Subject: [PATCH] setup routine --- .../{setting.ts => settingController.ts} | 2 +- src/controller/inviteController.ts | 4 +- src/controller/setupController.ts | 87 +++++++++++++++++++ src/middleware/multer.ts | 27 ++++++ src/routes/admin/management/setting.ts | 7 +- src/routes/admin/management/user.ts | 1 - src/routes/invite.ts | 3 +- src/routes/setup.ts | 29 +++++-- 8 files changed, 147 insertions(+), 13 deletions(-) rename src/controller/admin/management/{setting.ts => settingController.ts} (95%) create mode 100644 src/middleware/multer.ts diff --git a/src/controller/admin/management/setting.ts b/src/controller/admin/management/settingController.ts similarity index 95% rename from src/controller/admin/management/setting.ts rename to src/controller/admin/management/settingController.ts index 84a302f..784ffb3 100644 --- a/src/controller/admin/management/setting.ts +++ b/src/controller/admin/management/settingController.ts @@ -9,7 +9,7 @@ import { SettingString } from "../../../type/settingTypes"; * @returns {Promise<*>} */ export async function getSettings(req: Request, res: Response): Promise { - res.json(SettingHelper.getAllSettings()); + res.json({ ...SettingHelper.getAllSettings(), ["mail.password"]: undefined }); } /** diff --git a/src/controller/inviteController.ts b/src/controller/inviteController.ts index 769260f..a183cbc 100644 --- a/src/controller/inviteController.ts +++ b/src/controller/inviteController.ts @@ -35,7 +35,7 @@ export async function getInvites(req: Request, res: Response): Promise { * @param res {Response} Express res object * @returns {Promise<*>} */ -export async function inviteUser(req: Request, res: Response, isInvite: boolean = true): Promise { +export async function inviteUser(req: Request, res: Response, isSetup: boolean = false): Promise { let origin = req.headers.origin; let username = req.body.username; let mail = req.body.mail; @@ -71,7 +71,7 @@ export async function inviteUser(req: Request, res: Response, isInvite: boolean await MailHelper.sendMail( mail, `Email Bestätigung für Mitglieder Admin-Portal von ${SettingHelper.getSetting("club.name")}`, - `Öffne folgenden Link: ${origin}/${isInvite ? "invite" : "setup"}/verify?mail=${mail}&token=${token}` + `Öffne folgenden Link: ${origin}/${isSetup ? "setup" : "invite"}/verify?mail=${mail}&token=${token}` ); res.sendStatus(204); diff --git a/src/controller/setupController.ts b/src/controller/setupController.ts index f71194f..0221fdb 100644 --- a/src/controller/setupController.ts +++ b/src/controller/setupController.ts @@ -1,4 +1,5 @@ import { Request, Response } from "express"; +import SettingHelper from "../helpers/settingsHelper"; /** * @description Service is currently not configured @@ -9,3 +10,89 @@ import { Request, Response } from "express"; export async function isSetup(req: Request, res: Response): Promise { res.sendStatus(204); } + +/** + * @description set club identity + * @param req {Request} Express req object + * @param res {Response} Express res object + * @returns {Promise<*>} + */ +export async function setClubIdentity(req: Request, res: Response): Promise { + const name = req.body.name; + const imprint = req.body.imprint; + const privacy = req.body.privacy; + const website = req.body.website; + + if (name) { + await SettingHelper.setSetting("club.name", name); + } else { + await SettingHelper.resetSetting("club.name"); + } + + if (imprint) { + await SettingHelper.setSetting("club.imprint", imprint); + } else { + await SettingHelper.resetSetting("club.imprint"); + } + + if (privacy) { + await SettingHelper.setSetting("club.privacy", privacy); + } else { + await SettingHelper.resetSetting("club.privacy"); + } + + if (website) { + await SettingHelper.setSetting("club.website", website); + } else { + await SettingHelper.resetSetting("club.website"); + } + + res.sendStatus(204); +} + +/** + * @description set applucation icon and logo + * @param req {Request} Express req object + * @param res {Response} Express res object + * @returns {Promise<*>} + */ +export async function uploadClubImages(req: Request, res: Response): Promise { + if (req.files && !Array.isArray(req.files) && req.files.icon) { + await SettingHelper.setSetting("club.icon", "configured"); + } else { + await SettingHelper.resetSetting("club.icon"); + } + + if (req.files && !Array.isArray(req.files) && req.files.logo) { + await SettingHelper.setSetting("club.logo", "configured"); + } else { + await SettingHelper.resetSetting("club.logo"); + } + + res.sendStatus(204); +} + +/** + * @description set app identity + * @param req {Request} Express req object + * @param res {Response} Express res object + * @returns {Promise<*>} + */ +export async function setAppIdentity(req: Request, res: Response): Promise { + const custom_login_message = req.body.custom_login_message; + const show_link_to_calendar = req.body.show_link_to_calendar; + + if (custom_login_message) { + await SettingHelper.setSetting("app.custom_login_message", custom_login_message); + } else { + await SettingHelper.resetSetting("app.custom_login_message"); + } + + if (show_link_to_calendar) { + await SettingHelper.setSetting("app.show_link_to_calendar", show_link_to_calendar); + } else { + await SettingHelper.resetSetting("app.show_link_to_calendar"); + } + + res.sendStatus(204); +} diff --git a/src/middleware/multer.ts b/src/middleware/multer.ts new file mode 100644 index 0000000..fbd6822 --- /dev/null +++ b/src/middleware/multer.ts @@ -0,0 +1,27 @@ +import multer from "multer"; +import { FileSystemHelper } from "../helpers/fileSystemHelper"; +import path from "path"; + +export const clubImageStorage = multer.diskStorage({ + destination: FileSystemHelper.formatPath("/app"), + filename: function (req, file, cb) { + const fileExtension = path.extname(file.originalname).toLowerCase(); + + if (file.fieldname === "icon") { + cb(null, "company-icon" + fileExtension); + } else if (file.fieldname === "logo") { + cb(null, "company-logo" + fileExtension); + } else { + cb(null, file.originalname); + } + }, +}); + +export const clubImageMulter = multer({ + storage: clubImageStorage, +}); + +export const clubImageUpload = clubImageMulter.fields([ + { name: "icon", maxCount: 1 }, + { name: "logo", maxCount: 1 }, +]); diff --git a/src/routes/admin/management/setting.ts b/src/routes/admin/management/setting.ts index e0ffe14..8f3ef61 100644 --- a/src/routes/admin/management/setting.ts +++ b/src/routes/admin/management/setting.ts @@ -1,6 +1,11 @@ import express, { Request, Response } from "express"; import PermissionHelper from "../../../helpers/permissionHelper"; -import { getSetting, getSettings, resetSetting, setSetting } from "../../../controller/admin/management/setting"; +import { + getSetting, + getSettings, + resetSetting, + setSetting, +} from "../../../controller/admin/management/settingController"; var router = express.Router({ mergeParams: true }); diff --git a/src/routes/admin/management/user.ts b/src/routes/admin/management/user.ts index 3a419d6..15d3e27 100644 --- a/src/routes/admin/management/user.ts +++ b/src/routes/admin/management/user.ts @@ -10,7 +10,6 @@ import { updateUserPermissions, updateUserRoles, } from "../../../controller/admin/management/userController"; -import { inviteUser } from "../../../controller/inviteController"; var router = express.Router({ mergeParams: true }); diff --git a/src/routes/invite.ts b/src/routes/invite.ts index 783ecef..5d8794e 100644 --- a/src/routes/invite.ts +++ b/src/routes/invite.ts @@ -1,6 +1,5 @@ import express from "express"; -import { isSetup } from "../controller/setupController"; -import { finishInvite, inviteUser, verifyInvite } from "../controller/inviteController"; +import { finishInvite, verifyInvite } from "../controller/inviteController"; import ParamaterPassCheckHelper from "../helpers/parameterPassCheckHelper"; var router = express.Router({ mergeParams: true }); diff --git a/src/routes/setup.ts b/src/routes/setup.ts index 36cd725..8f31a0b 100644 --- a/src/routes/setup.ts +++ b/src/routes/setup.ts @@ -1,7 +1,8 @@ import express from "express"; -import { isSetup } from "../controller/setupController"; +import { isSetup, setAppIdentity, setClubIdentity, uploadClubImages } from "../controller/setupController"; import { finishInvite, inviteUser, verifyInvite } from "../controller/inviteController"; import ParamaterPassCheckHelper from "../helpers/parameterPassCheckHelper"; +import { clubImageUpload } from "../middleware/multer"; var router = express.Router({ mergeParams: true }); @@ -9,21 +10,37 @@ router.get("/", async (req, res) => { await isSetup(req, res); }); +router.post("/club", async (req, res) => { + await setClubIdentity(req, res); +}); + +router.post("/club/images", clubImageUpload, async (req, res) => { + await uploadClubImages(req, res); +}); + +router.post("/app", async (req, res) => { + await setAppIdentity(req, res); +}); + router.post("/verify", ParamaterPassCheckHelper.requiredIncludedMiddleware(["mail", "token"]), async (req, res) => { await verifyInvite(req, res); }); router.post( - "/", + "/me", ParamaterPassCheckHelper.requiredIncludedMiddleware(["username", "mail", "firstname", "lastname"]), async (req, res) => { - await inviteUser(req, res, false); + await inviteUser(req, res, true); } ); -router.put("/", ParamaterPassCheckHelper.requiredIncludedMiddleware(["mail", "token", "totp"]), async (req, res) => { - await finishInvite(req, res, true); -}); +router.post( + "/finish", + ParamaterPassCheckHelper.requiredIncludedMiddleware(["mail", "token", "totp"]), + async (req, res) => { + await finishInvite(req, res, true); + } +); /** * TODO: