[task-193] [int]

This commit is contained in:
roydfalk 2025-04-01 04:20:59 +00:00
parent 1bd8a9fe36
commit eb74ecd66f
7 changed files with 191 additions and 48 deletions

View file

@ -17,7 +17,7 @@ namespace _espe.api
{ {
/** /**
*/ */
export function register_invite_examine( export function register_invite_accept(
rest_subject : lib_plankton.rest.type_rest rest_subject : lib_plankton.rest.type_rest
) : void ) : void
{ {

View file

@ -30,7 +30,9 @@ namespace _espe.api
name_value : string; name_value : string;
email_address_mode : int; email_address_mode : int;
email_address_value : (null | string); email_address_value : (null | string);
groups_mode : int;
groups_value : Array<string>; groups_value : Array<string>;
expiry ?: (null | int);
// notification_target_url_template ?: (null | string); // notification_target_url_template ?: (null | string);
}, },
( (
@ -90,6 +92,8 @@ namespace _espe.api
"membership_number_value", "membership_number_value",
"name_value", "name_value",
"email_address_value", "email_address_value",
"groups_value",
"expiry",
] ]
}), }),
"output_schema": () => ({ "output_schema": () => ({
@ -139,17 +143,12 @@ namespace _espe.api
"name_mode": _espe.helpers.invite_prefill_mode_decode(input.name_mode), "name_mode": _espe.helpers.invite_prefill_mode_decode(input.name_mode),
"name_value": input.name_value, "name_value": input.name_value,
"email_address_mode": _espe.helpers.invite_prefill_mode_decode(input.email_address_mode), "email_address_mode": _espe.helpers.invite_prefill_mode_decode(input.email_address_mode),
"email_address_value": ( "email_address_value": input.email_address_value,
("email_address_value" in input)
? (
(input.email_address_value !== "")
? input.email_address_value
: null
)
: null
),
"groups_mode": _espe.helpers.invite_prefill_mode_decode(input.groups_mode), "groups_mode": _espe.helpers.invite_prefill_mode_decode(input.groups_mode),
"groups_value": input.groups_value, "groups_value": input.groups_value,
},
{
"expiry": input.expiry,
} }
); );
return Promise.resolve({ return Promise.resolve({

View file

@ -34,7 +34,7 @@ namespace _espe.api
*/ */
"description": "gibt die Daten einer Einladung anhand ihres Schlüssels aus", "description": "gibt die Daten einer Einladung anhand ihres Schlüssels aus",
"input_schema": () => ({ "input_schema": () => ({
"type": "string" "type": "string",
"nullable": false, "nullable": false,
}), }),
/** /**
@ -44,16 +44,25 @@ namespace _espe.api
"nullable": true, "nullable": true,
}), }),
"restriction": restriction_none, "restriction": restriction_none,
"execution": async ({"input": input}) => { "execution": ({"input": input}) => {
const invite_key : _espe.type.invite_key = input; const invite_key : _espe.type.invite_key = input;
const invite_object : _espe.type.invite_object = await _espe.service.invite.examine(invite_key); return (
/** _espe.service.invite.examine(invite_key)
* @todo .then(
*/ (invite_object) => Promise.resolve({
return Promise.resolve({ "status_code": 200,
"status_code": 501, "data": {
"data": null "membership_number_mode": _espe.helpers.invite_prefill_mode_encode(invite_object.membership_number_mode),
}); }
})
)
.catch(
(error) => Promise.resolve({
"status_code": 404,
"data": "not found"
})
)
);
} }
} }
); );

View file

@ -270,7 +270,7 @@ namespace _espe.helpers
invite_prefill_mode_encoded : int invite_prefill_mode_encoded : int
) : _espe.type.invite_prefill_mode ) : _espe.type.invite_prefill_mode
{ {
switch (invite_prefill_mode) { switch (invite_prefill_mode_encoded) {
case 0: return _espe.type.invite_prefill_mode.hidden; case 0: return _espe.type.invite_prefill_mode.hidden;
case 1: return _espe.type.invite_prefill_mode.locked; case 1: return _espe.type.invite_prefill_mode.locked;
case 2: return _espe.type.invite_prefill_mode.free; case 2: return _espe.type.invite_prefill_mode.free;

View file

@ -112,22 +112,23 @@ namespace _espe.repository.invite
/** /**
*/ */
function encode( function encode(
object : _espe.type.member_object object : _espe.type.invite_object
) : type_dispersal ) : type_dispersal
{ {
return { return {
"core_row": { "core_row": {
"key": object.key, "key": object.key,
"membership_number_mode": invite_prefill_mode_encode(object.membership_number_mode), "expiry": object.expiry,
"membership_number_mode": _espe.helpers.invite_prefill_mode_encode(object.membership_number_mode),
"membership_number_value": object.membership_number_value, "membership_number_value": object.membership_number_value,
"name_mode": invite_prefill_mode_encode(object.name_mode), "name_mode": _espe.helpers.invite_prefill_mode_encode(object.name_mode),
"name_value": object.name_value, "name_value": object.name_value,
"email_address_mode": invite_prefill_mode_encode(object.email_address_mode), "email_address_mode": _espe.helpers.invite_prefill_mode_encode(object.email_address_mode),
"email_address_value": object.email_address_value, "email_address_value": object.email_address_value,
"groups_mode": invite_prefill_mode_encode(object.groups_mode), "groups_mode": _espe.helpers.invite_prefill_mode_encode(object.groups_mode),
}, },
"group_rows": ( "group_rows": (
object.groups object.groups_value
.map( .map(
group => ({ group => ({
"group_name": group, "group_name": group,
@ -142,17 +143,18 @@ namespace _espe.repository.invite
*/ */
function decode( function decode(
dispersal : type_dispersal dispersal : type_dispersal
) : _espe.type.member_object ) : _espe.type.invite_object
{ {
return { return {
"key": dispersal.core_row["key"], "key": dispersal.core_row["key"],
"membership_number_mode": invite_prefill_mode_decode(dispersal.core_row["membership_number_mode"]), "expiry": dispersal.core_row["expiry"],
"membership_number_mode": _espe.helpers.invite_prefill_mode_decode(dispersal.core_row["membership_number_mode"]),
"membership_number_value": dispersal.core_row["membership_number_value"], "membership_number_value": dispersal.core_row["membership_number_value"],
"name_mode": invite_prefill_mode_decode(dispersal.core_row["name_mode"]), "name_mode": _espe.helpers.invite_prefill_mode_decode(dispersal.core_row["name_mode"]),
"name_value": dispersal.core_row["name_value"], "name_value": dispersal.core_row["name_value"],
"email_address_mode": invite_prefill_mode_decode(dispersal.core_row["email_address_mode"]), "email_address_mode": _espe.helpers.invite_prefill_mode_decode(dispersal.core_row["email_address_mode"]),
"email_address_value": dispersal.core_row["email_address_value"], "email_address_value": dispersal.core_row["email_address_value"],
"groups_mode": invite_prefill_mode_decode(dispersal.core_row["groups_mode"]), "groups_mode": _espe.helpers.invite_prefill_mode_decode(dispersal.core_row["groups_mode"]),
"groups_value": lib_plankton.list.sorted<string>( "groups_value": lib_plankton.list.sorted<string>(
dispersal.group_rows.map(row => row["group_name"]), dispersal.group_rows.map(row => row["group_name"]),
(group1, group2) => ((group1 <= group2) ? 0 : 1) (group1, group2) => ((group1 <= group2) ? 0 : 1)
@ -169,7 +171,7 @@ namespace _espe.repository.invite
) : Promise< ) : Promise<
Array< Array<
{ {
id : _espe.type.inivite_id; id : _espe.type.invite_id;
preview : { preview : {
name : string; name : string;
}; };
@ -179,6 +181,15 @@ namespace _espe.repository.invite
{ {
return ( return (
(await get_core_store().search(null)) (await get_core_store().search(null))
.filter(
({"key": key, "preview": preview}) => (
(search_term === null)
?
true
:
(preview["key"] === search_term)
)
)
.map( .map(
({"key": key, "preview": preview}) => ({ ({"key": key, "preview": preview}) => ({
"id": key, "id": key,
@ -268,6 +279,23 @@ namespace _espe.repository.invite
} }
/**
*/
export async function identify(
key : _espe.type.invite_key
) : Promise<_espe.type.invite_id>
{
const hits : Array<{id : _espe.type.invite_id; preview : any;}> = await list(key);
return (
(hits.length !== 1)
?
Promise.reject<_espe.type.invite_id>(new Error("not found"))
:
Promise.resolve<_espe.type.invite_id>(hits[0].id)
);
}
/** /**
*/ */
export async function dump( export async function dump(

View file

@ -18,38 +18,145 @@ namespace _espe.service.invite
/** /**
*/ */
export function create( export async function create(
{
"membership_number_mode": membership_number_mode,
"membership_number_value": membership_number_value,
"name_mode": name_mode,
"name_value": name_value,
"email_address_mode": email_address_mode,
"email_address_value": email_address_value,
"groups_mode": groups_mode,
"groups_value": groups_value,
} : {
membership_number_mode : _espe.type.invite_prefill_mode;
membership_number_value : (null | string);
name_mode : _espe.type.invite_prefill_mode;
name_value : string;
email_address_mode : _espe.type.invite_prefill_mode;
email_address_value : (null | string);
groups_mode : _espe.type.invite_prefill_mode;
groups_value : Array<string>;
},
{
"expiry": expiry = -1,
} : {
expiry ?: (null | int);
} = {
}
) : Promise<{id : _espe.type.invite_id; key : _espe.type.invite_key}> ) : Promise<{id : _espe.type.invite_id; key : _espe.type.invite_key}>
{ {
throw (new Error("not implemented")); /**
* @todo outsource to conf
*/
const default_lifetime : int = (60 * 60 * 24 * 7 * 2);
/**
* @todo proper salt
*/
const invite_key : _espe.type.invite_key = lib_plankton.sha256.get(
(
name_value
+
"/"
+
lib_plankton.base.get_current_timestamp().toFixed(0)
),
"secret"
);
const invite_object : _espe.type.invite_object = {
"key": invite_key,
"expiry": (
((expiry !== null) && (expiry < 0))
?
(lib_plankton.base.get_current_timestamp() + default_lifetime)
:
expiry
),
"membership_number_mode": membership_number_mode,
"membership_number_value": membership_number_value,
"name_mode": name_mode,
"name_value": name_value,
"email_address_mode": email_address_mode,
"email_address_value": email_address_value,
"groups_mode": groups_mode,
"groups_value": groups_value,
};
const invite_id : _espe.type.invite_id = await _espe.repository.invite.create(invite_object);
return {
"id": invite_id,
"key": invite_key,
};
} }
/** /**
* @todo heed expiry
*/ */
export function examine( export async function examine(
key : _espe.type.invite_key key : _espe.type.invite_key
) : Promise<{id : _espe.type.invite_id; key : _espe.type.invite_key}> ) : Promise<_espe.type.invite_object>
{ {
throw (new Error("not implemented")); const invite_id : _espe.type.invite_id = await _espe.repository.invite.identify(key);
const invite_object : _espe.type.invite_object = await _espe.repository.invite.read(invite_id);
return invite_object;
} }
/** /**
* @todo heed expiry
* @todo password?
*/ */
export function accept( export async function accept(
key : _espe.type.invite_key, key : _espe.type.invite_key,
membership_number_value : (null | string), membership_number_value : (null | string),
name_value : (null | string), name_value : (null | string),
email_address_value : (null | string) email_address_value : (null | string),
groups_value : Array<string>
) : Promise<void> ) : Promise<void>
{ {
/** const invite_id : _espe.type.invite_id = await _espe.repository.invite.identify(key);
* @todo Nutzer anlegen const invite_object : _espe.type.invite_object = await _espe.repository.invite.read(invite_id);
* @todo Einladung löschen const member_id : _espe.type.member_id = await _espe.service.member.project(
*/ {
throw (new Error("not implemented")); "membership_number": (
(invite_object.membership_number_mode === _espe.type.invite_prefill_mode.free)
?
membership_number_value
:
invite_object.membership_number_value
),
"name_real_value": (
(
(invite_object.name_mode === _espe.type.invite_prefill_mode.free)
&&
(name_value !== null)
)
?
name_value
:
invite_object.name_value
),
"email_address_private": (
(
(invite_object.email_address_mode === _espe.type.invite_prefill_mode.free)
&&
(email_address_value !== null)
)
?
email_address_value
:
invite_object.email_address_value
),
"groups": (
(invite_object.groups_mode === _espe.type.invite_prefill_mode.free)
?
groups_value
:
invite_object.groups_value
),
}
);
await _espe.repository.invite.delete_(invite_id);
} }
} }

View file

@ -68,7 +68,7 @@ namespace _espe.type
/** /**
*/ */
enum type invite_prefill_mode = { export enum invite_prefill_mode {
hidden, hidden,
locked, locked,
free, free,
@ -76,10 +76,10 @@ namespace _espe.type
/** /**
* @todo expiry timestamp
*/ */
export type invite_object = { export type invite_object = {
key : invite_key; key : invite_key;
expiry : (null | int);
membership_number_mode : invite_prefill_mode; membership_number_mode : invite_prefill_mode;
membership_number_value : (null | string); membership_number_value : (null | string);
name_mode : invite_prefill_mode; name_mode : invite_prefill_mode;