diff --git a/misc/sampledata.json b/misc/sampledata.json index c002a50..eef9e1f 100644 --- a/misc/sampledata.json +++ b/misc/sampledata.json @@ -2,23 +2,28 @@ "groups": [ { "id": 1, - "name": "Auto" + "name": "auto", + "label": "Auto" }, { "id": 2, - "name": "Zug" + "name": "zug", + "label": "Zug" }, { "id": 3, - "name": "Flugzeug" + "name": "flugzeug", + "label": "Flugzeug" }, { "id": 4, - "name": "Fahrrad" + "name": "fahrrad", + "label": "Fahrrad" }, { "id": 5, - "name": "zu Fuß" + "name": "zu_fusz", + "label": "zu Fuß" } ], "admins": [ @@ -32,18 +37,21 @@ { "id": 1, "name": "alexandra", + "label": "Alexandra Ahorn", "email_address": "alex-rockt@example.org", "groups": [1, 2, 3] }, { "id": 2, "name": "berthold", + "label": "Berthold Buche", "email_address": "bert-ohne-ernie@example.org", "groups": [4, 5, 2] }, { "id": 3, "name": "charlotte", + "label": "Charlotte Castania", "email_address": "charly-the-unicorn@example.org", "groups": [4, 1] } @@ -51,8 +59,10 @@ "invitations": [ { "id": 1, - "name_changeable": true, + "name_changeable": false, "name_value": "daniel", + "label_changeable": true, + "label_value": "Daniel Distel", "email_address_changeable": true, "email_address_value": "duesentrieb@example.org", "groups_changeable": false, diff --git a/source/api/actions/group_add.ts b/source/api/actions/group_add.ts index c9bd86c..1c704e7 100644 --- a/source/api/actions/group_add.ts +++ b/source/api/actions/group_add.ts @@ -23,7 +23,10 @@ namespace _espe.api ) : void { lib_plankton.rest_http.register< - string, + { + name : string; + label : string; + }, (string | _espe.type.group_id) >( rest_subject, @@ -36,7 +39,22 @@ namespace _espe.api "description": () => "erstellt eine Gruppe", "input_schema": () => ({ "nullable": false, - "type": "string", + "type": "object", + "properties": { + "name": { + "nullable": false, + "type": "string", + }, + "label": { + "nullable": false, + "type": "string", + }, + }, + "additionalProperties": false, + "required": [ + "name", + "label", + ], }), "output_schema": () => ({ "nullable": false, @@ -53,7 +71,8 @@ namespace _espe.api else { const data = await _espe.service.group.add( { - "name": input + "name": input["name"], + "label": input["label"] } ); return Promise.resolve({ diff --git a/source/api/actions/group_list.ts b/source/api/actions/group_list.ts index ff9ee23..bcccbaf 100644 --- a/source/api/actions/group_list.ts +++ b/source/api/actions/group_list.ts @@ -27,7 +27,10 @@ namespace _espe.api Array< { id : _espe.type.invitation_id; - name : string; + preview : { + name : string; + label : string; + }; } > >( @@ -54,6 +57,11 @@ namespace _espe.api "type": "string", "description": "Name" }, + "label": { + "nullable": false, + "type": "string", + "description": "Beschriftung" + }, }, "required": [ "id", @@ -65,7 +73,7 @@ namespace _espe.api const data = await _espe.service.group.list(); return Promise.resolve({ "status_code": 200, - "data": data + "data": data, }); } } diff --git a/source/api/actions/group_modify.ts b/source/api/actions/group_modify.ts index 450b135..0bf9657 100644 --- a/source/api/actions/group_modify.ts +++ b/source/api/actions/group_modify.ts @@ -24,7 +24,7 @@ namespace _espe.api { lib_plankton.rest_http.register< { - name : string; + label : string; }, null >( @@ -40,14 +40,14 @@ namespace _espe.api "nullable": false, "type": "object", "properties": { - "name": { + "label": { "nullable": false, "type": "string", - } + }, }, "additionalProperties": false, "required": [ - "name", + "label", ] }), "output_schema": () => ({ @@ -63,12 +63,9 @@ namespace _espe.api } else { const group_id : _espe.type.group_id = parseInt(path_parameters["id"]); - const group_object : _espe.type.group_object = { - "name": input.name, - }; const data = await _espe.service.group.modify( group_id, - group_object + input["label"] ); return Promise.resolve({ "status_code": 200, diff --git a/source/api/actions/group_read.ts b/source/api/actions/group_read.ts index 4e9edbf..9434ced 100644 --- a/source/api/actions/group_read.ts +++ b/source/api/actions/group_read.ts @@ -26,6 +26,7 @@ namespace _espe.api null, { name : string; + label : string; } >( rest_subject, @@ -43,11 +44,16 @@ namespace _espe.api "name": { "nullable": false, "type": "string", - } + }, + "label": { + "nullable": false, + "type": "string", + }, }, "additionalProperties": false, "required": [ "name", + "label", ] }), "restriction": () => restriction_logged_in, diff --git a/source/api/actions/invitation_accept.ts b/source/api/actions/invitation_accept.ts index 2663e14..19474b0 100644 --- a/source/api/actions/invitation_accept.ts +++ b/source/api/actions/invitation_accept.ts @@ -26,6 +26,7 @@ namespace _espe.api key : string; data : { name : (null | string); + label : (null | string); groups : (null | Array); email_address : (null | string); password : (null | string); diff --git a/source/api/actions/invitation_create.ts b/source/api/actions/invitation_create.ts index e00d6c5..b681700 100644 --- a/source/api/actions/invitation_create.ts +++ b/source/api/actions/invitation_create.ts @@ -27,6 +27,8 @@ namespace _espe.api data : { name_changeable : boolean; name_value : string; + label_changeable : boolean; + label_value : string; email_address_changeable : boolean; email_address_value : (null | string); groups_changeable : boolean; @@ -160,6 +162,8 @@ namespace _espe.api { "name_changeable": input.data.name_changeable, "name_value": input.data.name_value, + "label_changeable": input.data.label_changeable, + "label_value": input.data.label_value, "email_address_changeable": input.data.email_address_changeable, "email_address_value": input.data.email_address_value, "groups_changeable": input.data.groups_changeable, diff --git a/source/api/actions/invitation_examine.ts b/source/api/actions/invitation_examine.ts index 5db11fd..07bbdfa 100644 --- a/source/api/actions/invitation_examine.ts +++ b/source/api/actions/invitation_examine.ts @@ -60,6 +60,16 @@ namespace _espe.api "nullable": true, "description": "Name | Wert" }, + "label_changeable": { + "type": "boolean", + "nullable": false, + "description": "Beschriftung | änderbar" + }, + "label_value": { + "type": "string", + "nullable": true, + "description": "Beschriftung | Wert" + }, "email_address_changeable": { "type": "boolean", "nullable": false, @@ -89,6 +99,8 @@ namespace _espe.api "expiry", "name_changeable", "name_value", + "label_changeable", + "label_value", "email_address_changeable", "email_address_value", "groups_changeable", @@ -107,6 +119,8 @@ namespace _espe.api "expiry": invitation_object.expiry, "name_changeable": invitation_object.name_changeable, "name_value": invitation_object.name_value, + "label_changeable": invitation_object.label_changeable, + "label_value": invitation_object.label_value, "email_address_changeable": invitation_object.email_address_changeable, "email_address_value": invitation_object.email_address_value, "groups_changeable": invitation_object.groups_changeable, diff --git a/source/api/actions/invitation_list.ts b/source/api/actions/invitation_list.ts index 929ca30..0a2625b 100644 --- a/source/api/actions/invitation_list.ts +++ b/source/api/actions/invitation_list.ts @@ -26,9 +26,12 @@ namespace _espe.api Array< { id : _espe.type.invitation_id; - key : _espe.type.invitation_key; - expiry : (null | int); - name_value : (null | string); + preview : { + key : _espe.type.invitation_key; + expiry : (null | int); + name_value : (null | string); + label_value : (null | string); + }; } > >( @@ -65,6 +68,11 @@ namespace _espe.api "type": "string", "description": "Name" }, + "label_value": { + "nullable": false, + "type": "string", + "description": "Beschriftung" + }, }, "required": [ "id", diff --git a/source/api/actions/invitation_read.ts b/source/api/actions/invitation_read.ts index 07b77b7..d6e056b 100644 --- a/source/api/actions/invitation_read.ts +++ b/source/api/actions/invitation_read.ts @@ -32,6 +32,8 @@ namespace _espe.api expiry : (null | int); name_changeable : boolean; name_value : (null | string); + label_changeable : boolean; + label_value : (null | string); email_address_changeable : boolean; email_address_value : (null | string); groups_changeable : boolean; @@ -74,6 +76,16 @@ namespace _espe.api "nullable": true, "description": "Name | Wert" }, + "label_changeable": { + "type": "boolean", + "nullable": false, + "description": "Beschriftung | änderbar" + }, + "label_value": { + "type": "string", + "nullable": true, + "description": "Beschriftung | Wert" + }, "email_address_changeable": { "type": "boolean", "nullable": false, @@ -122,6 +134,8 @@ namespace _espe.api "expiry": invitation_object.expiry, "name_changeable": invitation_object.name_changeable, "name_value": invitation_object.name_value, + "label_changeable": invitation_object.label_changeable, + "label_value": invitation_object.label_value, "email_address_changeable": invitation_object.email_address_changeable, "email_address_value": invitation_object.email_address_value, "groups_changeable": invitation_object.groups_changeable, diff --git a/source/api/actions/member_list.ts b/source/api/actions/member_list.ts index 870806f..84dd06c 100644 --- a/source/api/actions/member_list.ts +++ b/source/api/actions/member_list.ts @@ -29,6 +29,7 @@ namespace _espe.api id : int; preview : { name : string; + label : string; }; } > @@ -64,11 +65,14 @@ namespace _espe.api "type": "string", "nullable": false, }, + "label": { + "type": "string", + "nullable": false, + }, }, "required": [ - "membership_number", - "name_real_value", - "name_real_index", + "name", + "label", ] } }, diff --git a/source/api/actions/member_modify.ts b/source/api/actions/member_modify.ts index 081f163..c39c47a 100644 --- a/source/api/actions/member_modify.ts +++ b/source/api/actions/member_modify.ts @@ -24,6 +24,7 @@ namespace _espe.api { lib_plankton.rest_http.register< { + label : string; email_address : (null | string); groups ?: Array; enabled : boolean; @@ -39,6 +40,10 @@ namespace _espe.api "nullable": false, "type": "object", "properties": { + "label": { + "nullable": true, + "type": "string" + }, "email_address": { "nullable": true, "type": "string" @@ -75,6 +80,7 @@ namespace _espe.api await _espe.service.member.modify( member_id, { + "label": input.label, "email_address": input.email_address, "groups": ( (input.groups === undefined) diff --git a/source/api/actions/member_read.ts b/source/api/actions/member_read.ts index b988bcb..1da2c40 100644 --- a/source/api/actions/member_read.ts +++ b/source/api/actions/member_read.ts @@ -26,6 +26,7 @@ namespace _espe.api null, { name : string; + label : string; email_address : (null | string); groups : Array; enabled : boolean; @@ -45,6 +46,10 @@ namespace _espe.api "nullable": false, "type": "string" }, + "label": { + "nullable": false, + "type": "string" + }, "email_address": { "nullable": true, "type": "string" @@ -65,6 +70,7 @@ namespace _espe.api "additionalProperties": false, "required": [ "name", + "label", "email_address", "groups", "enabled", @@ -79,6 +85,7 @@ namespace _espe.api "status_code": 200, "data": { "name": member_object.name, + "label": member_object.label, "email_address": member_object.email_address, "groups": member_object.groups, "enabled": member_object.enabled, diff --git a/source/repositories/group.ts b/source/repositories/group.ts index c4c4ace..de4103d 100644 --- a/source/repositories/group.ts +++ b/source/repositories/group.ts @@ -73,6 +73,7 @@ namespace _espe.repository.group { return { "name": object.name, + "label": object.label, }; } @@ -85,6 +86,7 @@ namespace _espe.repository.group { return { "name": dispersal["name"], + "label": dispersal["label"], }; } @@ -98,7 +100,10 @@ namespace _espe.repository.group Array< { id : _espe.type.group_id; - name : string; + preview : { + name : string; + label : string; + }; } > > @@ -121,7 +126,10 @@ namespace _espe.repository.group .map( ({"key": key, "preview": preview}) => ({ "id": key, - "name": preview["name"], + "preview": { + "name": preview["name"], + "label": preview["label"], + }, }) ) ); diff --git a/source/repositories/invitation.ts b/source/repositories/invitation.ts index 78bf4e2..ed07f86 100644 --- a/source/repositories/invitation.ts +++ b/source/repositories/invitation.ts @@ -121,6 +121,8 @@ namespace _espe.repository.invitation "expiry": object.expiry, "name_changeable": _espe.helpers.dbbool_encode(object.name_changeable), "name_value": object.name_value, + "label_changeable": _espe.helpers.dbbool_encode(object.label_changeable), + "label_value": object.label_value, "email_address_changeable": _espe.helpers.dbbool_encode(object.email_address_changeable), "email_address_value": object.email_address_value, "groups_changeable": _espe.helpers.dbbool_encode(object.groups_changeable), @@ -148,6 +150,8 @@ namespace _espe.repository.invitation "expiry": dispersal.core_row["expiry"], "name_changeable": _espe.helpers.dbbool_decode(dispersal.core_row["name_changeable"]), "name_value": dispersal.core_row["name_value"], + "label_changeable": _espe.helpers.dbbool_decode(dispersal.core_row["label_changeable"]), + "label_value": dispersal.core_row["label_value"], "email_address_changeable": _espe.helpers.dbbool_decode(dispersal.core_row["email_address_changeable"]), "email_address_value": dispersal.core_row["email_address_value"], "groups_changeable": _espe.helpers.dbbool_decode(dispersal.core_row["groups_changeable"]), @@ -193,6 +197,7 @@ namespace _espe.repository.invitation "id": key, "preview": { "name": preview["name_value"], + "label": preview["label_value"], } }) ) diff --git a/source/repositories/member.ts b/source/repositories/member.ts index 6e15a53..7a8a6d3 100644 --- a/source/repositories/member.ts +++ b/source/repositories/member.ts @@ -118,6 +118,7 @@ namespace _espe.repository.member return { "core_row": { "name": object.name, + "label": object.label, "email_address": object.email_address, "enabled": _espe.helpers.dbbool_encode(object.enabled), "password_image": object.password_image, @@ -144,6 +145,7 @@ namespace _espe.repository.member { return { "name": dispersal.core_row["name"], + "label": dispersal.core_row["label"], "email_address": dispersal.core_row["email_address"], "groups": lib_plankton.list.sorted<_espe.type.group_id>( dispersal.group_rows.map(row => row["group_id"]), @@ -170,6 +172,7 @@ namespace _espe.repository.member id : _espe.type.member_id; preview : { name : string; + label : string; }; } > @@ -195,6 +198,7 @@ namespace _espe.repository.member "id": key, "preview": { "name": preview["name"], + "label": preview["label"], } }) ) diff --git a/source/sample.ts b/source/sample.ts index 42e4500..f0db8f7 100644 --- a/source/sample.ts +++ b/source/sample.ts @@ -23,6 +23,7 @@ namespace _espe.sample { id : int; name : string; + label : string; } >; admins : Array< @@ -37,6 +38,7 @@ namespace _espe.sample { id : int; name : string; + label : string; email_address : (null | string); groups : Array; } @@ -46,6 +48,8 @@ namespace _espe.sample id : int; name_changeable : boolean; name_value : string; + label_changeable : boolean; + label_value : string; email_address_changeable : boolean; email_address_value : (null | string); groups_changeable : boolean; @@ -69,6 +73,7 @@ namespace _espe.sample const group_id : _espe.type.group_id = await _espe.service.group.add( { "name": group_raw.name, + "label": group_raw.label, } ); track_groups.set(group_raw.id, group_id); @@ -92,6 +97,7 @@ namespace _espe.sample const member_id : _espe.type.member_id = await _espe.service.member.project( { "name": member_raw.name, + "label": member_raw.label, "email_address": member_raw.email_address, "groups": member_raw.groups.map(group_id => track_groups.get(group_id)), }, @@ -112,6 +118,8 @@ namespace _espe.sample { "name_changeable": invitation_raw.name_changeable, "name_value": invitation_raw.name_value, + "label_changeable": invitation_raw.label_changeable, + "label_value": invitation_raw.label_value, "email_address_changeable": invitation_raw.email_address_changeable, "email_address_value": invitation_raw.email_address_value, "groups_changeable": invitation_raw.groups_changeable, diff --git a/source/services/group.ts b/source/services/group.ts index 9ebd9f0..3f89862 100644 --- a/source/services/group.ts +++ b/source/services/group.ts @@ -19,7 +19,17 @@ namespace _espe.service.group /** */ export function list( - ) : Promise> + ) : Promise< + Array< + { + id : _espe.type.group_id; + preview : { + name : string; + label : string; + }; + } + > + > { return _espe.repository.group.list(null); } @@ -47,12 +57,14 @@ namespace _espe.service.group /** */ - export function modify( + export async function modify( id : _espe.type.group_id, - object : _espe.type.group_object + label : string ) : Promise { - return _espe.repository.group.update(id, object); + const object : _espe.type.group_object = await _espe.repository.group.read(id); + object.label = label; + await _espe.repository.group.update(id, object); } } diff --git a/source/services/invitation.ts b/source/services/invitation.ts index 5a3b56e..5a5d513 100644 --- a/source/services/invitation.ts +++ b/source/services/invitation.ts @@ -23,9 +23,12 @@ namespace _espe.service.invitation Array< { id : _espe.type.invitation_id; - key : _espe.type.invitation_key; - expiry : (null | int); - name_value : (null | string); + preview : { + key : _espe.type.invitation_key; + expiry : (null | int); + name_value : (null | string); + label_value : (null | string); + }; } > > @@ -37,9 +40,12 @@ namespace _espe.service.invitation entries.map( entry => ({ "id": entry.id, - "key": entry.object.key, - "expiry": entry.object.expiry, - "name_value": entry.object.name_value + "preview": { + "key": entry.object.key, + "expiry": entry.object.expiry, + "name_value": entry.object.name_value, + "label_value": entry.object.label_value, + } }) ) ) @@ -54,6 +60,8 @@ namespace _espe.service.invitation { "name_changeable": name_changeable, "name_value": name_value, + "label_changeable": label_changeable, + "label_value": label_value, "email_address_changeable": email_address_changeable, "email_address_value": email_address_value, "groups_changeable": groups_changeable, @@ -61,6 +69,8 @@ namespace _espe.service.invitation } : { name_changeable : boolean; name_value : string; + label_changeable : boolean; + label_value : string; email_address_changeable : boolean; email_address_value : (null | string); groups_changeable : boolean; @@ -106,6 +116,8 @@ namespace _espe.service.invitation ), "name_changeable": name_changeable, "name_value": name_value, + "label_changeable": label_changeable, + "label_value": label_value, "email_address_changeable": email_address_changeable, "email_address_value": email_address_value, "groups_changeable": groups_changeable, @@ -247,6 +259,7 @@ namespace _espe.service.invitation key : _espe.type.invitation_key, data : { name : (null | string); + label : (null | string); groups : (null | Array<_espe.type.group_id>); email_address : (null | string); password : (null | string); @@ -320,6 +333,15 @@ namespace _espe.service.invitation invitation_object.name_value ) as string ), + "label": ( + ( + invitation_object.label_changeable + ? + data.label + : + invitation_object.label_value + ) as string + ), "email_address": ( ( invitation_object.email_address_changeable diff --git a/source/services/member.ts b/source/services/member.ts index ae997c5..98ee48f 100644 --- a/source/services/member.ts +++ b/source/services/member.ts @@ -103,7 +103,11 @@ namespace _espe.service.member object : _espe.type.member_object ) : string { - return object.name; + return ( + object.label + ?? + object.name + ); } @@ -229,6 +233,7 @@ namespace _espe.service.member id : _espe.type.member_id; preview : { name : string; + label : string; }; } > @@ -256,6 +261,7 @@ namespace _espe.service.member export async function project( data : { name : string; + label : string; email_address : (null | string); groups : Array<_espe.type.group_id>; }, @@ -269,6 +275,7 @@ namespace _espe.service.member { const object : _espe.type.member_object = { "name": data.name, + "label": data.label, "email_address": data.email_address, "groups": data.groups, "enabled": true, @@ -295,6 +302,7 @@ namespace _espe.service.member export async function add( data : { name : string; + label : string; email_address : (null | string); groups : Array<_espe.type.group_id>; password : string; @@ -309,6 +317,7 @@ namespace _espe.service.member { const object : _espe.type.member_object = { "name": data.name, + "label": data.label, "email_address": data.email_address, "groups": data.groups, "enabled": true, @@ -391,6 +400,7 @@ namespace _espe.service.member export async function modify( member_id : _espe.type.member_id, data : { + label : string; email_address : (null | string); enabled : boolean; groups : lib_plankton.pod.type_pod>; @@ -400,6 +410,7 @@ namespace _espe.service.member const member_object_old : _espe.type.member_object = await get(member_id); const member_object_new : _espe.type.member_object = { "name": member_object_old.name, + "label": data.label, "email_address": data.email_address, "groups": ( lib_plankton.pod.is_filled>(data.groups) @@ -494,6 +505,7 @@ namespace _espe.service.member const token : string = await _espe.helpers.verification_get(Math.floor(Math.random() * (1 << 24))); const member_object_new : _espe.type.member_object = { "name": member_object_old.name, + "label": member_object_old.label, "email_address": member_object_old.email_address, "enabled": member_object_old.enabled, "groups": member_object_old.groups, @@ -585,6 +597,7 @@ namespace _espe.service.member else { const member_object_new : _espe.type.member_object = { "name": member_object_old.name, + "label": member_object_old.label, "email_address": member_object_old.email_address, "groups": member_object_old.groups, "enabled": member_object_old.enabled, @@ -638,6 +651,34 @@ namespace _espe.service.member groups : Array; password : string; }; + + const groups_as_array : Array< + { + id : _espe.type.group_id; + preview : { + name : string; + label : string; + }; + } + > = await _espe.service.group.list(); + const groups_as_map : Map< + _espe.type.group_id, + _espe.type.group_object + > = new Map< + _espe.type.group_id, + _espe.type.group_object + >(); + for (const group_entry of groups_as_array) + { + groups_as_map.set( + group_entry.id, + { + "name": group_entry.preview.name, + "label": group_entry.preview.label, + } + ); + } + return lib_plankton.call.convey( ( ( @@ -673,10 +714,16 @@ namespace _espe.service.member "disabled": (! entry.object.enabled), "displayname": name_display(entry.object), "email": entry.email_address, - /** - * @todo covert to string - */ - "groups": entry.object.groups, + "groups": ( + entry.object.groups + .map( + (group_id : _espe.type.group_id) => ( + groups_as_map.get(group_id)?.name + ?? + group_id.toFixed(0) + ) + ) + ), "password": entry.object.password_image, } ]) diff --git a/source/types.ts b/source/types.ts index 0156eb3..a0d4c38 100644 --- a/source/types.ts +++ b/source/types.ts @@ -25,6 +25,7 @@ namespace _espe.type */ export type group_object = { name : string; + label : string; }; @@ -52,6 +53,7 @@ namespace _espe.type */ export type member_object = { name : string; + label : string; email_address : (null | string); groups : Array; enabled : boolean; @@ -79,6 +81,8 @@ namespace _espe.type expiry : (null | int); name_changeable : boolean; name_value : (null | string); + label_changeable : boolean; + label_value : (null | string); email_address_changeable : boolean; email_address_value : (null | string); groups_changeable : boolean;