diff --git a/source/api/actions/member_list.ts b/source/api/actions/member_list.ts index c047511..5907e01 100644 --- a/source/api/actions/member_list.ts +++ b/source/api/actions/member_list.ts @@ -8,13 +8,31 @@ namespace _espe.api ) : void { // TODO: translate types - lib_plankton.rest.register>( + lib_plankton.rest.register< + null, + Array< + { + id : int; + preview : { + membership_number : string; + name_real_value : string; + name_real_index : int; + }; + } + > + >( rest_subject, lib_plankton.http.enum_method.get, - "/member", + "/member/list", { "description": "listet alle Mitglieder auf", - "restriction": restriction_logged_in, + "query_parameters": [ + { + "name": "search_term", + "required": false, + "description": "search term", + } + ], "output_schema": () => ({ "type": "array", "items": { @@ -23,20 +41,30 @@ namespace _espe.api "additionalProperties": false, "properties": { "id": { - "type": "integer", + "type": "number", "nullable": false, }, "preview": { "type": "object", "additionalProperties": false, "properties": { - "name": { + "membership_number": { "type": "string", "nullable": false, }, + "name_real_value": { + "type": "string", + "nullable": false, + }, + "name_real_index": { + "type": "number", + "nullable": false, + }, }, "required": [ - "name", + "membership_number", + "name_real_value", + "name_real_index", ] } }, @@ -46,12 +74,16 @@ namespace _espe.api ], } }), - "execution": async ({}) => { - return Promise.resolve({ - "status_code": 200, - "data": (await _espe.service.member.list()), - }); - } + "restriction": restriction_logged_in, + "execution": ({"query_parameters": query_parameters}) => ( + _espe.service.member.list(query_parameters["search_term"] ?? null) + .then( + data => Promise.resolve({ + "status_code": 200, + "data": data, + }) + ) + ) } ); } diff --git a/source/api/actions/member_modify.ts b/source/api/actions/member_modify.ts new file mode 100644 index 0000000..c49026a --- /dev/null +++ b/source/api/actions/member_modify.ts @@ -0,0 +1,70 @@ +namespace _espe.api +{ + + /** + */ + export function register_member_modify( + rest_subject : lib_plankton.rest.type_rest + ) : void + { + lib_plankton.rest.register< + { + email_address_private : (null | string); + registered : boolean; + enabled : boolean; + }, + null + >( + rest_subject, + lib_plankton.http.enum_method.patch, + "/member/modify/:id", + { + "description": "ändert die Angaben eines vorhandenen Mitglieds", + "input_schema": () => ({ + "nullable": false, + "type": "object", + "properties": { + "email_address_private": { + "nullable": true, + "type": "string" + }, + "registered": { + "nullable": false, + "type": "boolean" + }, + "enabled": { + "nullable": false, + "type": "boolean" + }, + }, + "additionalProperties": false, + "required": [ + "email_address_private", + "registered", + "enabled", + ] + }), + "output_schema": () => ({ + "nullable": true, + }), + "restriction": restriction_logged_in, + "execution": async ({"path_parameters": path_parameters, "input": input}) => { + const member_id : _espe.type.member_id = parseInt(path_parameters["id"]); + await _espe.service.member.modify( + member_id, + { + "email_address_private": input.email_address_private, + "registered": input.registered, + "enabled": input.enabled, + } + ); + return Promise.resolve({ + "status_code": 200, + "data": null + }); + } + } + ); + } + +} diff --git a/source/api/actions/member_read.ts b/source/api/actions/member_read.ts index 987e158..81b3dce 100644 --- a/source/api/actions/member_read.ts +++ b/source/api/actions/member_read.ts @@ -8,18 +8,26 @@ namespace _espe.api ) : void { lib_plankton.rest.register< - int, - _espe.service.member.type_value + null, + { + membership_number : string; + name_real_value : string; + name_real_index : int; + email_address_private : (null | string); + registered : boolean; + enabled : boolean; + email_use_veiled_address : boolean; + email_use_nominal_address : boolean; + email_redirect_to_private_address : boolean; + email_allow_sending : boolean; + password_set : boolean; + } >( rest_subject, lib_plankton.http.enum_method.get, - "/member/read", + "/member/read/:id", { "description": "gibt ein Mitglied anhand seiner ID aus", - "input_schema": () => ({ - "nullable": false, - "type": "number" - }), // TODO "output_schema": () => ({ "nullable": false, @@ -31,12 +39,24 @@ namespace _espe.api ] }), "restriction": restriction_logged_in, - "execution": async ({"input": input}) => { - const member_id : _espe.service.member.type_id = input; - const member_value : _espe.service.member.type_value = await _espe.service.member.get(member_id); + "execution": async ({"path_parameters": path_parameters, "input": input}) => { + const member_id : _espe.type.member_id = parseInt(path_parameters["id"]); + const member_object : _espe.type.member_object = await _espe.service.member.get(member_id); return Promise.resolve({ "status_code": 200, - "data": member_value, + "data": { + "membership_number": member_object.membership_number, + "name_real_value": member_object.name_real_value, + "name_real_index": member_object.name_real_index, + "email_address_private": member_object.email_address_private, + "registered": member_object.registered, + "enabled": member_object.enabled, + "email_use_veiled_address": member_object.email_use_veiled_address, + "email_use_nominal_address": member_object.email_use_nominal_address, + "email_redirect_to_private_address": member_object.email_redirect_to_private_address, + "email_allow_sending": member_object.email_allow_sending, + "password_set": (member_object.password_image !== null), + }, }); } } diff --git a/source/api/actions/member_update.ts b/source/api/actions/member_update.ts deleted file mode 100644 index aa8d365..0000000 --- a/source/api/actions/member_update.ts +++ /dev/null @@ -1,45 +0,0 @@ -namespace _espe.api -{ - - /** - */ - export function register_member_update( - rest_subject : lib_plankton.rest.type_rest - ) : void - { - lib_plankton.rest.register<_espe.service.member.type_value, null>( - rest_subject, - lib_plankton.http.enum_method.patch, - "/member/:id", - { - "description": "ändert ein vorhandenes Mitglied", - "restriction": restriction_logged_in, - "execution": async ({"path_parameters": path_parameters, "input": input}) => { - const member_id : _espe.service.member.type_id = parseInt(path_parameters["id"]); - const member_value_old : _espe.service.member.type_value = await _espe.service.member.get(member_id); - const member_value_new : _espe.service.member.type_value = { - "enabled": input["enabled"], - "membership_number": input["membership_number"], - "name_real_value": input["name_real_value"], - "name_real_extension": input["name_real_extension"], - "name_display": input["name_display"], - "name_login": input["name_login"], - "password_image": member_value_old.password_image, - "email_address_private_value": input["email_address_private_value"], - "email_address_numberbased_use": input["email_address_numberbased_use"], - "email_address_namebased_use": input["email_address_namebased_use"], - "email_redirect_to_private": input["email_redirect_to_private"], - "salutation": input["salutation"], - "registered": /*input["registered"]*/member_value_old.registered, - }; - await _espe.service.member.modify(member_id, member_value_new); - return Promise.resolve({ - "status_code": 200, - "data": null - }); - } - } - ); - } - -} diff --git a/source/api/functions.ts b/source/api/functions.ts index 06f44a9..822ccaf 100644 --- a/source/api/functions.ts +++ b/source/api/functions.ts @@ -36,9 +36,9 @@ namespace _espe.api _espe.api.register_member_summon(rest_subject); _espe.api.register_member_info(rest_subject); _espe.api.register_member_register(rest_subject); - // _espe.api.register_member_list(rest_subject); - // _espe.api.register_member_read(rest_subject); - // _espe.api.register_member_update(rest_subject); + _espe.api.register_member_list(rest_subject); + _espe.api.register_member_read(rest_subject); + _espe.api.register_member_modify(rest_subject); // _espe.api.register_member_delete(rest_subject); } diff --git a/source/repositories/member.ts b/source/repositories/member.ts index 187479d..14f4312 100644 --- a/source/repositories/member.ts +++ b/source/repositories/member.ts @@ -112,15 +112,18 @@ namespace _espe.repository.member /** + * @todo optimize */ export async function list( + search_term : (null | string) ) : Promise< Array< { id : _espe.type.member_id; preview : { - membership_number : string, - name_real : string; + membership_number : string; + name_real_value : string; + name_real_index : int; }; } > @@ -128,12 +131,28 @@ namespace _espe.repository.member { return ( (await get_store().search(null)) + .filter( + ({"key": key, "preview": preview}) => ( + ( + (search_term === null) + || + (search_term.length <= 1) + ) + ? true + : ( + preview["membership_number"].toLowerCase().includes(search_term.toLowerCase()) + || + preview["name_real_value"].toLowerCase().includes(search_term.toLowerCase()) + ) + ) + ) .map( ({"key": key, "preview": preview}) => ({ "id": key, "preview": { "membership_number": preview["membership_number"], - "name_real": preview["name_real"], + "name_real_value": preview["name_real_value"], + "name_real_index": preview["name_real_index"], } }) ) diff --git a/source/services/member.ts b/source/services/member.ts index 2f5c9d7..a0b72fd 100644 --- a/source/services/member.ts +++ b/source/services/member.ts @@ -40,7 +40,7 @@ namespace _espe.service.member { "object": object.name_real_value.toLowerCase().replace(new RegExp(" ", "g"), "."), "extension": ( - (object.name_real_index === 0) + (object.name_real_index <= 1) ? "" : ("." + object.name_real_index.toFixed(0)) ), @@ -124,11 +124,33 @@ namespace _espe.service.member { return _espe.repository.member.dump(); } + + + /** + */ + export async function list( + search_term : (null | string) + ) : Promise< + Array< + { + id : _espe.type.member_id; + preview : { + membership_number : string; + name_real_value : string; + name_real_index : int; + }; + } + > + > + { + return _espe.repository.member.list(search_term); + } + /** */ - async function get( + export function get( id : _espe.type.member_id ) : Promise<_espe.type.member_object> { @@ -280,24 +302,39 @@ namespace _espe.service.member } } - /* - export async function list( - ) : Promise> - { - return _espe.repository.member.list(); - } - + /** + */ export async function modify( - id : _espe.type.member_id, - object : _espe.type.member_object + member_id : _espe.type.member_id, + data : { + email_address_private : (null | string); + registered : boolean; + enabled : boolean; + } ) : Promise { - await _espe.repository.member.update(id, object); + const member_object_old : _espe.type.member_object = await get(member_id); + const member_object_new : _espe.type.member_object = { + "membership_number": member_object_old.membership_number, + "name_real_value": member_object_old.name_real_value, + "name_real_index": member_object_old.name_real_index, + "email_address_private": data.email_address_private, + "registered": data.registered, + "enabled": data.enabled, + "email_use_veiled_address": member_object_old.email_use_veiled_address, + "email_use_nominal_address": member_object_old.email_use_nominal_address, + "email_redirect_to_private_address": member_object_old.email_redirect_to_private_address, + "email_allow_sending": member_object_old.email_allow_sending, + "password_image": member_object_old.password_image, + }; + await _espe.repository.member.update(member_id, member_object_new); notify_change(); } + + /* export async function remove( id : _espe.type.member_id ) : Promise diff --git a/tools/makefile b/tools/makefile index 22ac6a4..403bea0 100644 --- a/tools/makefile +++ b/tools/makefile @@ -44,6 +44,9 @@ ${dir_temp}/espe-unlinked.js: \ ${dir_source}/api/actions/member_summon.ts \ ${dir_source}/api/actions/member_info.ts \ ${dir_source}/api/actions/member_register.ts \ + ${dir_source}/api/actions/member_list.ts \ + ${dir_source}/api/actions/member_read.ts \ + ${dir_source}/api/actions/member_modify.ts \ ${dir_source}/api/functions.ts \ ${dir_source}/conf.ts \ ${dir_source}/main.ts