[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": {
"language": null,
"verbosity": "info",
"verification_secret": null
"verification_secret": "foobar"
},
"log": [
{

View file

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

View file

@ -248,65 +248,110 @@ namespace _espe.service.invite
/**
* @todo heed expiry
* @todo password?
*/
export async function accept(
key : _espe.type.invite_key,
membership_number_value : (null | string),
name_value : (null | string),
email_address_value : (null | string),
groups_value : Array<string>
) : Promise<void>
data : {
membership_number : (null | string);
groups : Array<string>;
name : (null | string);
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);
/**
* 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 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"));
}
else {
const member_id : _espe.type.member_id = await _espe.service.member.project(
{
"membership_number": (
invite_object.membership_number_changeable
?
membership_number_value
:
invite_object.membership_number_value
),
"name_real_value": (
(
invite_object.name_changeable
&&
(name_value !== null)
)
?
name_value
:
invite_object.name_value
),
"email_address_private": (
(
invite_object.email_address_changeable
&&
(email_address_value !== null)
)
?
email_address_value
:
invite_object.email_address_value
),
"groups": (
invite_object.groups_changeable
?
groups_value
:
invite_object.groups_value
),
}
else
{
const password : string = (
(
(data.password !== null)
&&
(data.password !== "")
)
?
data.password
:
_espe.service.member.generate_password()
);
await _espe.repository.invite.delete_(invite_id);
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": (
invite_object.membership_number_changeable
?
data.membership_number
:
invite_object.membership_number_value
),
"name_real_value": (
(
invite_object.name_changeable
&&
(data.name !== null)
)
?
data.name
:
invite_object.name_value
),
"email_address_private": (
(
invite_object.email_address_changeable
&&
(data.email_address !== null)
)
?
data.email_address
:
invite_object.email_address_value
),
"groups": (
invite_object.groups_changeable
?
data.groups
:
invite_object.groups_value
),
"password": password,
}
);
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
) : Array<{incident : string; details : Record<string, any>}>
{
@ -59,7 +59,7 @@ namespace _espe.service.member
/**
*/
function generate_password(
export function generate_password(
) : string
{
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
*/