[mod] api

This commit is contained in:
roydfalk 2024-04-29 22:40:52 +02:00
parent ba21a1c632
commit 362eb0da3a
15 changed files with 505 additions and 379 deletions

View file

@ -1,67 +0,0 @@
namespace _espe.api
{
/**
* @todo types
* @todo restriction
*/
export function register_member_get(
rest_subject : lib_plankton.rest.type_rest
) : void
{
lib_plankton.rest.register<
int,
(
null
|
{
name_real : string;
name_login : string;
email_address_numerical_value : string;
email_address_namely_value : string;
}
)
>(
rest_subject,
lib_plankton.http.enum_method.get,
"/member/get/:id",
{
"description": "gibt Angaben über ein Mitglied aus, die für die Registrierung verwendet werden dürfen",
"query_parameters": [
{
"name": "key",
"required": true,
"description": "Zugriffs-Schlüssel",
},
],
"restriction": restriction_none,
"execution": async ({"path_parameters": path_parameters, "query_parameters": query_parameters, "input": input}) => {
const key : string = query_parameters["key"];
const member_id : _espe.service.member.type_id = parseInt(path_parameters["id"]);
const member_value : _espe.service.member.type_value = await _espe.service.member.get(member_id);
if (member_value.registered) {
return Promise.resolve({
"status_code": 409,
"data": /*"bereits registriert"*/null,
});
}
else {
return Promise.resolve({
"status_code": 200,
"data": {
"name_real": member_value.name_real_value,
"name_login": _espe.service.member.derive_login_name(member_value),
// TODO
"email_address_numerical_value": _espe.service.member.derive_email_address_numerical(member_value),
// TODO
"email_address_namely_value": _espe.service.member.derive_email_address_namely(member_value),
},
});
}
},
}
)
}
}

View file

@ -0,0 +1,106 @@
namespace _espe.api
{
/**
* @todo zeitliche Begrenzung?
*/
export function register_member_info(
rest_subject : lib_plankton.rest.type_rest
) : void
{
lib_plankton.rest.register<
int,
(
null
|
{
name_real_value : string;
name_real_index : int;
name_login : string;
email_address_veiled : string;
email_address_nominal : string;
}
)
>(
rest_subject,
lib_plankton.http.enum_method.get,
"/member/info/:id",
{
"description": "gibt Angaben über ein Mitglied aus, die für die Registrierung verwendet werden dürfen",
"input_schema": () => ({
"type": "number",
"nullable": false,
}),
"output_schema": () => ({
"type": "object",
"nullable": false,
"additionalProperties": false,
"properties": {
"name_real_value": {
"type": "string",
"nullable": false,
},
"name_real_index": {
"type": "number",
"nullable": false,
},
"name_login": {
"type": "string",
"nullable": false,
},
"email_address_veiled": {
"type": "string",
"nullable": false,
},
"email_address_nominal": {
"type": "string",
"nullable": false,
},
},
"required": [
"name_real_value",
"name_real_index",
"name_login",
"email_address_veiled",
"email_address_nominal",
]
}),
"query_parameters": [
{
"name": "key",
"required": true,
"description": "Zugriffs-Schlüssel",
},
],
"restriction": restriction_verification(
stuff => parseInt(stuff.path_parameters["id"]),
stuff => stuff.query_parameters["key"]
),
"execution": async ({"path_parameters": path_parameters, "input": input}) => {
const member_id : _espe.type.member_id = parseInt(path_parameters["id"]);
const data : (
null
|
{
name_real_value : string;
name_real_index : int;
name_login : string;
email_address_veiled : string;
email_address_nominal : string;
}
) = await _espe.service.member.info(member_id);
return Promise.resolve({
"status_code": (
(data === null)
? 409
: 200
),
"data": data
});
},
}
)
}
}

View file

@ -3,17 +3,21 @@ namespace _espe.api
/** /**
*/ */
export function register_member_create( export function register_member_project(
rest_subject : lib_plankton.rest.type_rest rest_subject : lib_plankton.rest.type_rest
) : void ) : void
{ {
lib_plankton.rest.register< lib_plankton.rest.register<
_espe.service.member.type_value, {
_espe.service.member.type_id membership_number : string;
name_real_value : string;
email_address_private : (null | string);
},
_espe.type.member_id
>( >(
rest_subject, rest_subject,
lib_plankton.http.enum_method.post, lib_plankton.http.enum_method.post,
"/member/create", "/member/project",
{ {
"description": "erstellt ein neues Mitglied und gibt die erzeugte ID aus", "description": "erstellt ein neues Mitglied und gibt die erzeugte ID aus",
"input_schema": () => ({ "input_schema": () => ({
@ -29,7 +33,7 @@ namespace _espe.api
"type": "string", "type": "string",
"nullable": false, "nullable": false,
}, },
"email_address_private_value": { "email_address_private": {
"type": "string", "type": "string",
"nullable": true, "nullable": true,
}, },
@ -37,6 +41,7 @@ namespace _espe.api
"required": [ "required": [
"membership_number", "membership_number",
"name_real_value", "name_real_value",
"email_address_private",
] ]
}), }),
"output_schema": () => ({ "output_schema": () => ({
@ -45,22 +50,13 @@ namespace _espe.api
}), }),
"restriction": restriction_logged_in, "restriction": restriction_logged_in,
"execution": async ({"input": input}) => { "execution": async ({"input": input}) => {
const member_value : _espe.service.member.type_value = { const member_id : _espe.type.member_id = await _espe.service.member.project(
"membership_number": input.membership_number, {
"name_real_value": input.name_real_value, "membership_number": input.membership_number,
"name_real_extension": null, "name_real_value": input.name_real_value,
"email_address_private_value": input.email_address_private_value, "email_address_private": input.email_address_private,
"enabled": false, }
"name_display": null, );
"name_login": null,
"password_image": null,
"email_address_numberbased_use": false,
"email_address_namebased_use": false,
"email_redirect_to_private": false,
"salutation": null,
"registered": false,
};
const member_id : _espe.service.member.type_id = await _espe.service.member.add(member_value);
return Promise.resolve({ return Promise.resolve({
"status_code": 201, "status_code": 201,
"data": member_id "data": member_id

View file

@ -2,7 +2,7 @@ namespace _espe.api
{ {
/** /**
* @todo types * @todo zeitliche Begrenzung?
*/ */
export function register_member_register( export function register_member_register(
rest_subject : lib_plankton.rest.type_rest rest_subject : lib_plankton.rest.type_rest
@ -10,12 +10,10 @@ namespace _espe.api
{ {
lib_plankton.rest.register< lib_plankton.rest.register<
{ {
name_login : string; email_use_veiled_address : boolean;
name_display : string; email_use_nominal_address : boolean;
salutation : string; email_redirect_to_private_address : boolean;
email_mode : ("none" | "number" | "number_and_name"); password : (null | string);
email_redirect : boolean;
password : string;
}, },
null null
>( >(
@ -24,52 +22,74 @@ namespace _espe.api
"/member/register/:id", "/member/register/:id",
{ {
"description": "nimmt zusätzliche Angaben eines Mitglieds entgegen", "description": "nimmt zusätzliche Angaben eines Mitglieds entgegen",
"input_schema": () => ({
"type": "object",
"nullable": false,
"additionalProperties": false,
"properties": {
"email_use_veiled_address": {
"type": "boolean",
"nullable": false,
},
"email_use_nominal_address": {
"type": "boolean",
"nullable": false,
},
"email_redirect_to_private_address": {
"type": "boolean",
"nullable": false,
},
"password": {
"type": "string",
"nullable": true,
},
},
"required": [
"email_use_veiled_address",
"email_use_nominal_address",
"email_redirect_to_private_address",
"password",
]
}),
"output_schema": () => ({
"nullable": true,
}),
"query_parameters": [ "query_parameters": [
{ {
"name": "verification", "name": "key",
"required": true, "required": true,
"description": "Prüfwert", "description": "Zugriffs-Schlüssel",
}, },
], ],
"restriction": restriction_verification(stuff => parseInt(stuff.path_parameters["id"])), "restriction": restriction_verification(
"execution": async ({"path_parameters": path_parameters, "query_parameters": query_parameters, "input": input}) => { stuff => parseInt(stuff.path_parameters["id"]),
const id : _espe.service.member.type_id = parseInt(path_parameters["id"]); stuff => stuff.query_parameters["key"]
let successful : boolean = false; ),
try { "execution": async ({"path_parameters": path_parameters, "input": input}) => {
await _espe.service.member.register( const member_id : _espe.type.member_id = parseInt(path_parameters["id"]);
id, return (
_espe.service.member.register(
member_id,
{ {
"name_login": input.name_login, "email_use_veiled_address": input.email_use_veiled_address,
"name_display": input.name_display, "email_use_nominal_address": input.email_use_nominal_address,
"salutation": input.salutation, "email_redirect_to_private_address": input.email_redirect_to_private_address,
"email_address_numberbased_use": ["number", "number_and_name"].includes(input.email_mode),
"email_address_namebased_use": ["number_and_name"].includes(input.email_mode),
"email_redirect_to_private": input.email_redirect,
"password": input.password, "password": input.password,
} }
); )
successful = true; .then(
} () => Promise.resolve({
catch (error) { "status_code": 200,
successful = false; "data": null,
} })
if (! successful) { )
return Promise.resolve({ .catch(
"status_code": 409, () => Promise.resolve({
"data": "bereits registriert", "status_code": 409,
}); "data": /*"bereits registriert"*/null,
} })
else { )
await _espe.helpers.email_send( );
_espe.conf.get().admins.map(admin => admin.email_address).filter(x => (x !== null)),
"Eingegangene Registrierung",
("Member-ID: " + id.toFixed(0))
);
return Promise.resolve({
"status_code": 200,
"data": null,
});
}
}, },
} }
) )

View file

@ -0,0 +1,35 @@
namespace _espe.api
{
/**
*/
export function register_member_summon(
rest_subject : lib_plankton.rest.type_rest
) : void
{
lib_plankton.rest.register<
{
url_template : string;
},
null
>(
rest_subject,
lib_plankton.http.enum_method.post,
"/member/summon/:id",
{
"description": "sendet an ein Mitglied eine E-Mail mit Aufforderung zur Registrierung",
"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.summon(member_id, input.url_template);
return Promise.resolve({
"status_code": 200,
"data": null,
});
}
}
);
}
}

View file

@ -1,50 +0,0 @@
namespace _espe.api
{
/**
*/
export function register_member_urge_for_registration(
rest_subject : lib_plankton.rest.type_rest
) : void
{
lib_plankton.rest.register<{id : int; url : string;}, null>(
rest_subject,
lib_plankton.http.enum_method.post,
"/member/urge_for_registration",
{
"description": "sendet an ein Mitglied eine E-Mail mit Aufforderung zur Registrierung",
"restriction": restriction_logged_in,
"execution": async ({"input": input}) => {
const member_id : _espe.service.member.type_id = input.id;
const member_value : _espe.service.member.type_value = await _espe.service.member.get(member_id);
const verification : string = await _espe.helpers.verification_get(member_id);
await _espe.helpers.email_send(
[
member_value.email_address_private_value,
],
_espe.conf.get().settings.registration_email.subject,
lib_plankton.string.coin(
_espe.conf.get().settings.registration_email.body,
{
"name": member_value.name_real_value,
"url": lib_plankton.string.coin(
input.url,
{
"verification": verification,
}
),
}
)
);
return Promise.resolve({
"status_code": 200,
"data": null,
});
}
}
);
}
}

View file

@ -34,13 +34,14 @@ namespace _espe.api
/** /**
*/ */
export function restriction_verification( export function restriction_verification(
extract_data : ((stuff) => any) extract_data : ((stuff) => any),
extract_verification : ((stuff) => string)
) : lib_plankton.rest.type_restriction<any> ) : lib_plankton.rest.type_restriction<any>
{ {
return ( return (
(stuff) => _espe.helpers.verification_check( (stuff) => _espe.helpers.verification_check(
extract_data(stuff), extract_data(stuff),
stuff.query_parameters["verification"] extract_verification(stuff)
) )
); );
} }

View file

@ -24,7 +24,7 @@ namespace _espe.api
_espe.api.register_session_begin(rest_subject); _espe.api.register_session_begin(rest_subject);
_espe.api.register_session_end(rest_subject); _espe.api.register_session_end(rest_subject);
} }
_espe.api.register_email(rest_subject); // _espe.api.register_email(rest_subject);
// verification // verification
{ {
// _espe.api.register_verification_get(rest_subject); // _espe.api.register_verification_get(rest_subject);
@ -32,14 +32,14 @@ namespace _espe.api
} }
// member // member
{ {
_espe.api.register_member_list(rest_subject); _espe.api.register_member_project(rest_subject);
_espe.api.register_member_read(rest_subject); _espe.api.register_member_summon(rest_subject);
_espe.api.register_member_create(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_update(rest_subject);
// _espe.api.register_member_delete(rest_subject); // _espe.api.register_member_delete(rest_subject);
_espe.api.register_member_get(rest_subject);
_espe.api.register_member_register(rest_subject);
_espe.api.register_member_urge_for_registration(rest_subject);
} }

View file

@ -4,7 +4,7 @@ namespace _espe.database
/** /**
*/ */
const _compatible_revisions : Array<string> = [ const _compatible_revisions : Array<string> = [
"r1", "r2",
]; ];

View file

@ -159,7 +159,9 @@ async function main(
break; break;
} }
case "api-doc": { case "api-doc": {
lib_plankton.log.conf_push([]);
const rest_subject : lib_plankton.rest.type_rest = _espe.api.make(); const rest_subject : lib_plankton.rest.type_rest = _espe.api.make();
lib_plankton.log.conf_pop();
process.stdout.write( process.stdout.write(
JSON.stringify( JSON.stringify(
lib_plankton.rest.to_oas(rest_subject), lib_plankton.rest.to_oas(rest_subject),

View file

@ -7,7 +7,7 @@ namespace _espe.repository.member
null null
| |
lib_plankton.storage.type_store< lib_plankton.storage.type_store<
_espe.type.member.id, _espe.type.member_id,
Record<string, any>, Record<string, any>,
{}, {},
lib_plankton.storage.type_sql_table_autokey_search_term, lib_plankton.storage.type_sql_table_autokey_search_term,
@ -20,7 +20,7 @@ namespace _espe.repository.member
*/ */
function get_store( function get_store(
) : lib_plankton.storage.type_store< ) : lib_plankton.storage.type_store<
_espe.type.member.id, _espe.type.member_id,
Record<string, any>, Record<string, any>,
{}, {},
lib_plankton.storage.type_sql_table_autokey_search_term, lib_plankton.storage.type_sql_table_autokey_search_term,
@ -46,7 +46,7 @@ namespace _espe.repository.member
/** /**
*/ */
function encode( function encode(
object : _espe.type.member.object object : _espe.type.member_object
) : Record<string, any> ) : Record<string, any>
{ {
return { return {
@ -69,7 +69,7 @@ namespace _espe.repository.member
*/ */
function decode( function decode(
row : Record<string, any> row : Record<string, any>
) : _espe.type.member.object ) : _espe.type.member_object
{ {
return { return {
"membership_number": row["membership_number"], "membership_number": row["membership_number"],
@ -93,8 +93,8 @@ namespace _espe.repository.member
) : Promise< ) : Promise<
Array< Array<
{ {
id : _espe.type.member.id; id : _espe.type.member_id;
value : _espe.type.member.object; object : _espe.type.member_object;
} }
> >
> >
@ -104,7 +104,7 @@ namespace _espe.repository.member
.map( .map(
({"key": key, "preview": preview}) => ({ ({"key": key, "preview": preview}) => ({
"id": key, "id": key,
"value": (preview as _espe.type.member.object), "object": (preview as _espe.type.member_object),
}) })
) )
); );
@ -117,7 +117,7 @@ namespace _espe.repository.member
) : Promise< ) : Promise<
Array< Array<
{ {
id : _espe.type.member.id; id : _espe.type.member_id;
preview : { preview : {
membership_number : string, membership_number : string,
name_real : string; name_real : string;
@ -144,8 +144,8 @@ namespace _espe.repository.member
/** /**
*/ */
export async function read( export async function read(
id : _espe.type.member.id id : _espe.type.member_id
) : Promise<_espe.type.member.object> ) : Promise<_espe.type.member_object>
{ {
const row : Record<string, any> = await get_store().read(id); const row : Record<string, any> = await get_store().read(id);
@ -156,11 +156,11 @@ namespace _espe.repository.member
/** /**
*/ */
export async function create( export async function create(
value : _espe.type.member.object value : _espe.type.member_object
) : Promise<_espe.type.member.id> ) : Promise<_espe.type.member_id>
{ {
const row : Record<string, any> = encode(value); const row : Record<string, any> = encode(value);
const id : _espe.type.member.id = await get_store().create(row); const id : _espe.type.member_id = await get_store().create(row);
return id; return id;
} }
@ -169,8 +169,8 @@ namespace _espe.repository.member
/** /**
*/ */
export async function update( export async function update(
id : _espe.type.member.id, id : _espe.type.member_id,
value : _espe.type.member.object value : _espe.type.member_object
) : Promise<void> ) : Promise<void>
{ {
const row : Record<string, any> = encode(value); const row : Record<string, any> = encode(value);
@ -181,8 +181,8 @@ namespace _espe.repository.member
/** /**
*/ */
export async function delete( export async function delete_(
id : _espe.type.member.id id : _espe.type.member_id
) : Promise<void> ) : Promise<void>
{ {
await get_store().delete(id); await get_store().delete(id);

View file

@ -1,4 +1,4 @@
namespace _espe.repository.member namespace _espe.repository.name_index
{ {
/** /**
@ -10,7 +10,7 @@ namespace _espe.repository.member
Array<any>, Array<any>,
Record<string, any>, Record<string, any>,
lib_plankton.database.type_description_create_table, lib_plankton.database.type_description_create_table,
lib_plankton.storage.type_sql_table_common_search_term, lib_plankton.storage.sql_table_common.type_sql_table_common_search_term,
Record<string, any> Record<string, any>
> >
) = null; ) = null;
@ -23,12 +23,12 @@ namespace _espe.repository.member
Array<any>, Array<any>,
Record<string, any>, Record<string, any>,
lib_plankton.database.type_description_create_table, lib_plankton.database.type_description_create_table,
lib_plankton.storage.type_sql_table_common_search_term, lib_plankton.storage.sql_table_common.type_sql_table_common_search_term,
Record<string, any> Record<string, any>
> >
{ {
if (_chest === null) { if (_chest === null) {
_chest = lib_plankton.storage.sql_table_common_chest( _chest = lib_plankton.storage.sql_table_common.chest(
{ {
"database_implementation": _espe.helpers.database_implementation(), "database_implementation": _espe.helpers.database_implementation(),
"table_name": "name_indices", "table_name": "name_indices",
@ -51,7 +51,7 @@ namespace _espe.repository.member
{ {
let row : Record<string, any>; let row : Record<string, any>;
try { try {
row = await get_chest().read(name); row = await get_chest().read([name]);
return row["index"]; return row["index"];
} }
catch (error) { catch (error) {
@ -67,7 +67,7 @@ namespace _espe.repository.member
index : int index : int
) : Promise<void> ) : Promise<void>
{ {
return get_chest().write(name, index); await get_chest().write([name], {"index": index});
} }
} }

View file

@ -31,16 +31,123 @@ namespace _espe.service.member
/** /**
*/ */
export async function draft( function name_login(
object : _espe.type.member_object
) : string
{
return lib_plankton.string.coin(
"{{object}}{{extension}}",
{
"object": object.name_real_value.toLowerCase().replace(new RegExp(" ", "g"), "."),
"extension": (
(object.name_real_index === 0)
? ""
: ("." + object.name_real_index.toFixed(0))
),
}
);
}
/**
*/
function name_display(
object : _espe.type.member_object
) : string
{
return object.name_real_value;
}
/**
*/
function email_address_veiled(
object : _espe.type.member_object
) : string
{
return lib_plankton.string.coin(
"{{prefix}}{{membership_number}}@{{domain}}",
{
"prefix": _espe.conf.get().settings.prefix_for_numberbased_email_addresses,
"membership_number": object.membership_number,
"domain": _espe.conf.get().settings.target_domain,
}
);
}
/**
*/
function email_address_nominal(
object : _espe.type.member_object
) : string
{
return lib_plankton.string.coin(
"{{user}}@{{domain}}",
{
"user": name_login(object),
"domain": _espe.conf.get().settings.target_domain,
}
);
}
/**
*/
function email_address(
object : _espe.type.member_object
) : (null | string)
{
return (
object.email_use_nominal_address
? email_address_nominal(object)
: (
object.email_use_veiled_address
? email_address_veiled(object)
: object.email_address_private
)
);
}
/**
*/
async function dump(
) : Promise<
Array<
{
id : _espe.type.member_id;
object : _espe.type.member_object;
}
>
>
{
return _espe.repository.member.dump();
}
/**
*/
async function get(
id : _espe.type.member_id
) : Promise<_espe.type.member_object>
{
return _espe.repository.member.read(id);
}
/**
*/
export async function project(
data : { data : {
membership_number : string; membership_number : string;
name_real_value : string; name_real_value : string;
email_address_private : (null | string); email_address_private : (null | string);
} }
) : Promise<_espe.type.member.id> ) : Promise<_espe.type.member_id>
{ {
const name_real_index : int = await _espe.service.name_index.next(object.name_real_value); const name_real_index : int = await _espe.service.name_index.next(data.name_real_value);
const object : _espe.type.member.object = { const object : _espe.type.member_object = {
"membership_number": data.membership_number, "membership_number": data.membership_number,
"name_real_value": data.name_real_value, "name_real_value": data.name_real_value,
"name_real_index": name_real_index, "name_real_index": name_real_index,
@ -53,38 +160,137 @@ namespace _espe.service.member
"email_allow_sending": false, "email_allow_sending": false,
"password_image": null, "password_image": null,
}; };
const id : _espe.type.member.id = _espe.repository.member.create(object); const id : _espe.type.member_id = await _espe.repository.member.create(object);
notify_change(); notify_change();
return id; return id;
} }
/* /**
export async function dump( */
) : Promise<Array<{id : _espe.type.member.id; value : _espe.type.member.object;}>> export async function summon(
member_id : _espe.type.member_id,
url_template : string
) : Promise<void>
{ {
return _espe.repository.member.dump(); const member_object : _espe.type.member_object = await get(member_id);
const verification : string = await _espe.helpers.verification_get(member_id);
await _espe.helpers.email_send(
[
member_object.email_address_private,
],
_espe.conf.get().settings.registration_email.subject,
lib_plankton.string.coin(
_espe.conf.get().settings.registration_email.body,
{
"name": member_object.name_real_value,
"url": lib_plankton.string.coin(
url_template,
{
"verification": verification,
}
),
}
)
);
} }
/**
*/
export async function info(
member_id : _espe.type.member_id
) : Promise<
(
null
|
{
name_real_value : string;
name_real_index : int;
name_login : string;
email_address_veiled : string;
email_address_nominal : string;
}
)
>
{
const member_object : _espe.type.member_object = await _espe.repository.member.read(member_id);
if (! member_object.registered) {
return {
"name_real_value": member_object.name_real_value,
"name_real_index": member_object.name_real_index,
"name_login": name_login(member_object),
"email_address_veiled": email_address_veiled(member_object),
"email_address_nominal": email_address_nominal(member_object),
};
}
else {
return null;
}
}
/**
* @todo customize notifiation email (conf values)
*/
export async function register(
member_id : _espe.type.member_id,
data : {
email_use_veiled_address : boolean;
email_use_nominal_address : boolean;
email_redirect_to_private_address : boolean;
password : string;
},
options : {
notify_admins ?: boolean;
} = {}
) : Promise<void>
{
options = Object.assign(
{
"notify_admins": false,
},
options
);
const member_object : _espe.type.member_object = await get(member_id);
if (member_object.registered) {
return Promise.reject(new Error("already registered"));
}
else {
member_object.email_use_veiled_address = data.email_use_veiled_address
member_object.email_use_nominal_address = data.email_use_nominal_address
member_object.email_redirect_to_private_address = data.email_redirect_to_private_address;
member_object.password_image = await _espe.helpers.bcrypt_compute(data.password);
member_object.registered = true;
await _espe.repository.member.update(member_id, member_object);
}
notify_change();
if (! options.notify_admins) {
// do nothing
}
else {
await _espe.helpers.email_send(
_espe.conf.get().admins.map(admin => admin.email_address).filter(x => (x !== null)),
"Eingegangene Registrierung",
("Member-ID: " + member_id.toFixed(0))
);
}
}
/*
export async function list( export async function list(
) : Promise<Array<{id : _espe.type.member.id; preview : {membership_number : string, name_real_value : string;};}>> ) : Promise<Array<{id : _espe.type.member_id; preview : {membership_number : string, name_real_value : string;};}>>
{ {
return _espe.repository.member.list(); return _espe.repository.member.list();
} }
export async function get(
id : _espe.type.member.id
) : Promise<_espe.type.member.object>
{
return _espe.repository.member.read(id);
}
export async function modify( export async function modify(
id : _espe.type.member.id, id : _espe.type.member_id,
object : _espe.type.member.object object : _espe.type.member_object
) : Promise<void> ) : Promise<void>
{ {
await _espe.repository.member.update(id, object); await _espe.repository.member.update(id, object);
@ -93,124 +299,18 @@ namespace _espe.service.member
export async function remove( export async function remove(
id : _espe.type.member.id id : _espe.type.member_id
) : Promise<void> ) : Promise<void>
{ {
await _espe.repository.member.delete(id); await _espe.repository.member.delete(id);
notify_change(); notify_change();
} }
*/
export async function register( /**
id : _espe.type.member.id,
data : {
name_login : string;
name_display : string;
salutation : string;
email_address_numberbased_use : boolean;
email_address_namebased_use : boolean;
email_redirect_to_private : boolean;
password : string;
}
) : Promise<void>
{
const member : _espe.type.member.object = await get(id);
if (member.name_login !== null) {
return Promise.reject(new Error("already registered"));
}
else {
member.name_login = data.name_login;
member.name_display = data.name_display;
member.salutation = data.salutation;
member.email_address_numberbased_use = data.email_address_numberbased_use
member.email_address_namebased_use = data.email_address_namebased_use
member.email_redirect_to_private = data.email_redirect_to_private;
member.password_image = await _espe.helpers.bcrypt_compute(data.password);
member.registered = true;
await modify(id, member);
}
}
export function derive_login_name(
value : _espe.type.member.object
) : string
{
return lib_plankton.string.coin(
"{{value}}{{extension}}",
{
"value": value.name_real_value.toLowerCase().replace(new RegExp(" ", "g"), "."),
"extension": (
(
(value.name_real_extension === null)
||
(value.name_real_extension === "")
)
? ""
: ("." + value.name_real_extension)
),
}
);
}
export function derive_email_address_namely(
value : _espe.type.member.object
) : string
{
return lib_plankton.string.coin(
"{{value}}{{extension}}@{{domain}}",
{
"value": value.name_real_value.toLowerCase().replace(new RegExp(" ", "g"), "."),
"extension": (
(
(value.name_real_extension === null)
||
(value.name_real_extension === "")
)
? ""
: ("." + value.name_real_extension)
),
"domain": _espe.conf.get().settings.target_domain,
}
);
}
export function derive_email_address_numerical(
value : _espe.type.member.object
) : string
{
return lib_plankton.string.coin(
"{{prefix}}{{membership_number}}@{{domain}}",
{
"prefix": _espe.conf.get().settings.prefix_for_numberbased_email_addresses,
"membership_number": value.membership_number,
"domain": _espe.conf.get().settings.target_domain,
}
);
}
function derive_email_address_to_use(
value : _espe.type.member.object
) : (null | string)
{
return (
value.email_address_namebased_use
? derive_email_address_namely(value)
: (
value.email_address_numberbased_use
? derive_email_address_numerical(value)
: value.email_address_private_value
)
);
}
* @todo check validity (e.g. username characters) * @todo check validity (e.g. username characters)
*/
export async function export_authelia_user_file( export async function export_authelia_user_file(
) : Promise<string> ) : Promise<string>
{ {
@ -222,21 +322,17 @@ namespace _espe.service.member
x => x.map( x => x.map(
entry => Object.assign( entry => Object.assign(
entry, entry,
{"email_address": derive_email_address_to_use(entry.value)} {"email_address": email_address(entry.object)}
) )
), ),
x => x.filter( x => x.filter(
entry => ( entry => (
( entry.object.registered
(entry.value.name_login !== null)
&&
(entry.value.name_login !== "")
)
&& &&
( (
(entry.value.password_image !== null) (entry.object.password_image !== null)
&& &&
(entry.value.password_image !== "") (entry.object.password_image !== "")
) )
&& &&
(entry.email_address !== null) (entry.email_address !== null)
@ -244,21 +340,13 @@ namespace _espe.service.member
), ),
x => x.map( x => x.map(
entry => ([ entry => ([
entry.value.name_login, name_login(entry.object),
{ {
"disabled": (! entry.value.enabled), "disabled": (! entry.object.enabled),
"displayname": ( "displayname": name_display(entry.object),
(
(entry.value.name_display !== null)
&&
(entry.value.name_display !== "")
)
? entry.value.name_display
: entry.value.name_real_value
),
"email": entry.email_address, "email": entry.email_address,
"groups": [], "groups": [],
"password": entry.value.password_image, "password": entry.object.password_image,
} }
]) ])
), ),
@ -268,7 +356,6 @@ namespace _espe.service.member
] ]
); );
} }
*/
} }

View file

@ -1,17 +1,17 @@
namespace _espe.type.member namespace _espe.type
{ {
/** /**
*/ */
export type id = int; export type member_id = int;
/** /**
*/ */
export type object = { export type member_object = {
membership_number : string; membership_number : string;
name_real_value : string; name_real_value : string;
name_real_index : string; name_real_index : int;
email_address_private : (null | string); email_address_private : (null | string);
registered : boolean; registered : boolean;
enabled : boolean; enabled : boolean;

View file

@ -28,7 +28,7 @@ ${dir_temp}/espe-unlinked.js: \
${dir_lib}/plankton/plankton.d.ts \ ${dir_lib}/plankton/plankton.d.ts \
${dir_source}/helpers.ts \ ${dir_source}/helpers.ts \
${dir_source}/database.ts \ ${dir_source}/database.ts \
${dir_source}/types/member.ts \ ${dir_source}/types.ts \
${dir_source}/repositories/name_index.ts \ ${dir_source}/repositories/name_index.ts \
${dir_source}/repositories/member.ts \ ${dir_source}/repositories/member.ts \
${dir_source}/services/name_index.ts \ ${dir_source}/services/name_index.ts \
@ -40,13 +40,9 @@ ${dir_temp}/espe-unlinked.js: \
${dir_source}/api/actions/email.ts \ ${dir_source}/api/actions/email.ts \
${dir_source}/api/actions/verification_get.ts \ ${dir_source}/api/actions/verification_get.ts \
${dir_source}/api/actions/verification_check.ts \ ${dir_source}/api/actions/verification_check.ts \
${dir_source}/api/actions/member_list.ts \ ${dir_source}/api/actions/member_project.ts \
${dir_source}/api/actions/member_read.ts \ ${dir_source}/api/actions/member_summon.ts \
${dir_source}/api/actions/member_create.ts \ ${dir_source}/api/actions/member_info.ts \
${dir_source}/api/actions/member_update.ts \
${dir_source}/api/actions/member_delete.ts \
${dir_source}/api/actions/member_get.ts \
${dir_source}/api/actions/member_urge_for_registration.ts \
${dir_source}/api/actions/member_register.ts \ ${dir_source}/api/actions/member_register.ts \
${dir_source}/api/functions.ts \ ${dir_source}/api/functions.ts \
${dir_source}/conf.ts \ ${dir_source}/conf.ts \