[task-193] [add] Funktion zum Einfüllen von (Beispiel-)Daten

This commit is contained in:
roydfalk 2025-04-06 16:19:37 +02:00
parent a73e11c6f6
commit 05bf22a257
10 changed files with 205 additions and 4 deletions

42
misc/sampledata.json Normal file
View file

@ -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ß"]
}
]
}

View file

@ -17,6 +17,7 @@
"help.args.action.description": "auszuführende Aktion; Auswahl", "help.args.action.description": "auszuführende Aktion; Auswahl",
"help.args.action.options.serve": "Server starten", "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.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.email_test": "eine Test-E-Mail senden",
"help.args.action.options.expose_conf": "Vollständige Konfiguration ausgeben", "help.args.action.options.expose_conf": "Vollständige Konfiguration ausgeben",
"help.args.action.options.password_image": "Passwort-Abbild errechnen und auf Standard-Ausgabe schreiben", "help.args.action.options.password_image": "Passwort-Abbild errechnen und auf Standard-Ausgabe schreiben",

View file

@ -17,6 +17,7 @@
"help.args.action.description": "action to executo; options", "help.args.action.description": "action to executo; options",
"help.args.action.options.serve": "start server", "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.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.email_test": "send a test e-mail",
"help.args.action.options.expose_conf": "write complete configuration to stdout", "help.args.action.options.expose_conf": "write complete configuration to stdout",
"help.args.action.options.password_image": "compute password image and write to stdout", "help.args.action.options.password_image": "compute password image and write to stdout",

View file

@ -253,7 +253,7 @@ namespace _espe.helpers
*/ */
export function invite_prefill_mode_encode( export function invite_prefill_mode_encode(
invite_prefill_mode : _espe.type.invite_prefill_mode invite_prefill_mode : _espe.type.invite_prefill_mode
) : int ) : _espe.type.invite_prefill_mode_raw
{ {
switch (invite_prefill_mode) { switch (invite_prefill_mode) {
case _espe.type.invite_prefill_mode.hidden: return 0; case _espe.type.invite_prefill_mode.hidden: return 0;
@ -267,7 +267,7 @@ namespace _espe.helpers
/** /**
*/ */
export function invite_prefill_mode_decode( 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 ) : _espe.type.invite_prefill_mode
{ {
switch (invite_prefill_mode_encoded) { 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))); default: throw (new Error("unhandled encoded invite prefill mode: " + String(invite_prefill_mode_encoded)));
} }
} }
} }

View file

@ -204,6 +204,10 @@ namespace _espe
"name": "api-doc", "name": "api-doc",
"description": lib_plankton.translate.get("help.args.action.options.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", "name": "email-test",
"description": lib_plankton.translate.get("help.args.action.options.email_test") "description": lib_plankton.translate.get("help.args.action.options.email_test")
@ -360,6 +364,14 @@ namespace _espe
); );
break; break;
} }
case "sample": {
const path : string = args["arg1"];
if (path === null) {
throw (new Error("SYNTAX: sample <source-file-path>"));
}
_espe.sample.fill_by_path(path);
break;
}
case "email-test": { case "email-test": {
await _espe.helpers.email_send( await _espe.helpers.email_send(
( (

119
source/sample.ts Normal file
View file

@ -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
<https://www.gnu.org/licenses/>.
*/
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<string>;
}
>;
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<string>;
}
>;
};
/**
*/
export async function fill(
data : type_data
) : Promise<void>
{
// 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<void>
{
const content : string = await lib_plankton.file.read(path);
const data : type_data = (lib_plankton.json.decode(content) as type_data);
await fill(data);
}
}

View file

@ -310,6 +310,12 @@ namespace _espe.service.member
name_real_value : string; name_real_value : string;
email_address_private : (null | string); email_address_private : (null | string);
groups : Array<string>; groups : Array<string>;
},
{
"silent": silent = false,
} : {
silent ?: boolean;
} = {
} }
) : Promise<_espe.type.member_id> ) : Promise<_espe.type.member_id>
{ {
@ -331,7 +337,12 @@ namespace _espe.service.member
"groups": data.groups, "groups": data.groups,
}; };
const id : _espe.type.member_id = await _espe.repository.member.create(object); const id : _espe.type.member_id = await _espe.repository.member.create(object);
signal_change(); if (silent) {
// do nothing
}
else {
signal_change();
}
return id; return id;
} }

View file

@ -73,6 +73,18 @@ namespace _espe.type
locked, locked,
free, free,
}; };
/**
* @tood use strings instead of numbers
*/
export type invite_prefill_mode_raw = (
0
|
1
|
2
);
/** /**

2
todo.md Normal file
View file

@ -0,0 +1,2 @@
- Niederschreiben (Logging) von geheimen Angaben verhindern

View file

@ -86,6 +86,7 @@ main: core ${dir_build}/espe data
${dir_temp}/espe-main-raw.js: \ ${dir_temp}/espe-main-raw.js: \
${dir_lib}/plankton/plankton.d.ts \ ${dir_lib}/plankton/plankton.d.ts \
${dir_temp}/espe-core.d.ts \ ${dir_temp}/espe-core.d.ts \
${dir_source}/sample.ts \
${dir_source}/main.ts ${dir_source}/main.ts
@ ${cmd_log} "compile | main …" @ ${cmd_log} "compile | main …"
@ ${cmd_mkdir} $(dir $@) @ ${cmd_mkdir} $(dir $@)