namespace _zeitbild.api { /** */ export function register_calendar_add( rest_subject : lib_plankton.rest.type_rest ) : void { register< { name : string; access : { public : boolean; default_level : string; attributed : Array< { user_id : int; level : string; } >; }; resource : ( { kind : "local"; data : { }; } | { kind : "caldav"; data : { url : string; read_only : boolean; from_fucked_up_wordpress : boolean; }; } ); }, int >( rest_subject, lib_plankton.http.enum_method.post, "/calendar", { "description": "erstellt einen Kalender", "input_schema": () => ({ "nullable": true, // TODO }), "output_schema": () => ({ "nullable": true, "type": "integer", }), "restriction": restriction_logged_in, "execution": async (stuff) => { 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 let resource_object : _zeitbild.type_resource_object; switch (stuff.input.resource.kind) { case "local": { resource_object = { "kind": "local", "data": { "event_ids": [], } }; break; } case "caldav": { resource_object = { "kind": "caldav", "data": { "url": stuff.input.resource.data.url, "read_only": stuff.input.resource.data.read_only, "from_fucked_up_wordpress": stuff.input.resource.data.from_fucked_up_wordpress, } }; 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": { "public": stuff.input.access.public, "default_level": _zeitbild.value_object.access_level.from_string(stuff.input.access.default_level), "attributed": lib_plankton.map.hashmap.implementation_map( lib_plankton.map.hashmap.make( x => x.toFixed(0), { "pairs": ( stuff.input.access.attributed .map( (entry) => ({ "key": entry.user_id, "value": _zeitbild.value_object.access_level.from_string(entry.level), }) ) .concat( [ { "key": user_id, "value": _zeitbild.enum_access_level.admin, } ] ) ), } ) ), }, "resource_id": resource_id }; return ( _zeitbild.service.calendar.add(calendar_object) .then( (calendar_id : _zeitbild.type_calendar_id) => Promise.resolve({ "status_code": 200, "data": calendar_id, }) ) ); } } } ); } }