[task-193] [int]

This commit is contained in:
roydfalk 2025-07-03 08:53:05 +00:00
parent 1ad4f44793
commit 39df56c8af
4 changed files with 170 additions and 67 deletions

View file

@ -2,7 +2,7 @@
"general": { "general": {
"language": null, "language": null,
"verbosity": "info", "verbosity": "info",
"verification_secret": null "verification_secret": "foobar"
}, },
"log": [ "log": [
{ {

View file

@ -24,12 +24,20 @@ namespace _espe.api
lib_plankton.rest_http.register< lib_plankton.rest_http.register<
{ {
key : string; key : string;
membership_number_value : (null | string); data : {
name_value : string; membership_number : (null | string);
email_address_value : (null | string); groups : Array<string>;
groups_value : Array<string>; name : string;
email_address : (null | string);
password : (null | string);
};
}, },
null Array<
{
incident : string;
details : Record<string, any>;
}
>
>( >(
rest_subject, rest_subject,
lib_plankton.http.enum_method.post, lib_plankton.http.enum_method.post,
@ -53,27 +61,28 @@ namespace _espe.api
}), }),
"restriction": () => restriction_none, "restriction": () => restriction_none,
"execution": () => async ({"input": input}) => { "execution": () => async ({"input": input}) => {
if (input === null) { if (input === null)
{
return Promise.resolve({ return Promise.resolve({
"status_code": 400, "status_code": 400,
"data": null "data": null
}); });
} }
else { else
try { {
await _espe.service.invite.accept( try
{
const flaws = await _espe.service.invite.accept(
input.key, input.key,
input.membership_number_value, input.data
input.name_value,
input.email_address_value,
input.groups_value
); );
return Promise.resolve({ return Promise.resolve({
"status_code": 200, "status_code": 200,
"data": null "data": flaws
}); });
} }
catch (error) { catch (error)
{
return Promise.resolve({ return Promise.resolve({
"status_code": 404, "status_code": 404,
"data": null "data": null

View file

@ -248,30 +248,70 @@ namespace _espe.service.invite
/** /**
* @todo heed expiry
* @todo password?
*/ */
export async function accept( export async function accept(
key : _espe.type.invite_key, key : _espe.type.invite_key,
membership_number_value : (null | string), data : {
name_value : (null | string), membership_number : (null | string);
email_address_value : (null | string), groups : Array<string>;
groups_value : Array<string> name : (null | string);
) : Promise<void> email_address : (null | string);
password : (null | string);
}
)
: Promise<
Array<
{
incident : string;
details : Record<string, any>;
}
>
>
{ {
const invite_id : _espe.type.invite_id = await _espe.repository.invite.identify(key); const invite_id : _espe.type.invite_id = await _espe.repository.invite.identify(key);
/**
* might throw, but that's fine, since caught and handled in the API action
*/
const invite_object : _espe.type.invite_object = await _espe.repository.invite.read(invite_id); const invite_object : _espe.type.invite_object = await _espe.repository.invite.read(invite_id);
const now : int = lib_plankton.base.get_current_timestamp(true); const now : int = lib_plankton.base.get_current_timestamp(true);
if ((invite_object.expiry !== null) && (invite_object.expiry < now)) { if ((invite_object.expiry !== null) && (invite_object.expiry < now))
{
return Promise.reject(new Error("expired")); return Promise.reject(new Error("expired"));
} }
else { else
const member_id : _espe.type.member_id = await _espe.service.member.project( {
const password : string = (
(
(data.password !== null)
&&
(data.password !== "")
)
?
data.password
:
_espe.service.member.generate_password()
);
const flaws_password : Array<
{
incident : string;
details : Record<string, any>;
}
> = _espe.service.member.validate_password(password);
if (flaws_password.length > 0)
{
return (
flaws_password
.map(flaw => ({"incident": ("password_" + flaw.incident), "details": flaw.details}))
);
}
else
{
const member_id : _espe.type.member_id = await _espe.service.member.add(
{ {
"membership_number": ( "membership_number": (
invite_object.membership_number_changeable invite_object.membership_number_changeable
? ?
membership_number_value data.membership_number
: :
invite_object.membership_number_value invite_object.membership_number_value
), ),
@ -279,10 +319,10 @@ namespace _espe.service.invite
( (
invite_object.name_changeable invite_object.name_changeable
&& &&
(name_value !== null) (data.name !== null)
) )
? ?
name_value data.name
: :
invite_object.name_value invite_object.name_value
), ),
@ -290,23 +330,28 @@ namespace _espe.service.invite
( (
invite_object.email_address_changeable invite_object.email_address_changeable
&& &&
(email_address_value !== null) (data.email_address !== null)
) )
? ?
email_address_value data.email_address
: :
invite_object.email_address_value invite_object.email_address_value
), ),
"groups": ( "groups": (
invite_object.groups_changeable invite_object.groups_changeable
? ?
groups_value data.groups
: :
invite_object.groups_value invite_object.groups_value
), ),
"password": password,
} }
); );
await _espe.repository.invite.delete_(invite_id); await _espe.repository.invite.delete_(invite_id);
return [];
}
} }
} }

View file

@ -46,7 +46,7 @@ namespace _espe.service.member
/** /**
*/ */
function validate_password( export function validate_password(
password : string password : string
) : Array<{incident : string; details : Record<string, any>}> ) : Array<{incident : string; details : Record<string, any>}>
{ {
@ -59,7 +59,7 @@ namespace _espe.service.member
/** /**
*/ */
function generate_password( export function generate_password(
) : string ) : string
{ {
return _espe.helper.password.generate( return _espe.helper.password.generate(
@ -347,6 +347,55 @@ namespace _espe.service.member
} }
/**
* legt ein Mitglied an
*/
export async function add(
data : {
membership_number : (null | string);
name_real_value : string;
email_address_private : (null | string);
groups : Array<string>;
password : string;
},
{
"silent": silent = false,
} : {
silent ?: boolean;
} = {
}
) : Promise<_espe.type.member_id>
{
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,
"email_address_private": data.email_address_private,
"registered": false,
"enabled": true,
"email_use_veiled_address": false,
"email_use_nominal_address": false,
"email_redirect_to_private_address": false,
"email_allow_sending": false,
"password_image": await password_image(data.password),
"password_change_last_attempt": null,
"password_change_token": null,
"groups": data.groups,
};
const id : _espe.type.member_id = await _espe.repository.member.create(object);
if (silent)
{
// do nothing
}
else
{
signal_change();
}
return id;
}
/** /**
* sendet an ein Mitglied eine E-Mail mit Aufforderung zur Registrierung * sendet an ein Mitglied eine E-Mail mit Aufforderung zur Registrierung
*/ */