2024-09-12 00:03:29 +02:00
namespace _zeitbild . repository . calendar
{
2024-09-12 16:35:57 +02:00
/ * *
* /
type type_dispersal = {
core_row : Record <
string ,
any
> ;
member_rows : Array <
Record <
string ,
any
>
> ;
} ;
2024-09-12 00:03:29 +02:00
/ * *
* /
var _core_store : (
null
|
2024-09-12 16:35:57 +02:00
lib_plankton . storage . type_store <
2024-09-12 00:03:29 +02:00
_zeitbild . type . calendar_id ,
Record < string , any > ,
{ } ,
lib_plankton . storage . type_sql_table_autokey_search_term ,
Record < string , any >
>
) = null ;
/ * *
* /
2024-09-12 16:35:57 +02:00
var _member_chest : (
2024-09-12 00:03:29 +02:00
null
|
2024-09-12 16:35:57 +02:00
lib_plankton . storage . type_chest <
Array < any > ,
2024-09-12 00:03:29 +02:00
Record < string , any > ,
2024-09-12 16:35:57 +02:00
lib_plankton . database . type_description_create_table ,
lib_plankton . storage . sql_table_common . type_sql_table_common_search_term ,
2024-09-12 00:03:29 +02:00
Record < string , any >
>
) = null ;
/ * *
* /
function get_core_store (
2024-09-12 16:35:57 +02:00
) : lib_plankton . storage . type_store <
2024-09-12 00:03:29 +02:00
_zeitbild . type . calendar_id ,
Record < string , any > ,
{ } ,
lib_plankton . storage . type_sql_table_autokey_search_term ,
Record < string , any >
>
{
if ( _core_store === null ) {
2024-09-12 16:35:57 +02:00
_core_store = lib_plankton . storage . sql_table_autokey_store (
2024-09-12 00:03:29 +02:00
{
"database_implementation" : _zeitbild . database . get_implementation ( ) ,
"table_name" : "calendars" ,
"key_name" : "id" ,
}
) ;
}
else {
// do nothing
}
return _core_store ;
}
/ * *
* /
2024-09-12 16:35:57 +02:00
function get_member_chest (
) : lib_plankton . storage . type_chest <
Array < any > ,
2024-09-12 00:03:29 +02:00
Record < string , any > ,
2024-09-12 16:35:57 +02:00
lib_plankton . database . type_description_create_table ,
lib_plankton . storage . sql_table_common . type_sql_table_common_search_term ,
2024-09-12 00:03:29 +02:00
Record < string , any >
>
{
2024-09-12 16:35:57 +02:00
if ( _member_chest === null ) {
_member_chest = lib_plankton . storage . sql_table_common . chest (
2024-09-12 00:03:29 +02:00
{
"database_implementation" : _zeitbild . database . get_implementation ( ) ,
2024-09-12 16:35:57 +02:00
"table_name" : "calendar_members" ,
"key_names" : [ "calendar_id" , "user_id" ] ,
2024-09-12 00:03:29 +02:00
}
) ;
}
else {
// do nothing
}
2024-09-12 16:35:57 +02:00
return _member_chest ;
2024-09-12 00:03:29 +02:00
}
/ * *
* /
function encode (
object : _zeitbild . type . calendar_object
2024-09-12 16:35:57 +02:00
) : type_dispersal
2024-09-12 00:03:29 +02:00
{
2024-09-12 16:35:57 +02:00
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 ,
} )
)
) ,
} ;
2024-09-12 00:03:29 +02:00
}
/ * *
* /
function decode (
2024-09-12 16:35:57 +02:00
dispersal : type_dispersal
2024-09-12 00:03:29 +02:00
) : _zeitbild . type . calendar_object
{
return {
2024-09-12 16:35:57 +02:00
"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" ] ,
2024-09-12 00:03:29 +02:00
} ;
}
/ * *
* @todo optimize
* /
export async function list (
search_term : ( null | string )
) : Promise <
Array <
{
id : _zeitbild.type.calendar_id ;
preview : {
name : string ;
} ;
}
>
>
{
return (
2024-09-12 16:35:57 +02:00
(
await get_core_store ( ) . search (
{
"expression" : "(public = TRUE)" ,
"arguments" : {
}
}
)
)
2024-09-12 00:03:29 +02:00
. 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" ] ,
}
} )
)
) ;
}
/ * *
* /
2024-09-12 16:35:57 +02:00
export function read (
2024-09-12 00:03:29 +02:00
id : _zeitbild.type.calendar_id
) : Promise < _zeitbild.type.calendar_object >
{
2024-09-12 16:35:57 +02:00
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 < type_dispersal > (
{
"core_row" : core_row ,
"member_rows" : member_rows ,
}
)
)
. then (
( dispersal ) = > Promise . resolve < _zeitbild.type.calendar_object > (
decode ( dispersal )
)
)
)
)
) ;
2024-09-12 00:03:29 +02:00
}
/ * *
* /
2024-09-12 16:35:57 +02:00
export function create (
calendar_object : _zeitbild.type.calendar_object
2024-09-12 00:03:29 +02:00
) : Promise < _zeitbild.type.calendar_id >
{
2024-09-12 16:35:57 +02:00
return (
Promise . resolve < _zeitbild.type.calendar_object > ( calendar_object )
. then < type_dispersal > (
( calendar_object ) = > Promise . resolve < type_dispersal > ( 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 )
)
)
)
)
)
) ;
2024-09-12 00:03:29 +02:00
}
2024-09-12 19:35:31 +02:00
/ * *
2024-09-12 20:42:06 +02:00
* @todo sort for role , public and id
2024-09-12 19:35:31 +02:00
* /
export function overview (
user_id : _zeitbild.type.user_id
) : Promise <
Array <
{
id : _zeitbild.type.calendar_id ;
name : string ;
public : boolean ;
role : ( null | _zeitbild . type . role ) ;
}
>
>
{
return (
_zeitbild . database . get_implementation ( ) . query_free_get (
{
"template" : "SELECT x.id AS id, x.name AS name, x.public AS public, MAX(y.role) AS role FROM calendars AS x LEFT OUTER JOIN calendar_members AS y ON (x.id = y.calendar_id) WHERE (x.public OR (y.user_id = $user_id)) GROUP BY x.id;" ,
"arguments" : {
"user_id" : user_id ,
}
}
)
. then (
( rows ) = > Promise . resolve (
rows . map (
( row ) = > ( {
"id" : row [ "id" ] ,
"name" : row [ "name" ] ,
2024-09-12 20:42:06 +02:00
"public" : ( row [ "public" ] === 1 ) ,
2024-09-12 19:35:31 +02:00
"role" : row [ "role" ] ,
} )
)
)
)
2024-09-12 20:42:06 +02:00
/ *
. then (
( entries ) = > Promise . resolve (
entries . toSorted (
( x , y ) = > ( x
)
)
)
* /
2024-09-12 19:35:31 +02:00
)
}
2024-09-12 00:03:29 +02:00
}