namespace _zeitbild.api { /** */ export function register_calendar_list( rest_subject : lib_plankton.rest.type_rest ) : void { register< { name : string; access : { default_level : ("none" | "view" | "edit" | "admin"); attributed : Array< { user_id : int; level : ("none" | "view" | "edit" | "admin"); } >; }; resource : ( { kind : "local"; data : { }; } | { kind : "caldav"; data : { url : string; read_only : boolean; }; } ); }, int >( rest_subject, lib_plankton.http.enum_method.post, "/calendar/add", { "description": "erstellt einen Kalender", "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); // TODO move logic to calendar service const resource_object : _zeitbild.type_resource_object = ( { "local": { "kind": "local", "data": { "events": [], } }, "caldav": { "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( 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( 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, }) ) ); } } ); } }