From 05bf22a25790e3e4c35af0894d2298d988e0eb59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Fra=C3=9F?= Date: Sun, 6 Apr 2025 16:19:37 +0200 Subject: [PATCH] =?UTF-8?q?[task-193]=20[add]=20Funktion=20zum=20Einf?= =?UTF-8?q?=C3=BCllen=20von=20(Beispiel-)Daten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- misc/sampledata.json | 42 +++++++++ source/data/localization/deu.loc.json | 1 + source/data/localization/eng.loc.json | 1 + source/helpers.ts | 6 +- source/main.ts | 12 +++ source/sample.ts | 119 ++++++++++++++++++++++++++ source/services/member.ts | 13 ++- source/types.ts | 12 +++ todo.md | 2 + tools/makefile | 1 + 10 files changed, 205 insertions(+), 4 deletions(-) create mode 100644 misc/sampledata.json create mode 100644 source/sample.ts create mode 100644 todo.md diff --git a/misc/sampledata.json b/misc/sampledata.json new file mode 100644 index 0000000..43a66b6 --- /dev/null +++ b/misc/sampledata.json @@ -0,0 +1,42 @@ +{ + "admins": [ + { + "name": "admin", + "email_address": "admin@example.org", + "password": "admin" + } + ], + "members": [ + { + "membership_number": "123", + "name_real": "Alexandra Ahorn", + "email_address_private": "alex-rockt@example.org", + "groups": ["auto","zug","flugzeug"] + }, + { + "membership_number": "234", + "name_real": "Berthold Buche", + "email_address_private": "bert-ohne-ernie@example.org", + "groups": ["fahrrad","zu_fuß","zug"] + }, + { + "membership_number": "345", + "name_real": "Charlotte Castania", + "email_adress_private": "charly-the-unicorn@example.org", + "groups": ["fahrrad","auto"] + } + ], + "invites": [ + { + "membership_number_mode": 1, + "membership_number_value": "456", + "name_mode": 1, + "name_value": "Daniel Distel", + "email_address_mode": 1, + "email_address_value": "duesentrieb@example.org", + "groups_mode": 1, + "groups_value": ["flugzeug","zu_fuß"] + } + ] +} + diff --git a/source/data/localization/deu.loc.json b/source/data/localization/deu.loc.json index 45b7840..3a5bcc2 100644 --- a/source/data/localization/deu.loc.json +++ b/source/data/localization/deu.loc.json @@ -17,6 +17,7 @@ "help.args.action.description": "auszuführende Aktion; Auswahl", "help.args.action.options.serve": "Server starten", "help.args.action.options.api_doc": "API-Dokumentation gemäß OpenAPI-Spezifikation auf Standard-Ausgabe schreiben", + "help.args.action.options.sample": "Datenbank mit Beispiel-Daten befüllen", "help.args.action.options.email_test": "eine Test-E-Mail senden", "help.args.action.options.expose_conf": "Vollständige Konfiguration ausgeben", "help.args.action.options.password_image": "Passwort-Abbild errechnen und auf Standard-Ausgabe schreiben", diff --git a/source/data/localization/eng.loc.json b/source/data/localization/eng.loc.json index f9e73af..b822ef3 100644 --- a/source/data/localization/eng.loc.json +++ b/source/data/localization/eng.loc.json @@ -17,6 +17,7 @@ "help.args.action.description": "action to executo; options", "help.args.action.options.serve": "start server", "help.args.action.options.api_doc": "write API documentation according to OpenAPI specification to stdout", + "help.args.action.options.sample": "fill database with sample data", "help.args.action.options.email_test": "send a test e-mail", "help.args.action.options.expose_conf": "write complete configuration to stdout", "help.args.action.options.password_image": "compute password image and write to stdout", diff --git a/source/helpers.ts b/source/helpers.ts index afcdf39..4adf64b 100644 --- a/source/helpers.ts +++ b/source/helpers.ts @@ -253,7 +253,7 @@ namespace _espe.helpers */ export function invite_prefill_mode_encode( invite_prefill_mode : _espe.type.invite_prefill_mode - ) : int + ) : _espe.type.invite_prefill_mode_raw { switch (invite_prefill_mode) { case _espe.type.invite_prefill_mode.hidden: return 0; @@ -267,7 +267,7 @@ namespace _espe.helpers /** */ export function invite_prefill_mode_decode( - invite_prefill_mode_encoded : int + invite_prefill_mode_encoded : _espe.type.invite_prefill_mode_raw ) : _espe.type.invite_prefill_mode { switch (invite_prefill_mode_encoded) { @@ -277,5 +277,5 @@ namespace _espe.helpers default: throw (new Error("unhandled encoded invite prefill mode: " + String(invite_prefill_mode_encoded))); } } - + } diff --git a/source/main.ts b/source/main.ts index 4862439..7ac590b 100644 --- a/source/main.ts +++ b/source/main.ts @@ -204,6 +204,10 @@ namespace _espe "name": "api-doc", "description": lib_plankton.translate.get("help.args.action.options.api_doc") }, + { + "name": "sample", + "description": lib_plankton.translate.get("help.args.action.options.sample"), + }, { "name": "email-test", "description": lib_plankton.translate.get("help.args.action.options.email_test") @@ -360,6 +364,14 @@ namespace _espe ); break; } + case "sample": { + const path : string = args["arg1"]; + if (path === null) { + throw (new Error("SYNTAX: sample ")); + } + _espe.sample.fill_by_path(path); + break; + } case "email-test": { await _espe.helpers.email_send( ( diff --git a/source/sample.ts b/source/sample.ts new file mode 100644 index 0000000..0d4f0d8 --- /dev/null +++ b/source/sample.ts @@ -0,0 +1,119 @@ +/* +Espe | Ein schlichtes Werkzeug zur Mitglieder-Verwaltung | Backend +Copyright (C) 2024 Christian Fraß + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public +License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied +warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program. If not, see +. + */ + +namespace _espe.sample +{ + + /** + */ + type type_data = { + admins : Array< + { + name : string; + email_address : (null | string); + password : string; + } + >; + members : Array< + { + membership_number : string; + name_real : string; + email_address_private : (null | string); + groups : Array; + } + >; + invites : Array< + { + membership_number_mode : _espe.type.invite_prefill_mode_raw; + membership_number_value : string; + name_mode : _espe.type.invite_prefill_mode_raw; + name_value : string; + email_address_mode : _espe.type.invite_prefill_mode_raw; + email_address_value : (null | string); + groups_mode : _espe.type.invite_prefill_mode_raw; + groups_value : Array; + } + >; + }; + + + /** + */ + export async function fill( + data : type_data + ) : Promise + { + // admins + { + for (const admin_raw of data.admins) { + const admin_id : _espe.type.admin_id = await _espe.service.admin.add( + admin_raw.name, + admin_raw.email_address, + admin_raw.password, + ); + } + } + // members + { + for (const member_raw of data.members) { + const member_id : _espe.type.member_id = await _espe.service.member.project( + { + "membership_number": member_raw.membership_number, + "name_real_value": member_raw.name_real, + "email_address_private": member_raw.email_address_private, + "groups": member_raw.groups + }, + { + "silent": true, + } + ); + } + /** + * @todo passwords + */ + } + // invites + { + for (const invite_raw of data.invites) { + const result : {id : _espe.type.invite_id; key : _espe.type.invite_key;} = await _espe.service.invite.create( + { + "membership_number_mode": _espe.helpers.invite_prefill_mode_decode(invite_raw.membership_number_mode), + "membership_number_value": invite_raw.membership_number_value, + "name_mode": invite_raw.name_mode, + "name_value": invite_raw.name_value, + "email_address_mode": invite_raw.email_address_mode, + "email_address_value": invite_raw.email_address_value, + "groups_mode": invite_raw.groups_mode, + "groups_value": invite_raw.groups_value, + } + ); + } + } + } + + + /** + */ + export async function fill_by_path( + path : string + ) : Promise + { + const content : string = await lib_plankton.file.read(path); + const data : type_data = (lib_plankton.json.decode(content) as type_data); + await fill(data); + } + +} + diff --git a/source/services/member.ts b/source/services/member.ts index 9ee771c..d8d4733 100644 --- a/source/services/member.ts +++ b/source/services/member.ts @@ -310,6 +310,12 @@ namespace _espe.service.member name_real_value : string; email_address_private : (null | string); groups : Array; + }, + { + "silent": silent = false, + } : { + silent ?: boolean; + } = { } ) : Promise<_espe.type.member_id> { @@ -331,7 +337,12 @@ namespace _espe.service.member "groups": data.groups, }; const id : _espe.type.member_id = await _espe.repository.member.create(object); - signal_change(); + if (silent) { + // do nothing + } + else { + signal_change(); + } return id; } diff --git a/source/types.ts b/source/types.ts index 907fb40..0ff9c8c 100644 --- a/source/types.ts +++ b/source/types.ts @@ -73,6 +73,18 @@ namespace _espe.type locked, free, }; + + + /** + * @tood use strings instead of numbers + */ + export type invite_prefill_mode_raw = ( + 0 + | + 1 + | + 2 + ); /** diff --git a/todo.md b/todo.md new file mode 100644 index 0000000..3a53d88 --- /dev/null +++ b/todo.md @@ -0,0 +1,2 @@ +- Niederschreiben (Logging) von geheimen Angaben verhindern + diff --git a/tools/makefile b/tools/makefile index c1235a8..fa0fa98 100644 --- a/tools/makefile +++ b/tools/makefile @@ -86,6 +86,7 @@ main: core ${dir_build}/espe data ${dir_temp}/espe-main-raw.js: \ ${dir_lib}/plankton/plankton.d.ts \ ${dir_temp}/espe-core.d.ts \ + ${dir_source}/sample.ts \ ${dir_source}/main.ts @ ${cmd_log} "compile | main …" @ ${cmd_mkdir} $(dir $@)