This commit is contained in:
Fenris Wolf 2024-09-25 15:28:25 +02:00
parent ec775a0178
commit a17b7dd785
8 changed files with 177 additions and 110 deletions

View file

@ -12,15 +12,8 @@
"in_memory": false
},
"authentication": {
"kind": "oidc",
"kind": "internal",
"data": {
"url_authorization": "https://authelia.linke.sx/api/oidc/authorization",
"url_token": "https://authelia.linke.sx/api/oidc/token",
"url_userinfo": "https://authelia.linke.sx/api/oidc/userinfo",
"client_id": "zeitbild",
"client_secret": "cee00b08a818db87e17e703273818e5194f83280e1ef3eae9214ff14675d9e6d",
"backend_url_base": "https://zeitbild.linke.sx",
"label": "linke.sx"
}
}
}

View file

@ -4,7 +4,7 @@ namespace _zeitbild.api
/**
*/
export function register_calendar_list(
export function register_calendar_add(
rest_subject : lib_plankton.rest.type_rest
) : void
{
@ -52,32 +52,42 @@ namespace _zeitbild.api
const session : {key : string; value : lib_plankton.session.type_session;} = await session_from_stuff(stuff);
const user_id : _zeitbild.type_user_id = await _zeitbild.service.user.identify(session.value.name);
if (stuff.input === null) {
return Promise.reject(new Error("impossible"));
}
else {
// TODO move logic to calendar service
const resource_object : _zeitbild.type_resource_object = (
{
"local": {
let resource_object : _zeitbild.type_resource_object;
switch (stuff.input.resource.kind) {
case "local": {
resource_object = {
"kind": "local",
"data": {
"events": [],
"event_ids": [],
}
},
"caldav": {
};
break;
}
case "caldav": {
resource_object = {
"kind": "caldav",
"data": {
"url": stuff.input.resource.data.url,
"read_only": stuff.input.resource.data.read_only,
}
},
}[stuff.input.resource.kind]
);
const resource_id : _zeitbild.type_resource_id = _zeitbild.service.resource.add(
};
break;
}
}
const resource_id : _zeitbild.type_resource_id = await _zeitbild.service.resource.add(
resource_object
);
const calendar_object : _zeitbild.type_calendar_object = {
"name": stuff.input.name,
"access": {
"default_level": _zeitbild.value_object.access_level.from_string(stuff.input.access.default_level),
"attributed": lib_plankton.map.hashmap.make(
"attributed": lib_plankton.map.hashmap.implementation_map(
lib_plankton.map.hashmap.make(
x => x.toFixed(0),
{
"pairs": (
@ -99,6 +109,7 @@ namespace _zeitbild.api
),
}
)
),
},
"resource_id": resource_id
};
@ -113,6 +124,7 @@ namespace _zeitbild.api
);
}
}
}
);
}

View file

@ -32,10 +32,6 @@ namespace _zeitbild.api
"nullable": false,
"type": "object",
"properties": {
"name": {
"nullable": false,
"type": "string"
},
"name": {
"nullable": false,
"type": "string"
@ -81,6 +77,10 @@ namespace _zeitbild.api
}),
"restriction": restriction_logged_in,
"execution": async (stuff) => {
if (stuff.input === null) {
return Promise.reject(new Error("impossible"));
}
else {
return (
_zeitbild.service.calendar.event_add(
stuff.input.calendar_id,
@ -95,6 +95,7 @@ namespace _zeitbild.api
);
}
}
}
);
}

View file

@ -23,7 +23,24 @@ type type_data = {
}
>;
};
resource : _zeitbild.type_resource_object;
resource : (
{
kind : "local";
data : {
events : Array<
_zeitbild.type_event_object
>
};
}
|
{
kind : "caldav";
data : {
url : string;
read_only : boolean;
};
}
);
}
>;
};
@ -63,7 +80,35 @@ async function data_init(
track.user[user_raw.id] = user_id;
}
for await (const calendar_raw of data.calendars) {
const resource_object : _zeitbild.type_resource_object = calendar_raw.resource;
let resource_object : _zeitbild.type_resource_object;
switch (calendar_raw.resource.kind) {
case "local": {
const event_ids : Array<_zeitbild.type_event_id> = await Promise.all<_zeitbild.type_event_id>(
calendar_raw.resource.data.events
.map(
// TODO do not use repository, but service
(event_raw : _zeitbild.type_event_object) => _zeitbild.repository.local_resource_event.create(event_raw)
)
);
resource_object = {
"kind": "local",
"data": {
"event_ids": event_ids,
}
};
break;
}
case "caldav": {
resource_object = {
"kind": "caldav",
"data": {
"url": calendar_raw.resource.data.url,
"read_only": calendar_raw.resource.data.read_only,
}
};
break;
}
}
const resource_id : _zeitbild.type_resource_id = await _zeitbild.service.resource.add(
resource_object
);

View file

@ -47,8 +47,7 @@ namespace _zeitbild.repository.local_resource_event
/**
*/
function encode(
event : _zeitbild.type_event_object,
local_resource_id : int
event : _zeitbild.type_event_object
) : Record<string, any>
{
const encode_datetime : ((datetime : _zeitbild.helpers.type_datetime) => string) = ((datetime) => {
@ -82,7 +81,6 @@ namespace _zeitbild.repository.local_resource_event
);
});
return {
"local_resource_id": local_resource_id,
"name": event.name,
"begin": encode_datetime(event.begin),
"end": (
@ -152,8 +150,8 @@ namespace _zeitbild.repository.local_resource_event
/**
*/
function read(
event_id : _zeitbild.type_local_resource_event_id
export function read(
event_id : _zeitbild.type_event_id
) : Promise<_zeitbild.type_event_object>
{
return (
@ -167,9 +165,9 @@ namespace _zeitbild.repository.local_resource_event
/**
*/
function create(
export function create(
event_object : _zeitbild.type_event_object
) : Promise<_zeitbild.type_local_resource_event_id>
) : Promise<_zeitbild.type_event_id>
{
return (
Promise.resolve(encode(event_object))

View file

@ -277,8 +277,10 @@ namespace _zeitbild.repository.resource
}
);
for await (const event_id of resource_object.data.event_ids) {
await get_local_resource_event_chest().create(
[local_resource_id, event_id]
await get_local_resource_event_chest().write(
[local_resource_id, event_id],
{
}
)
}
const resource_id : _zeitbild.type_resource_id = await get_resource_core_store().create(
@ -307,6 +309,7 @@ namespace _zeitbild.repository.resource
break;
}
default: {
// @ts-ignore
throw (new Error("invalid resource kind: " + resource_object.kind));
break;
}
@ -384,6 +387,7 @@ namespace _zeitbild.repository.resource
break;
}
default: {
// @ts-ignore
throw (new Error("invalid resource kind: " + resource_object.kind));
break;
}
@ -394,7 +398,7 @@ namespace _zeitbild.repository.resource
/**
*/
export function local_resource_event_add(
export async function local_resource_event_add(
resource_id : _zeitbild.type_resource_id,
event_id : _zeitbild.type_event_id
) : Promise<void>
@ -419,7 +423,7 @@ namespace _zeitbild.repository.resource
/**
*/
export function local_resource_event_delete(
export async function local_resource_event_delete(
resource_id : _zeitbild.type_resource_id,
event_id : _zeitbild.type_event_id
) : Promise<void>
@ -431,8 +435,7 @@ namespace _zeitbild.repository.resource
else {
return (
get_local_resource_event_chest().delete(
[dataset_core["sub_id"], event_id],
{}
[dataset_core["sub_id"], event_id]
)
.then(
() => Promise.resolve(undefined)

View file

@ -76,13 +76,16 @@ namespace _zeitbild.service.calendar
event_object : _zeitbild.type_event_object
) : Promise<void>
{
const calendar_object : _zeitbild.type_calendar_object = _zeitbild.repository.calendar.read(
const calendar_object : _zeitbild.type_calendar_object = await _zeitbild.repository.calendar.read(
calendar_id
);
return _zeitbild.repository.resource.event_add(
calendar_object.resource_id,
const event_id : _zeitbild.type_event_id = await _zeitbild.repository.local_resource_event.create(
event_object
);
return _zeitbild.repository.resource.local_resource_event_add(
calendar_object.resource_id,
event_id
);
}
@ -102,8 +105,16 @@ namespace _zeitbild.service.calendar
const resource_object : _zeitbild.type_resource_object = await _zeitbild.repository.resource.read(calendar_object.resource_id);
switch (resource_object.kind) {
case "local": {
return Promise.resolve(
resource_object.data.events
return (
Promise.all(
resource_object.data.event_ids
.map(
(event_id) => _zeitbild.repository.local_resource_event.read(event_id)
)
)
.then(
(events) => Promise.resolve(
events
.filter(
(event : _zeitbild.type_event_object) => _zeitbild.helpers.pit_is_between(
_zeitbild.helpers.pit_from_datetime(event.begin),
@ -112,6 +123,8 @@ namespace _zeitbild.service.calendar
)
)
)
)
);
break;
}
case "caldav": {

View file

@ -19,7 +19,7 @@ namespace _zeitbild.service.resource
event_object : _zeitbild.type_event_object
) : Promise<void>
{
const resource_object : _zeitbild.type_resource_object = _zeitbild.repository.resource.read(
const resource_object : _zeitbild.type_resource_object = await _zeitbild.repository.resource.read(
resource_id
);
switch (resource_object.kind) {
@ -45,6 +45,7 @@ namespace _zeitbild.service.resource
break;
}
default: {
// @ts-ignore
throw (new Error("unhandled resource kind: " + resource_object.kind));
}
}
@ -58,7 +59,7 @@ namespace _zeitbild.service.resource
event_object : _zeitbild.type_event_object
) : Promise<void>
{
const resource_object : _zeitbild.type_resource_object = _zeitbild.repository.resource.read(
const resource_object : _zeitbild.type_resource_object = await _zeitbild.repository.resource.read(
resource_id
);
switch (resource_object.kind) {
@ -84,6 +85,7 @@ namespace _zeitbild.service.resource
break;
}
default: {
// @ts-ignore
throw (new Error("unhandled resource kind: " + resource_object.kind));
}
}