[mod] api
This commit is contained in:
parent
ba21a1c632
commit
362eb0da3a
15 changed files with 505 additions and 379 deletions
|
@ -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),
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
}
|
106
source/api/actions/member_info.ts
Normal file
106
source/api/actions/member_info.ts
Normal 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
|
||||
});
|
||||
},
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
}
|
|
@ -3,17 +3,21 @@ namespace _espe.api
|
|||
|
||||
/**
|
||||
*/
|
||||
export function register_member_create(
|
||||
export function register_member_project(
|
||||
rest_subject : lib_plankton.rest.type_rest
|
||||
) : void
|
||||
{
|
||||
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,
|
||||
lib_plankton.http.enum_method.post,
|
||||
"/member/create",
|
||||
"/member/project",
|
||||
{
|
||||
"description": "erstellt ein neues Mitglied und gibt die erzeugte ID aus",
|
||||
"input_schema": () => ({
|
||||
|
@ -29,7 +33,7 @@ namespace _espe.api
|
|||
"type": "string",
|
||||
"nullable": false,
|
||||
},
|
||||
"email_address_private_value": {
|
||||
"email_address_private": {
|
||||
"type": "string",
|
||||
"nullable": true,
|
||||
},
|
||||
|
@ -37,6 +41,7 @@ namespace _espe.api
|
|||
"required": [
|
||||
"membership_number",
|
||||
"name_real_value",
|
||||
"email_address_private",
|
||||
]
|
||||
}),
|
||||
"output_schema": () => ({
|
||||
|
@ -45,22 +50,13 @@ namespace _espe.api
|
|||
}),
|
||||
"restriction": restriction_logged_in,
|
||||
"execution": async ({"input": input}) => {
|
||||
const member_value : _espe.service.member.type_value = {
|
||||
"membership_number": input.membership_number,
|
||||
"name_real_value": input.name_real_value,
|
||||
"name_real_extension": null,
|
||||
"email_address_private_value": input.email_address_private_value,
|
||||
"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);
|
||||
const member_id : _espe.type.member_id = await _espe.service.member.project(
|
||||
{
|
||||
"membership_number": input.membership_number,
|
||||
"name_real_value": input.name_real_value,
|
||||
"email_address_private": input.email_address_private,
|
||||
}
|
||||
);
|
||||
return Promise.resolve({
|
||||
"status_code": 201,
|
||||
"data": member_id
|
|
@ -2,7 +2,7 @@ namespace _espe.api
|
|||
{
|
||||
|
||||
/**
|
||||
* @todo types
|
||||
* @todo zeitliche Begrenzung?
|
||||
*/
|
||||
export function register_member_register(
|
||||
rest_subject : lib_plankton.rest.type_rest
|
||||
|
@ -10,12 +10,10 @@ namespace _espe.api
|
|||
{
|
||||
lib_plankton.rest.register<
|
||||
{
|
||||
name_login : string;
|
||||
name_display : string;
|
||||
salutation : string;
|
||||
email_mode : ("none" | "number" | "number_and_name");
|
||||
email_redirect : boolean;
|
||||
password : string;
|
||||
email_use_veiled_address : boolean;
|
||||
email_use_nominal_address : boolean;
|
||||
email_redirect_to_private_address : boolean;
|
||||
password : (null | string);
|
||||
},
|
||||
null
|
||||
>(
|
||||
|
@ -24,52 +22,74 @@ namespace _espe.api
|
|||
"/member/register/:id",
|
||||
{
|
||||
"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": [
|
||||
{
|
||||
"name": "verification",
|
||||
"name": "key",
|
||||
"required": true,
|
||||
"description": "Prüfwert",
|
||||
"description": "Zugriffs-Schlüssel",
|
||||
},
|
||||
],
|
||||
"restriction": restriction_verification(stuff => parseInt(stuff.path_parameters["id"])),
|
||||
"execution": async ({"path_parameters": path_parameters, "query_parameters": query_parameters, "input": input}) => {
|
||||
const id : _espe.service.member.type_id = parseInt(path_parameters["id"]);
|
||||
let successful : boolean = false;
|
||||
try {
|
||||
await _espe.service.member.register(
|
||||
id,
|
||||
"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"]);
|
||||
return (
|
||||
_espe.service.member.register(
|
||||
member_id,
|
||||
{
|
||||
"name_login": input.name_login,
|
||||
"name_display": input.name_display,
|
||||
"salutation": input.salutation,
|
||||
"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,
|
||||
"email_use_veiled_address": input.email_use_veiled_address,
|
||||
"email_use_nominal_address": input.email_use_nominal_address,
|
||||
"email_redirect_to_private_address": input.email_redirect_to_private_address,
|
||||
"password": input.password,
|
||||
}
|
||||
);
|
||||
successful = true;
|
||||
}
|
||||
catch (error) {
|
||||
successful = false;
|
||||
}
|
||||
if (! successful) {
|
||||
return Promise.resolve({
|
||||
"status_code": 409,
|
||||
"data": "bereits registriert",
|
||||
});
|
||||
}
|
||||
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,
|
||||
});
|
||||
}
|
||||
)
|
||||
.then(
|
||||
() => Promise.resolve({
|
||||
"status_code": 200,
|
||||
"data": null,
|
||||
})
|
||||
)
|
||||
.catch(
|
||||
() => Promise.resolve({
|
||||
"status_code": 409,
|
||||
"data": /*"bereits registriert"*/null,
|
||||
})
|
||||
)
|
||||
);
|
||||
},
|
||||
}
|
||||
)
|
||||
|
|
35
source/api/actions/member_summon.ts
Normal file
35
source/api/actions/member_summon.ts
Normal 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,
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
|
@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
|
@ -34,13 +34,14 @@ namespace _espe.api
|
|||
/**
|
||||
*/
|
||||
export function restriction_verification(
|
||||
extract_data : ((stuff) => any)
|
||||
extract_data : ((stuff) => any),
|
||||
extract_verification : ((stuff) => string)
|
||||
) : lib_plankton.rest.type_restriction<any>
|
||||
{
|
||||
return (
|
||||
(stuff) => _espe.helpers.verification_check(
|
||||
extract_data(stuff),
|
||||
stuff.query_parameters["verification"]
|
||||
extract_verification(stuff)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ namespace _espe.api
|
|||
_espe.api.register_session_begin(rest_subject);
|
||||
_espe.api.register_session_end(rest_subject);
|
||||
}
|
||||
_espe.api.register_email(rest_subject);
|
||||
// _espe.api.register_email(rest_subject);
|
||||
// verification
|
||||
{
|
||||
// _espe.api.register_verification_get(rest_subject);
|
||||
|
@ -32,14 +32,14 @@ namespace _espe.api
|
|||
}
|
||||
// member
|
||||
{
|
||||
_espe.api.register_member_list(rest_subject);
|
||||
_espe.api.register_member_read(rest_subject);
|
||||
_espe.api.register_member_create(rest_subject);
|
||||
_espe.api.register_member_project(rest_subject);
|
||||
_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_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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ namespace _espe.database
|
|||
/**
|
||||
*/
|
||||
const _compatible_revisions : Array<string> = [
|
||||
"r1",
|
||||
"r2",
|
||||
];
|
||||
|
||||
|
||||
|
|
|
@ -159,7 +159,9 @@ async function main(
|
|||
break;
|
||||
}
|
||||
case "api-doc": {
|
||||
lib_plankton.log.conf_push([]);
|
||||
const rest_subject : lib_plankton.rest.type_rest = _espe.api.make();
|
||||
lib_plankton.log.conf_pop();
|
||||
process.stdout.write(
|
||||
JSON.stringify(
|
||||
lib_plankton.rest.to_oas(rest_subject),
|
||||
|
|
|
@ -7,7 +7,7 @@ namespace _espe.repository.member
|
|||
null
|
||||
|
|
||||
lib_plankton.storage.type_store<
|
||||
_espe.type.member.id,
|
||||
_espe.type.member_id,
|
||||
Record<string, any>,
|
||||
{},
|
||||
lib_plankton.storage.type_sql_table_autokey_search_term,
|
||||
|
@ -20,7 +20,7 @@ namespace _espe.repository.member
|
|||
*/
|
||||
function get_store(
|
||||
) : lib_plankton.storage.type_store<
|
||||
_espe.type.member.id,
|
||||
_espe.type.member_id,
|
||||
Record<string, any>,
|
||||
{},
|
||||
lib_plankton.storage.type_sql_table_autokey_search_term,
|
||||
|
@ -46,7 +46,7 @@ namespace _espe.repository.member
|
|||
/**
|
||||
*/
|
||||
function encode(
|
||||
object : _espe.type.member.object
|
||||
object : _espe.type.member_object
|
||||
) : Record<string, any>
|
||||
{
|
||||
return {
|
||||
|
@ -69,7 +69,7 @@ namespace _espe.repository.member
|
|||
*/
|
||||
function decode(
|
||||
row : Record<string, any>
|
||||
) : _espe.type.member.object
|
||||
) : _espe.type.member_object
|
||||
{
|
||||
return {
|
||||
"membership_number": row["membership_number"],
|
||||
|
@ -93,8 +93,8 @@ namespace _espe.repository.member
|
|||
) : Promise<
|
||||
Array<
|
||||
{
|
||||
id : _espe.type.member.id;
|
||||
value : _espe.type.member.object;
|
||||
id : _espe.type.member_id;
|
||||
object : _espe.type.member_object;
|
||||
}
|
||||
>
|
||||
>
|
||||
|
@ -104,7 +104,7 @@ namespace _espe.repository.member
|
|||
.map(
|
||||
({"key": key, "preview": preview}) => ({
|
||||
"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<
|
||||
Array<
|
||||
{
|
||||
id : _espe.type.member.id;
|
||||
id : _espe.type.member_id;
|
||||
preview : {
|
||||
membership_number : string,
|
||||
name_real : string;
|
||||
|
@ -144,8 +144,8 @@ namespace _espe.repository.member
|
|||
/**
|
||||
*/
|
||||
export async function read(
|
||||
id : _espe.type.member.id
|
||||
) : Promise<_espe.type.member.object>
|
||||
id : _espe.type.member_id
|
||||
) : Promise<_espe.type.member_object>
|
||||
{
|
||||
const row : Record<string, any> = await get_store().read(id);
|
||||
|
||||
|
@ -156,11 +156,11 @@ namespace _espe.repository.member
|
|||
/**
|
||||
*/
|
||||
export async function create(
|
||||
value : _espe.type.member.object
|
||||
) : Promise<_espe.type.member.id>
|
||||
value : _espe.type.member_object
|
||||
) : Promise<_espe.type.member_id>
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
@ -169,8 +169,8 @@ namespace _espe.repository.member
|
|||
/**
|
||||
*/
|
||||
export async function update(
|
||||
id : _espe.type.member.id,
|
||||
value : _espe.type.member.object
|
||||
id : _espe.type.member_id,
|
||||
value : _espe.type.member_object
|
||||
) : Promise<void>
|
||||
{
|
||||
const row : Record<string, any> = encode(value);
|
||||
|
@ -181,8 +181,8 @@ namespace _espe.repository.member
|
|||
|
||||
/**
|
||||
*/
|
||||
export async function delete(
|
||||
id : _espe.type.member.id
|
||||
export async function delete_(
|
||||
id : _espe.type.member_id
|
||||
) : Promise<void>
|
||||
{
|
||||
await get_store().delete(id);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
namespace _espe.repository.member
|
||||
namespace _espe.repository.name_index
|
||||
{
|
||||
|
||||
/**
|
||||
|
@ -10,7 +10,7 @@ namespace _espe.repository.member
|
|||
Array<any>,
|
||||
Record<string, any>,
|
||||
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>
|
||||
>
|
||||
) = null;
|
||||
|
@ -23,12 +23,12 @@ namespace _espe.repository.member
|
|||
Array<any>,
|
||||
Record<string, any>,
|
||||
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>
|
||||
>
|
||||
{
|
||||
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(),
|
||||
"table_name": "name_indices",
|
||||
|
@ -51,7 +51,7 @@ namespace _espe.repository.member
|
|||
{
|
||||
let row : Record<string, any>;
|
||||
try {
|
||||
row = await get_chest().read(name);
|
||||
row = await get_chest().read([name]);
|
||||
return row["index"];
|
||||
}
|
||||
catch (error) {
|
||||
|
@ -67,7 +67,7 @@ namespace _espe.repository.member
|
|||
index : int
|
||||
) : Promise<void>
|
||||
{
|
||||
return get_chest().write(name, index);
|
||||
await get_chest().write([name], {"index": index});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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 : {
|
||||
membership_number : string;
|
||||
name_real_value : 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 object : _espe.type.member.object = {
|
||||
const name_real_index : int = await _espe.service.name_index.next(data.name_real_value);
|
||||
const object : _espe.type.member_object = {
|
||||
"membership_number": data.membership_number,
|
||||
"name_real_value": data.name_real_value,
|
||||
"name_real_index": name_real_index,
|
||||
|
@ -53,38 +160,137 @@ namespace _espe.service.member
|
|||
"email_allow_sending": false,
|
||||
"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();
|
||||
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(
|
||||
) : 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();
|
||||
}
|
||||
|
||||
|
||||
export async function get(
|
||||
id : _espe.type.member.id
|
||||
) : Promise<_espe.type.member.object>
|
||||
{
|
||||
return _espe.repository.member.read(id);
|
||||
}
|
||||
|
||||
|
||||
export async function modify(
|
||||
id : _espe.type.member.id,
|
||||
object : _espe.type.member.object
|
||||
id : _espe.type.member_id,
|
||||
object : _espe.type.member_object
|
||||
) : Promise<void>
|
||||
{
|
||||
await _espe.repository.member.update(id, object);
|
||||
|
@ -93,124 +299,18 @@ namespace _espe.service.member
|
|||
|
||||
|
||||
export async function remove(
|
||||
id : _espe.type.member.id
|
||||
id : _espe.type.member_id
|
||||
) : Promise<void>
|
||||
{
|
||||
await _espe.repository.member.delete(id);
|
||||
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)
|
||||
*/
|
||||
export async function export_authelia_user_file(
|
||||
) : Promise<string>
|
||||
{
|
||||
|
@ -222,21 +322,17 @@ namespace _espe.service.member
|
|||
x => x.map(
|
||||
entry => Object.assign(
|
||||
entry,
|
||||
{"email_address": derive_email_address_to_use(entry.value)}
|
||||
{"email_address": email_address(entry.object)}
|
||||
)
|
||||
),
|
||||
x => x.filter(
|
||||
entry => (
|
||||
(
|
||||
(entry.value.name_login !== null)
|
||||
&&
|
||||
(entry.value.name_login !== "")
|
||||
)
|
||||
entry.object.registered
|
||||
&&
|
||||
(
|
||||
(entry.value.password_image !== null)
|
||||
(entry.object.password_image !== null)
|
||||
&&
|
||||
(entry.value.password_image !== "")
|
||||
(entry.object.password_image !== "")
|
||||
)
|
||||
&&
|
||||
(entry.email_address !== null)
|
||||
|
@ -244,21 +340,13 @@ namespace _espe.service.member
|
|||
),
|
||||
x => x.map(
|
||||
entry => ([
|
||||
entry.value.name_login,
|
||||
name_login(entry.object),
|
||||
{
|
||||
"disabled": (! entry.value.enabled),
|
||||
"displayname": (
|
||||
(
|
||||
(entry.value.name_display !== null)
|
||||
&&
|
||||
(entry.value.name_display !== "")
|
||||
)
|
||||
? entry.value.name_display
|
||||
: entry.value.name_real_value
|
||||
),
|
||||
"disabled": (! entry.object.enabled),
|
||||
"displayname": name_display(entry.object),
|
||||
"email": entry.email_address,
|
||||
"groups": [],
|
||||
"password": entry.value.password_image,
|
||||
"password": entry.object.password_image,
|
||||
}
|
||||
])
|
||||
),
|
||||
|
@ -268,7 +356,6 @@ namespace _espe.service.member
|
|||
]
|
||||
);
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
name_real_value : string;
|
||||
name_real_index : string;
|
||||
name_real_index : int;
|
||||
email_address_private : (null | string);
|
||||
registered : boolean;
|
||||
enabled : boolean;
|
|
@ -28,7 +28,7 @@ ${dir_temp}/espe-unlinked.js: \
|
|||
${dir_lib}/plankton/plankton.d.ts \
|
||||
${dir_source}/helpers.ts \
|
||||
${dir_source}/database.ts \
|
||||
${dir_source}/types/member.ts \
|
||||
${dir_source}/types.ts \
|
||||
${dir_source}/repositories/name_index.ts \
|
||||
${dir_source}/repositories/member.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/verification_get.ts \
|
||||
${dir_source}/api/actions/verification_check.ts \
|
||||
${dir_source}/api/actions/member_list.ts \
|
||||
${dir_source}/api/actions/member_read.ts \
|
||||
${dir_source}/api/actions/member_create.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_project.ts \
|
||||
${dir_source}/api/actions/member_summon.ts \
|
||||
${dir_source}/api/actions/member_info.ts \
|
||||
${dir_source}/api/actions/member_register.ts \
|
||||
${dir_source}/api/functions.ts \
|
||||
${dir_source}/conf.ts \
|
||||
|
|
Loading…
Add table
Reference in a new issue