namespace _zeitbild.repository.calendar { /** */ type type_dispersal = { core_row : Record< string, any >; member_rows : Array< Record< string, any > >; }; /** */ var _core_store : ( null | lib_plankton.storage.type_store< _zeitbild.type.calendar_id, Record, {}, lib_plankton.storage.type_sql_table_autokey_search_term, Record > ) = null; /** */ var _member_chest : ( null | lib_plankton.storage.type_chest< Array, Record, lib_plankton.database.type_description_create_table, lib_plankton.storage.sql_table_common.type_sql_table_common_search_term, Record > ) = null; /** */ function get_core_store( ) : lib_plankton.storage.type_store< _zeitbild.type.calendar_id, Record, {}, lib_plankton.storage.type_sql_table_autokey_search_term, Record > { if (_core_store === null) { _core_store = lib_plankton.storage.sql_table_autokey_store( { "database_implementation": _zeitbild.database.get_implementation(), "table_name": "calendars", "key_name": "id", } ); } else { // do nothing } return _core_store; } /** */ function get_member_chest( ) : lib_plankton.storage.type_chest< Array, Record, lib_plankton.database.type_description_create_table, lib_plankton.storage.sql_table_common.type_sql_table_common_search_term, Record > { if (_member_chest === null) { _member_chest = lib_plankton.storage.sql_table_common.chest( { "database_implementation": _zeitbild.database.get_implementation(), "table_name": "calendar_members", "key_names": ["calendar_id","user_id"], } ); } else { // do nothing } return _member_chest; } /** */ function encode( object : _zeitbild.type.calendar_object ) : type_dispersal { return { "core_row": { "name": object.name, "public": object.public, "resource_id": object.resource_id, }, "member_rows": ( object.members .map( (member) => ({ // "calendar_id": calendar_id, "user_id": member.user_id, "role": member.role, }) ) ), }; } /** */ function decode( dispersal : type_dispersal ) : _zeitbild.type.calendar_object { return { "name": dispersal.core_row["name"], "public": dispersal.core_row["public"], "members": ( dispersal.member_rows .map( (member_row) => ({ "calendar_id": member_row["calendar_id"], "user_id": member_row["user_id"], "role": member_row["role"], }) ) ), "resource_id": dispersal.core_row["resource_id"], }; } /** * @todo optimize */ export async function list( search_term : (null | string) ) : Promise< Array< { id : _zeitbild.type.calendar_id; preview : { name : string; }; } > > { return ( ( await get_core_store().search( { "expression": "(public = TRUE)", "arguments": { } } ) ) .filter( ({"key": key, "preview": preview}) => ( ( (search_term === null) || (search_term.length <= 1) ) ? true : ( preview["name"].toLowerCase().includes(search_term.toLowerCase()) ) ) ) .map( ({"key": key, "preview": preview}) => ({ "id": key, "preview": { "name": preview["name"], } }) ) ); } /** */ export function read( id : _zeitbild.type.calendar_id ) : Promise<_zeitbild.type.calendar_object> { return ( get_core_store().read(id) .then( (core_row) => ( get_member_chest().search( { "expression": "(calendar_id = $calendar_id)", "arguments": { "calendar_id": id, } } ) .then( (member_rows) => Promise.resolve( { "core_row": core_row, "member_rows": member_rows, } ) ) .then( (dispersal) => Promise.resolve<_zeitbild.type.calendar_object>( decode(dispersal) ) ) ) ) ); } /** */ export function create( calendar_object : _zeitbild.type.calendar_object ) : Promise<_zeitbild.type.calendar_id> { return ( Promise.resolve<_zeitbild.type.calendar_object>(calendar_object) .then( (calendar_object) => Promise.resolve(encode(calendar_object)) ) .then<_zeitbild.type.calendar_id>( (dispersal) => ( get_core_store().create(dispersal.core_row) .then<_zeitbild.type.calendar_id>( (calendar_id) => ( Promise.all( dispersal.member_rows .map( (member_row) => get_member_chest().write( [calendar_id, member_row["user_id"]], {"role": member_row["role"]} ) ) ) .then( () => Promise.resolve<_zeitbild.type.calendar_id>(calendar_id) ) ) ) ) ) ); } }