Compare commits
2 commits
b4a7986c8a
...
2e3d0a755c
Author | SHA1 | Date | |
---|---|---|---|
2e3d0a755c | |||
70edd165ee |
10 changed files with 166 additions and 24 deletions
|
@ -9,7 +9,7 @@ import { SettingString } from "../../../type/settingTypes";
|
||||||
* @returns {Promise<*>}
|
* @returns {Promise<*>}
|
||||||
*/
|
*/
|
||||||
export async function getSettings(req: Request, res: Response): Promise<any> {
|
export async function getSettings(req: Request, res: Response): Promise<any> {
|
||||||
res.json(SettingHelper.getAllSettings());
|
res.json({ ...SettingHelper.getAllSettings(), ["mail.password"]: undefined });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -35,7 +35,7 @@ export async function getInvites(req: Request, res: Response): Promise<any> {
|
||||||
* @param res {Response} Express res object
|
* @param res {Response} Express res object
|
||||||
* @returns {Promise<*>}
|
* @returns {Promise<*>}
|
||||||
*/
|
*/
|
||||||
export async function inviteUser(req: Request, res: Response, isInvite: boolean = true): Promise<any> {
|
export async function inviteUser(req: Request, res: Response, isSetup: boolean = false): Promise<any> {
|
||||||
let origin = req.headers.origin;
|
let origin = req.headers.origin;
|
||||||
let username = req.body.username;
|
let username = req.body.username;
|
||||||
let mail = req.body.mail;
|
let mail = req.body.mail;
|
||||||
|
@ -71,7 +71,7 @@ export async function inviteUser(req: Request, res: Response, isInvite: boolean
|
||||||
await MailHelper.sendMail(
|
await MailHelper.sendMail(
|
||||||
mail,
|
mail,
|
||||||
`Email Bestätigung für Mitglieder Admin-Portal von ${SettingHelper.getSetting("club.name")}`,
|
`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);
|
res.sendStatus(204);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { Request, Response } from "express";
|
import { Request, Response } from "express";
|
||||||
|
import SettingHelper from "../helpers/settingsHelper";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Service is currently not configured
|
* @description Service is currently not configured
|
||||||
|
@ -9,3 +10,89 @@ import { Request, Response } from "express";
|
||||||
export async function isSetup(req: Request, res: Response): Promise<any> {
|
export async function isSetup(req: Request, res: Response): Promise<any> {
|
||||||
res.sendStatus(204);
|
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<any> {
|
||||||
|
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<any> {
|
||||||
|
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<any> {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -64,17 +64,19 @@ export default abstract class SettingHelper {
|
||||||
* @param key The key of the setting
|
* @param key The key of the setting
|
||||||
* @param value The value to set
|
* @param value The value to set
|
||||||
*/
|
*/
|
||||||
public static async setSetting(key: SettingString, value: string): Promise<void> {
|
public static async setSetting<K extends SettingString>(key: K, value: SettingValueMapping[K]): Promise<void> {
|
||||||
if (value === undefined || value === null) return;
|
if (value === undefined || value === null) return;
|
||||||
|
|
||||||
|
const stringValue = String(value);
|
||||||
|
|
||||||
const settingType = settingsType[key];
|
const settingType = settingsType[key];
|
||||||
this.validateSetting(key, value);
|
this.validateSetting(key, stringValue);
|
||||||
|
|
||||||
const oldValue = this.getSetting(key);
|
const oldValue = this.getSetting(key);
|
||||||
let finalValue = value;
|
let finalValue = stringValue;
|
||||||
|
|
||||||
if (typeof settingType.type === "string" && settingType.type.includes("/crypt")) {
|
if (typeof settingType.type === "string" && settingType.type.includes("/crypt")) {
|
||||||
finalValue = CodingHelper.encrypt(APPLICATION_SECRET, value);
|
finalValue = CodingHelper.encrypt(APPLICATION_SECRET, stringValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.settings[key] = finalValue;
|
this.settings[key] = finalValue;
|
||||||
|
@ -95,6 +97,8 @@ export default abstract class SettingHelper {
|
||||||
* @param key The key of the setting
|
* @param key The key of the setting
|
||||||
*/
|
*/
|
||||||
public static async resetSetting(key: SettingString): Promise<void> {
|
public static async resetSetting(key: SettingString): Promise<void> {
|
||||||
|
if (this.getSetting(key) == String(settingsType[key].default ?? "")) return;
|
||||||
|
|
||||||
const oldValue = this.getSetting(key);
|
const oldValue = this.getSetting(key);
|
||||||
|
|
||||||
const settingType = settingsType[key];
|
const settingType = settingsType[key];
|
||||||
|
|
27
src/middleware/multer.ts
Normal file
27
src/middleware/multer.ts
Normal file
|
@ -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 },
|
||||||
|
]);
|
|
@ -1,6 +1,7 @@
|
||||||
import { MigrationInterface, QueryRunner } from "typeorm";
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
import { setting_table } from "./baseSchemaTables/admin";
|
import { setting_table } from "./baseSchemaTables/admin";
|
||||||
import SettingHelper from "../helpers/settingsHelper";
|
import SettingHelper from "../helpers/settingsHelper";
|
||||||
|
import ms from "ms";
|
||||||
|
|
||||||
export class SettingsFromEnv1745059495808 implements MigrationInterface {
|
export class SettingsFromEnv1745059495808 implements MigrationInterface {
|
||||||
name = "SettingsFromEnv1745059495808";
|
name = "SettingsFromEnv1745059495808";
|
||||||
|
@ -11,16 +12,19 @@ export class SettingsFromEnv1745059495808 implements MigrationInterface {
|
||||||
//transfer settings of env to database
|
//transfer settings of env to database
|
||||||
await SettingHelper.setSetting("club.name", process.env.CLUB_NAME);
|
await SettingHelper.setSetting("club.name", process.env.CLUB_NAME);
|
||||||
await SettingHelper.setSetting("club.website", process.env.CLUB_WEBSITE);
|
await SettingHelper.setSetting("club.website", process.env.CLUB_WEBSITE);
|
||||||
await SettingHelper.setSetting("session.jwt_expiration", process.env.JWT_EXPIRATION);
|
await SettingHelper.setSetting("session.jwt_expiration", process.env.JWT_EXPIRATION as ms.StringValue);
|
||||||
await SettingHelper.setSetting("session.refresh_expiration", process.env.REFRESH_EXPIRATION);
|
await SettingHelper.setSetting("session.refresh_expiration", process.env.REFRESH_EXPIRATION as ms.StringValue);
|
||||||
await SettingHelper.setSetting("session.pwa_refresh_expiration", process.env.PWA_REFRESH_EXPIRATION);
|
await SettingHelper.setSetting(
|
||||||
|
"session.pwa_refresh_expiration",
|
||||||
|
process.env.PWA_REFRESH_EXPIRATION as ms.StringValue
|
||||||
|
);
|
||||||
await SettingHelper.setSetting("mail.username", process.env.MAIL_USERNAME);
|
await SettingHelper.setSetting("mail.username", process.env.MAIL_USERNAME);
|
||||||
await SettingHelper.setSetting("mail.password", process.env.MAIL_PASSWORD);
|
await SettingHelper.setSetting("mail.password", process.env.MAIL_PASSWORD);
|
||||||
await SettingHelper.setSetting("mail.host", process.env.MAIL_HOST);
|
await SettingHelper.setSetting("mail.host", process.env.MAIL_HOST);
|
||||||
await SettingHelper.setSetting("mail.port", process.env.MAIL_PORT);
|
await SettingHelper.setSetting("mail.port", Number(process.env.MAIL_PORT));
|
||||||
await SettingHelper.setSetting("mail.secure", process.env.MAIL_SECURE);
|
await SettingHelper.setSetting("mail.secure", Boolean(process.env.MAIL_SECURE));
|
||||||
await SettingHelper.setSetting("backup.interval", process.env.BACKUP_INTERVAL);
|
await SettingHelper.setSetting("backup.interval", Number(process.env.BACKUP_INTERVAL));
|
||||||
await SettingHelper.setSetting("backup.copies", process.env.BACKUP_COPIES);
|
await SettingHelper.setSetting("backup.copies", Number(process.env.BACKUP_COPIES));
|
||||||
}
|
}
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
import express, { Request, Response } from "express";
|
import express, { Request, Response } from "express";
|
||||||
import PermissionHelper from "../../../helpers/permissionHelper";
|
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 });
|
var router = express.Router({ mergeParams: true });
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ import {
|
||||||
updateUserPermissions,
|
updateUserPermissions,
|
||||||
updateUserRoles,
|
updateUserRoles,
|
||||||
} from "../../../controller/admin/management/userController";
|
} from "../../../controller/admin/management/userController";
|
||||||
import { inviteUser } from "../../../controller/inviteController";
|
|
||||||
|
|
||||||
var router = express.Router({ mergeParams: true });
|
var router = express.Router({ mergeParams: true });
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import express from "express";
|
import express from "express";
|
||||||
import { isSetup } from "../controller/setupController";
|
import { finishInvite, verifyInvite } from "../controller/inviteController";
|
||||||
import { finishInvite, inviteUser, verifyInvite } from "../controller/inviteController";
|
|
||||||
import ParamaterPassCheckHelper from "../helpers/parameterPassCheckHelper";
|
import ParamaterPassCheckHelper from "../helpers/parameterPassCheckHelper";
|
||||||
|
|
||||||
var router = express.Router({ mergeParams: true });
|
var router = express.Router({ mergeParams: true });
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import express from "express";
|
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 { finishInvite, inviteUser, verifyInvite } from "../controller/inviteController";
|
||||||
import ParamaterPassCheckHelper from "../helpers/parameterPassCheckHelper";
|
import ParamaterPassCheckHelper from "../helpers/parameterPassCheckHelper";
|
||||||
|
import { clubImageUpload } from "../middleware/multer";
|
||||||
|
|
||||||
var router = express.Router({ mergeParams: true });
|
var router = express.Router({ mergeParams: true });
|
||||||
|
|
||||||
|
@ -9,21 +10,37 @@ router.get("/", async (req, res) => {
|
||||||
await isSetup(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) => {
|
router.post("/verify", ParamaterPassCheckHelper.requiredIncludedMiddleware(["mail", "token"]), async (req, res) => {
|
||||||
await verifyInvite(req, res);
|
await verifyInvite(req, res);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.post(
|
router.post(
|
||||||
"/",
|
"/me",
|
||||||
ParamaterPassCheckHelper.requiredIncludedMiddleware(["username", "mail", "firstname", "lastname"]),
|
ParamaterPassCheckHelper.requiredIncludedMiddleware(["username", "mail", "firstname", "lastname"]),
|
||||||
async (req, res) => {
|
async (req, res) => {
|
||||||
await inviteUser(req, res, false);
|
await inviteUser(req, res, true);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
router.put("/", ParamaterPassCheckHelper.requiredIncludedMiddleware(["mail", "token", "totp"]), async (req, res) => {
|
router.post(
|
||||||
await finishInvite(req, res, true);
|
"/finish",
|
||||||
});
|
ParamaterPassCheckHelper.requiredIncludedMiddleware(["mail", "token", "totp"]),
|
||||||
|
async (req, res) => {
|
||||||
|
await finishInvite(req, res, true);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO:
|
* TODO:
|
||||||
|
|
Loading…
Add table
Reference in a new issue