From 46ee340e1723ff46ad59d0772ba7bbaed7e33ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Fra=C3=9F?= Date: Fri, 26 Apr 2024 11:02:52 +0200 Subject: [PATCH] [mod] session management:Datenbank anbinden --- source/conf.ts | 243 ++++++++++++++++++++++++++----------------------- source/main.ts | 46 +++++----- 2 files changed, 153 insertions(+), 136 deletions(-) diff --git a/source/conf.ts b/source/conf.ts index 800ef93..776f029 100644 --- a/source/conf.ts +++ b/source/conf.ts @@ -83,8 +83,9 @@ namespace _espe.conf } ); session_management : { - lifetime : int; + in_memory : boolean; drop_all_at_start : boolean; + lifetime : int; }; settings : { target_domain : string; @@ -114,123 +115,137 @@ namespace _espe.conf * @todo mandatory fields */ export async function load( - path : (null | string) + path : string ) : Promise { - const conf_raw : any = ( - (path !== null) - ? (lib_plankton.json.decode(await lib_plankton.file.read(path)) as type_conf) - : {} - ); - _data = { - "general": ( - ((node_general) => ({ - "verbosity": (node_general["verbosity"] ?? "notice"), - "verification_secret": (node_general["verification_secret"] ?? null), - })) (conf_raw["general"] ?? {}) - ), - "server": ( - ((node_server) => ({ - "port": (node_server["port"] ?? 7979), - })) (conf_raw["server"] ?? {}) - ), - "database": ( - ((node_database) => { - const kind : string = (node_database["kind"] ?? "sqlite"); - const node_database_data_raw = (node_database["data"] ?? {}); - switch (kind) { - case "sqlite": { - return { - "kind": kind, - "data": { - "path": (node_database_data_raw["path"] ?? "data.sqlite"), - } - }; - break; + let conf_raw : any; + if (! (await lib_plankton.file.exists(path))) { + // return Promise.reject(new Error("configuration file not found: " + path + "; using fallback")); + conf_raw = {}; + } + else { + try { + conf_raw = lib_plankton.json.decode(await lib_plankton.file.read(path)); + } + catch (error) { + conf_raw = null; + } + } + if (conf_raw === null) { + return Promise.reject("configuration file could not be read"); + } + else { + _data = { + "general": ( + ((node_general) => ({ + "verbosity": (node_general["verbosity"] ?? "notice"), + "verification_secret": (node_general["verification_secret"] ?? null), + })) (conf_raw["general"] ?? {}) + ), + "server": ( + ((node_server) => ({ + "port": (node_server["port"] ?? 7979), + })) (conf_raw["server"] ?? {}) + ), + "database": ( + ((node_database) => { + const kind : string = (node_database["kind"] ?? "sqlite"); + const node_database_data_raw = (node_database["data"] ?? {}); + switch (kind) { + case "sqlite": { + return { + "kind": kind, + "data": { + "path": (node_database_data_raw["path"] ?? "data.sqlite"), + } + }; + break; + } + case "postgresql": { + return { + "kind": kind, + "data": node_database_data_raw, + }; + break; + } + default: { + throw (new Error("unhandled")); + break; + } } - case "postgresql": { - return { - "kind": kind, - "data": node_database_data_raw, - }; - break; + }) (conf_raw["database"] ?? {}) + ), + "email_sending": ( + ((node_email_sending) => { + const kind : string = (node_email_sending["kind"] ?? "regular"); + const data_raw = (node_email_sending["data"] ?? {}); + switch (kind) { + case "regular": { + return { + "kind": kind, + "data": { + "smtp_credentials": (data_raw["smtp_credentials"] ?? null), + "sender": data_raw["sender"], + } + }; + break; + } + case "redirect": { + return { + "kind": kind, + "data": { + "smtp_credentials": (data_raw["smtp_credentials"] ?? null), + "sender": data_raw["sender"], + "target": data_raw["target"], + } + }; + break; + } + case "console": { + return { + "kind": kind, + "data": { + } + }; + break; + } + case "drop": { + return { + "kind": kind, + "data": { + } + }; + break; + } + default: { + throw (new Error("unhandled")); + break; + } } - default: { - throw (new Error("unhandled")); - break; - } - } - }) (conf_raw["database"] ?? {}) - ), - "email_sending": ( - ((node_email_sending) => { - const kind : string = (node_email_sending["kind"] ?? "regular"); - const data_raw = (node_email_sending["data"] ?? {}); - switch (kind) { - case "regular": { - return { - "kind": kind, - "data": { - "smtp_credentials": (data_raw["smtp_credentials"] ?? null), - "sender": data_raw["sender"], - } - }; - break; - } - case "redirect": { - return { - "kind": kind, - "data": { - "smtp_credentials": (data_raw["smtp_credentials"] ?? null), - "sender": data_raw["sender"], - "target": data_raw["target"], - } - }; - break; - } - case "console": { - return { - "kind": kind, - "data": { - } - }; - break; - } - case "drop": { - return { - "kind": kind, - "data": { - } - }; - break; - } - default: { - throw (new Error("unhandled")); - break; - } - } - }) (conf_raw["email_sending"] ?? {}) - ), - "session_management": ( - ((node_session_management) => ({ - "lifetime": (node_session_management["lifetime"] ?? 900), - "drop_all_at_start": (node_session_management["drop_all_at_start"] ?? true), - })) (conf_raw["session_management"] ?? {}) - ), - "settings": ( - ((node_settings) => ({ - "target_domain": (node_settings["target_domain"] ?? "example.org"), - "prefix_for_numberbased_email_addresses": (node_settings["prefix_for_numberbased_email_addresses"] ?? "member-"), - "registration_email": { - "subject": ((node_settings["registration_email"] ?? {})["subject"] ?? "Registration"), - "body": ((node_settings["registration_email"] ?? {})["body"] ?? "URL: {{url}}"), - }, - })) (conf_raw["settings"] ?? {}) - ), - "admins": (conf_raw["admins"] ?? []), - }; - // process.stderr.write(JSON.stringify(_data, undefined, "\t")); - return Promise.resolve(undefined); + }) (conf_raw["email_sending"] ?? {}) + ), + "session_management": ( + ((node_session_management) => ({ + "in_memory": (node_session_management["in_memory"] ?? true), + "drop_all_at_start": (node_session_management["drop_all_at_start"] ?? true), + "lifetime": (node_session_management["lifetime"] ?? 900), + })) (conf_raw["session_management"] ?? {}) + ), + "settings": ( + ((node_settings) => ({ + "target_domain": (node_settings["target_domain"] ?? "example.org"), + "prefix_for_numberbased_email_addresses": (node_settings["prefix_for_numberbased_email_addresses"] ?? "member-"), + "registration_email": { + "subject": ((node_settings["registration_email"] ?? {})["subject"] ?? "Registration"), + "body": ((node_settings["registration_email"] ?? {})["body"] ?? "URL: {{url}}"), + }, + })) (conf_raw["settings"] ?? {}) + ), + "admins": (conf_raw["admins"] ?? []), + }; + // process.stderr.write(JSON.stringify(_data, undefined, "\t")); + return Promise.resolve(undefined); + } } diff --git a/source/main.ts b/source/main.ts index ce97f53..2e6bf24 100644 --- a/source/main.ts +++ b/source/main.ts @@ -79,7 +79,7 @@ async function main( "indicators_short": ["c"], "type": lib_plankton.args.enum_type.string, "mode": lib_plankton.args.enum_mode.replace, - "default": null, + "default": "conf.json", "info": "Pfad zur Konfigurations-Datei", "name": "conf-path", }), @@ -175,28 +175,30 @@ async function main( await lib_plankton.session.setup( { - /* - "data_chest": lib_plankton.call.convey( - lib_plankton.storage.sql_table_common.chest( - { - "database_implementation": _espe.helpers.database_implementation(), - "table_name": "session_management", - "key_names": ["key"], - } - ), - [ - (core) => ({ - "setup": (input) => core.setup(undefined), - "clear": () => core.clear(), - "write": (key, value) => core.write([key], value), - "delete": (key) => core.delete([key]), - "read": (key) => core.read([key]), - // "search": (term) => core.search(term).then(() => []), - "search": (term) => Promise.reject(new Error("not implemented")), - }), - ] + "data_chest": ( + _espe.conf.get().session_management.in_memory + ? lib_plankton.storage.memory.implementation_chest({}) + : lib_plankton.call.convey( + lib_plankton.storage.sql_table_common.chest( + { + "database_implementation": _espe.helpers.database_implementation(), + "table_name": "sessions", + "key_names": ["key"], + } + ), + [ + (core) => ({ + "setup": (input) => core.setup(undefined), + "clear": () => core.clear(), + "write": (key, value) => core.write([key], {"data": JSON.stringify(value)}), + "delete": (key) => core.delete([key]), + "read": (key) => core.read([key]).then(row => JSON.parse(row["data"])), + // "search": (term) => core.search(term).then(() => []), + "search": (term) => Promise.reject(new Error("not implemented")), + }), + ] + ) ), - */ "default_lifetime": _espe.conf.get().session_management.lifetime, } );