provide setting endbpoints

This commit is contained in:
Julian Krauser 2025-04-20 16:15:27 +02:00
parent a8edc19f34
commit 7aa9038a61
11 changed files with 137 additions and 13 deletions

18
package-lock.json generated
View file

@ -20,6 +20,7 @@
"ics": "^3.8.1",
"ip": "^2.0.1",
"jsonwebtoken": "^9.0.2",
"lodash.clonedeep": "^4.5.0",
"lodash.uniqby": "^4.7.0",
"moment": "^2.30.1",
"morgan": "^1.10.0",
@ -45,6 +46,7 @@
"@types/express": "^5.0.1",
"@types/ip": "^1.1.3",
"@types/jsonwebtoken": "^9.0.6",
"@types/lodash.clonedeep": "^4.5.9",
"@types/lodash.uniqby": "^4.7.9",
"@types/morgan": "^1.9.9",
"@types/ms": "^2.1.0",
@ -462,6 +464,16 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/lodash.clonedeep": {
"version": "4.5.9",
"resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.9.tgz",
"integrity": "sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/lodash": "*"
}
},
"node_modules/@types/lodash.uniqby": {
"version": "4.7.9",
"resolved": "https://registry.npmjs.org/@types/lodash.uniqby/-/lodash.uniqby-4.7.9.tgz",
@ -2770,6 +2782,12 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
"node_modules/lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
"license": "MIT"
},
"node_modules/lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",

View file

@ -36,6 +36,7 @@
"ics": "^3.8.1",
"ip": "^2.0.1",
"jsonwebtoken": "^9.0.2",
"lodash.clonedeep": "^4.5.0",
"lodash.uniqby": "^4.7.0",
"moment": "^2.30.1",
"morgan": "^1.10.0",
@ -61,6 +62,7 @@
"@types/express": "^5.0.1",
"@types/ip": "^1.1.3",
"@types/jsonwebtoken": "^9.0.6",
"@types/lodash.clonedeep": "^4.5.9",
"@types/lodash.uniqby": "^4.7.9",
"@types/morgan": "^1.9.9",
"@types/ms": "^2.1.0",

View file

@ -1,7 +1,7 @@
import { dataSource } from "../data-source";
import { setting } from "../entity/setting";
import DatabaseActionException from "../exceptions/databaseActionException";
import { StringHelper } from "../helpers/stringHelper";
import { dataSource } from "../../../data-source";
import { setting } from "../../../entity/setting";
import DatabaseActionException from "../../../exceptions/databaseActionException";
import { StringHelper } from "../../../helpers/stringHelper";
import { CreateOrUpdateSettingCommand, DeleteSettingCommand } from "./settingCommand";
export default abstract class SettingCommandHandler {

View file

@ -0,0 +1,60 @@
import { Request, Response } from "express";
import SettingHelper from "../../../helpers/settingsHelper";
import { SettingString } from "../../../type/settingTypes";
/**
* @description get All settings
* @param req {Request} Express req object
* @param res {Response} Express res object
* @returns {Promise<*>}
*/
export async function getSettings(req: Request, res: Response): Promise<any> {
res.json(SettingHelper.getAllSettings());
}
/**
* @description get setting
* @param req {Request} Express req object
* @param res {Response} Express res object
* @returns {Promise<*>}
*/
export async function getSetting(req: Request, res: Response): Promise<any> {
let setting = req.params.setting as SettingString;
let value = SettingHelper.getSetting(setting);
if (setting == "mail.password") {
value = undefined;
}
res.send(value);
}
/**
* @description set setting
* @param req {Request} Express req object
* @param res {Response} Express res object
* @returns {Promise<*>}
*/
export async function setSetting(req: Request, res: Response): Promise<any> {
let setting = req.body.setting as SettingString;
let value = req.body.value as string;
SettingHelper.setSetting(setting, value);
res.sendStatus(204);
}
/**
* @description reset setting
* @param req {Request} Express req object
* @param res {Response} Express res object
* @returns {Promise<*>}
*/
export async function resetSetting(req: Request, res: Response): Promise<any> {
let setting = req.params.setting as SettingString;
SettingHelper.resetSetting(setting);
res.sendStatus(204);
}

View file

@ -1,7 +1,7 @@
import { SettingString, settingsType, SettingTopic, SettingTypeAtom, SettingValueMapping } from "../type/settingTypes";
import { CodingHelper } from "./codingHelper";
import SettingCommandHandler from "../command/settingCommandHandler";
import SettingService from "../service/settingService";
import SettingCommandHandler from "../command/management/setting/settingCommandHandler";
import SettingService from "../service/management/settingService";
import { APPLICATION_SECRET } from "../env.defaults";
import {
BooleanConverter,
@ -12,6 +12,7 @@ import {
TypeConverter,
UrlConverter,
} from "./convertHelper";
import cloneDeep from "lodash.clonedeep";
export default abstract class SettingHelper {
private static settings: { [key in SettingString]?: string } = {};
@ -28,6 +29,10 @@ export default abstract class SettingHelper {
ms: new MsConverter(),
};
public static getAllSettings() {
return cloneDeep(this.settings);
}
/**
* Returns the value of a setting with the correct type based on the key
* @param key The key of the setting

View file

@ -26,6 +26,7 @@ import user from "./management/user";
import invite from "./management/invite";
import api from "./management/webapi";
import backup from "./management/backup";
import setting from "./management/setting";
var router = express.Router({ mergeParams: true });
@ -159,5 +160,6 @@ router.use(
PermissionHelper.passCheckMiddleware("read", "management", "backup"),
backup
);
router.use("/setting", PermissionHelper.passCheckMiddleware("read", "management", "setting"), setting);
export default router;

View file

@ -0,0 +1,31 @@
import express, { Request, Response } from "express";
import PermissionHelper from "../../../helpers/permissionHelper";
import { getSetting, getSettings, resetSetting, setSetting } from "../../../controller/admin/management/setting";
var router = express.Router({ mergeParams: true });
router.get("/", async (req: Request, res: Response) => {
await getSettings(req, res);
});
router.get("/:setting", async (req: Request, res: Response) => {
await getSetting(req, res);
});
router.put(
"/",
PermissionHelper.passCheckMiddleware("create", "management", "setting"),
async (req: Request, res: Response) => {
await setSetting(req, res);
}
);
router.delete(
"/:setting",
PermissionHelper.passCheckMiddleware("delete", "management", "setting"),
async (req: Request, res: Response) => {
await resetSetting(req, res);
}
);
export default router;

View file

@ -1,5 +1,5 @@
import express from "express";
import { getCalendarItemsByTypes } from "../controller/publicController";
import { getApplicationConfig, getCalendarItemsByTypes } from "../controller/publicController";
var router = express.Router({ mergeParams: true });
@ -7,4 +7,8 @@ router.get("/calendar", async (req, res) => {
await getCalendarItemsByTypes(req, res);
});
router.get("/configuration", async (req, res) => {
await getApplicationConfig(req, res);
});
export default router;

View file

@ -1,7 +1,7 @@
import { dataSource } from "../data-source";
import { setting } from "../entity/setting";
import InternalException from "../exceptions/internalException";
import { SettingString } from "../type/settingTypes";
import { dataSource } from "../../data-source";
import { setting } from "../../entity/setting";
import InternalException from "../../exceptions/internalException";
import { SettingString } from "../../type/settingTypes";
export default abstract class SettingService {
/**

View file

@ -21,7 +21,8 @@ export type PermissionModule =
| "query_store"
| "template"
| "template_usage"
| "backup";
| "backup"
| "setting";
export type PermissionType = "read" | "create" | "update" | "delete";
@ -78,6 +79,7 @@ export const permissionModules: Array<PermissionModule> = [
"template",
"template_usage",
"backup",
"setting",
];
export const permissionTypes: Array<PermissionType> = ["read", "create", "update", "delete"];
export const sectionsAndModules: SectionsAndModulesObject = {
@ -95,6 +97,6 @@ export const sectionsAndModules: SectionsAndModulesObject = {
"template_usage",
"newsletter_config",
],
management: ["user", "role", "webapi", "backup"],
management: ["user", "role", "webapi", "backup", "setting"],
additional: [],
};