From 93e6a79a38fa31ae79f0732ec244e4cd1e3d5de2 Mon Sep 17 00:00:00 2001 From: Max Hohlfeld Date: Sun, 4 May 2025 17:22:45 +0200 Subject: [PATCH] refactor: WIP datetime availability --- ...0bed399723ca0dba70438ba519d3ee7dad01b.json | 46 ++++++ ...0797146a27d523ad5ffab1828806fb2935af9.json | 28 ++++ ...b81d5f3be1fb0c1723600b6f9bbe73b1e8155.json | 57 +++++++ ...bd7aee56eb35fdff0d0e47037b9af3e08b34f.json | 40 +++++ ...807693ff1b29c61e7d07cbf8fb5fcd553f233.json | 47 ++++++ ...42360d2f6211d3f47b465c0024994006e0c08.json | 28 ++++ ...166706b5adf4815de81481c9eb67d94b7ee0d.json | 41 +++++ ...be1d1cea46d8aca559788420f532be0426723.json | 15 ++ ...775e04a665d5ac1475cc7a88f9b469438c942.json | 136 +++++++++++++++++ ...e7a94bdcf2ef01b559304aea1d642fab7ae22.json | 14 ++ ...a91a77a9e4b1e323321fc41e29df7dda2b9da.json | 29 ++++ ...4a155eaf85f51b91e0724a100e7eedfa096ce.json | 111 ++++++++++++++ ...2fea535a7b630000db10ea89419bff998f58d.json | 14 ++ ...4aa5659072539a8f222b8ae202786ce958c37.json | 32 ++++ ...22cd7cbcd2e981f75fce75f29f1c4fbfc3df5.json | 15 ++ ...49beb2d63130f8ea1bf4a840d7729bcb6f9cc.json | 14 ++ ...cf9bacb8e852fa434448d3cc4c52bad0bcf01.json | 16 ++ ...c241c17b086ff219d6084684a0f2b7c31eeed.json | 15 ++ ...082b6ae3a5cb32ddc30a8fa844a4be67564ff.json | 57 +++++++ ...79de6106c087ff85ca075fd9ca65a42cfa8cc.json | 30 ++++ ...4ad6a47a5c83e7054bc9fda81a31e6555f4ff.json | 57 +++++++ ...083ceee80f74564ee3e8b7da6ab57e906368b.json | 111 ++++++++++++++ ...90c64160aff1bad2f0db851db2e421711a156.json | 15 ++ ...1f1ec32d95ec24d6da507387e9a7cf8287eaf.json | 41 +++++ ...3eba3793ecf697355e81012e721357ba351b9.json | 14 ++ ...589ccd58f786e70a3ff1efa662085c2035156.json | 109 +++++++++++++ ...2b05b1daadbe41c77a8bd317f7fb17b7991cb.json | 100 ++++++++++++ ...11d8073f6d62cf30a42381484846f0917bc33.json | 32 ++++ ...47d12ad03cda345ba6d1120e38081fdb1fa06.json | 14 ++ ...20e57b274a5b38c0ded9f26824d4aba1822e9.json | 143 ++++++++++++++++++ ...33ffcb6a480ca13c2beea0a543067840c64a7.json | 34 +++++ ...44d07ba76023567bc6ea0eec2267d1c592479.json | 46 ++++++ ...75dba701bf829b8cf8e37388c1de1c302f486.json | 14 ++ ...0fc185e2b6b5f1a7c80507d39d813af3e3478.json | 29 ++++ ...fe954aea7c821abf785b68d0731fcaf0f4845.json | 15 ++ ...f0dd4ae6b638b85f0e3a54afc85a46de6ae3a.json | 15 ++ ...264c3d5d47bd119c563237486cf47e402ae2e.json | 26 ++++ ...f6f2820ef97b85e1185b846ff245113889096.json | 17 +++ ...5ac1b6f3acb52e5ac2d2a98b966f05d5b9953.json | 138 +++++++++++++++++ ...a4f4dbc4d818315d1713a110c4ad7acd09e3e.json | 16 ++ ...c10e5e1d0c4757aa097294f5d7d6b6368b558.json | 135 +++++++++++++++++ ...f5be5207b0e868b6de0f558a469138838a650.json | 111 ++++++++++++++ ...6b984c81afc8ef02fbe289170f48411147022.json | 58 +++++++ ...5ab6a3fa9a224ebacc32f75b60cbc91a11fea.json | 17 +++ ...616fc3aa63ce322cc2d718f4b4e4e23903a61.json | 121 +++++++++++++++ ...0ea0201f1789ac906acc8cf79aacfbecd9f05.json | 55 +++++++ ...402865f5d63cb828507c856293be62102aeef.json | 28 ++++ ...69f662da9fed90243ac4a42d1cf1020b614d3.json | 22 +++ ...f2504e78ee2c8e094d96b89b68e8e7dddce48.json | 14 ++ ...6982d6b21ed1e637fbf0eee841031e217c6c5.json | 22 +++ ...dd4a2d4d8ee88a6bcdf0ee331cff0f7064811.json | 17 +++ ...b5bf791d8a75ba68937609698bd52c97c8d0d.json | 15 ++ ...7919b7e8263eee1e8026d9143a15f12fa81a5.json | 14 ++ ...50041db855227c8d465d56e985bad86f0c8d9.json | 15 ++ ...42e60edd5163b6463c2f0ef22baaf8be7bcd5.json | 101 +++++++++++++ ...191cde2d488c55c05edbfe3746208a782d5f6.json | 34 +++++ ...a3512716812561516c0fd602d8b9d9af4eca6.json | 14 ++ ...417cb3b42de0a5bf1d8b48b11a6e6275cc8e4.json | 34 +++++ ...93037de6b72d3311f10fa0cf74b7ce7ae11bf.json | 23 +++ ...75775f369e2f8683a6b1aaa87c35984357804.json | 30 ++++ ...13e69d658242344be7c46ba4f4df90f8b74b3.json | 16 ++ ...71367172bce9446b9fb1e7ba057917a98d958.json | 44 ++++++ ...125a10757b06ff7d60c8843cb7814ea452f13.json | 14 ++ ...8da4bfdba6f059dbd45b510122210807ac5b6.json | 48 ++++++ web/src/endpoints/assignment/delete.rs | 8 +- web/src/endpoints/assignment/mod.rs | 2 +- web/src/endpoints/availability/get_new.rs | 22 +-- .../endpoints/availability/get_overview.rs | 53 ++++--- web/src/endpoints/availability/get_update.rs | 47 ++---- web/src/endpoints/availability/mod.rs | 26 +--- web/src/endpoints/availability/post_new.rs | 29 ++-- web/src/endpoints/availability/post_update.rs | 28 +--- web/src/endpoints/events/get_plan.rs | 2 +- web/src/endpoints/events/post_edit.rs | 21 +-- .../endpoints/export/get_availability_data.rs | 39 ++--- web/src/models/assignment_changeset.rs | 16 +- web/src/models/availability_changeset.rs | 87 +++++------ web/src/models/availabillity.rs | 120 +++------------ web/src/models/mod.rs | 18 ++- web/templates/availability/new_or_edit.html | 44 +----- web/templates/events/plan_personal_table.html | 7 +- web/templates/index.html | 7 +- 82 files changed, 2965 insertions(+), 384 deletions(-) create mode 100644 .sqlx/query-0342272c9798389c37e229018e30bed399723ca0dba70438ba519d3ee7dad01b.json create mode 100644 .sqlx/query-0a5318ab6466385e805f83e13cc0797146a27d523ad5ffab1828806fb2935af9.json create mode 100644 .sqlx/query-0eafc423ff404eadb5300ad47e5b81d5f3be1fb0c1723600b6f9bbe73b1e8155.json create mode 100644 .sqlx/query-126a17ad3fe8937dfbf70e9a8c2bd7aee56eb35fdff0d0e47037b9af3e08b34f.json create mode 100644 .sqlx/query-13d164ba2c29ac2bb4ee9428309807693ff1b29c61e7d07cbf8fb5fcd553f233.json create mode 100644 .sqlx/query-1452258f916025c6367477e11a442360d2f6211d3f47b465c0024994006e0c08.json create mode 100644 .sqlx/query-159c257e9e7a164d369de950940166706b5adf4815de81481c9eb67d94b7ee0d.json create mode 100644 .sqlx/query-17f79edd7138f29f4279aeb2e72be1d1cea46d8aca559788420f532be0426723.json create mode 100644 .sqlx/query-18d37157e02280e00c1f3db9650775e04a665d5ac1475cc7a88f9b469438c942.json create mode 100644 .sqlx/query-1c996712f62a1005990733cd9eee7a94bdcf2ef01b559304aea1d642fab7ae22.json create mode 100644 .sqlx/query-1e0bac00becc335dbd0f71a3b65a91a77a9e4b1e323321fc41e29df7dda2b9da.json create mode 100644 .sqlx/query-24449d7fa57151cc7bbe17b757c4a155eaf85f51b91e0724a100e7eedfa096ce.json create mode 100644 .sqlx/query-24fecf0d262d800b26cf90db0e12fea535a7b630000db10ea89419bff998f58d.json create mode 100644 .sqlx/query-2d9f2d0728983dfac09f6649da74aa5659072539a8f222b8ae202786ce958c37.json create mode 100644 .sqlx/query-348365fd1e76ebfcfa065d1ea7e22cd7cbcd2e981f75fce75f29f1c4fbfc3df5.json create mode 100644 .sqlx/query-36afabfbbe056a63386f94edf2d49beb2d63130f8ea1bf4a840d7729bcb6f9cc.json create mode 100644 .sqlx/query-39415450c15de43079d87443b71cf9bacb8e852fa434448d3cc4c52bad0bcf01.json create mode 100644 .sqlx/query-3e246c54d31804140272a6fc2e3c241c17b086ff219d6084684a0f2b7c31eeed.json create mode 100644 .sqlx/query-40254661a2d8a7e4b803551419e082b6ae3a5cb32ddc30a8fa844a4be67564ff.json create mode 100644 .sqlx/query-413a3b2bdb7c23ab0f44bcc3ece79de6106c087ff85ca075fd9ca65a42cfa8cc.json create mode 100644 .sqlx/query-478a745b8953efab4fbc915d99a4ad6a47a5c83e7054bc9fda81a31e6555f4ff.json create mode 100644 .sqlx/query-483ad933fa1e935058cbe42b7ff083ceee80f74564ee3e8b7da6ab57e906368b.json create mode 100644 .sqlx/query-48e3cab60736bf95958b063013090c64160aff1bad2f0db851db2e421711a156.json create mode 100644 .sqlx/query-4b3eebd13b23df2046dabf6ad161f1ec32d95ec24d6da507387e9a7cf8287eaf.json create mode 100644 .sqlx/query-4bfce344fc6f0bfbb2b460677ce3eba3793ecf697355e81012e721357ba351b9.json create mode 100644 .sqlx/query-5573e93ccc0b6a5ecc6183a5d5c589ccd58f786e70a3ff1efa662085c2035156.json create mode 100644 .sqlx/query-55a70284a5ddc7bff778ed1ea012b05b1daadbe41c77a8bd317f7fb17b7991cb.json create mode 100644 .sqlx/query-5b87f4da0924338da1a30d7b74711d8073f6d62cf30a42381484846f0917bc33.json create mode 100644 .sqlx/query-5c492ff7ad44ae4876bae9b9ba947d12ad03cda345ba6d1120e38081fdb1fa06.json create mode 100644 .sqlx/query-5ef1494706bb6c9d41f19f57d8120e57b274a5b38c0ded9f26824d4aba1822e9.json create mode 100644 .sqlx/query-68d2b1ed0dc56056ec85ca38ba033ffcb6a480ca13c2beea0a543067840c64a7.json create mode 100644 .sqlx/query-70850ec3f7c519c1fc104fead6a44d07ba76023567bc6ea0eec2267d1c592479.json create mode 100644 .sqlx/query-73eba57512af51a7a7d5ea9b6b375dba701bf829b8cf8e37388c1de1c302f486.json create mode 100644 .sqlx/query-75d96d0b937b8e222aa2ad6b9fc0fc185e2b6b5f1a7c80507d39d813af3e3478.json create mode 100644 .sqlx/query-7bc06d40e0e7f43f73861bb5fa9fe954aea7c821abf785b68d0731fcaf0f4845.json create mode 100644 .sqlx/query-7d2e4fcde5bee6c9dcd85e35fa5f0dd4ae6b638b85f0e3a54afc85a46de6ae3a.json create mode 100644 .sqlx/query-7f6c89117e8d4249e032235d03d264c3d5d47bd119c563237486cf47e402ae2e.json create mode 100644 .sqlx/query-843da813342d6d7875667d43a76f6f2820ef97b85e1185b846ff245113889096.json create mode 100644 .sqlx/query-85dc89689632abde0930ca3fde05ac1b6f3acb52e5ac2d2a98b966f05d5b9953.json create mode 100644 .sqlx/query-868bbdcb65f0ee862f221b7e3d1a4f4dbc4d818315d1713a110c4ad7acd09e3e.json create mode 100644 .sqlx/query-890ac023f7b2a6517ca46dfff5fc10e5e1d0c4757aa097294f5d7d6b6368b558.json create mode 100644 .sqlx/query-9091186ff6f2e2013cdca9d66c6f5be5207b0e868b6de0f558a469138838a650.json create mode 100644 .sqlx/query-9e77980b06e46b1c2d8cbcab7006b984c81afc8ef02fbe289170f48411147022.json create mode 100644 .sqlx/query-a517738fabdf4a8c48778ea953f5ab6a3fa9a224ebacc32f75b60cbc91a11fea.json create mode 100644 .sqlx/query-a7f6e57733c655534c3ae6379b8616fc3aa63ce322cc2d718f4b4e4e23903a61.json create mode 100644 .sqlx/query-ad4419211e4c98292eaa47ab04e0ea0201f1789ac906acc8cf79aacfbecd9f05.json create mode 100644 .sqlx/query-b1e4b7c5d9a08923ab0512b2f2d402865f5d63cb828507c856293be62102aeef.json create mode 100644 .sqlx/query-b259a464a99501cb60551791af069f662da9fed90243ac4a42d1cf1020b614d3.json create mode 100644 .sqlx/query-b55283e681bed3f5666cefca8acf2504e78ee2c8e094d96b89b68e8e7dddce48.json create mode 100644 .sqlx/query-b670053eb906a244d3ce12a7eb36982d6b21ed1e637fbf0eee841031e217c6c5.json create mode 100644 .sqlx/query-bc79bfefe13543d35aca3443919dd4a2d4d8ee88a6bcdf0ee331cff0f7064811.json create mode 100644 .sqlx/query-c28c0fd372fa23b0053ec38ce59b5bf791d8a75ba68937609698bd52c97c8d0d.json create mode 100644 .sqlx/query-cca2b280d655073557f035932eb7919b7e8263eee1e8026d9143a15f12fa81a5.json create mode 100644 .sqlx/query-d1d97d9f6cc8d9777dc4ce38a4b50041db855227c8d465d56e985bad86f0c8d9.json create mode 100644 .sqlx/query-d4a8fe79186f648212fb270323942e60edd5163b6463c2f0ef22baaf8be7bcd5.json create mode 100644 .sqlx/query-d556cb1971f386a7997c2e3dbce191cde2d488c55c05edbfe3746208a782d5f6.json create mode 100644 .sqlx/query-d79f4733454dfe8df4209fa94b3a3512716812561516c0fd602d8b9d9af4eca6.json create mode 100644 .sqlx/query-ea9f427b5d5a3e3c5f720d6bab2417cb3b42de0a5bf1d8b48b11a6e6275cc8e4.json create mode 100644 .sqlx/query-ee7abc2204854f5934e683d732493037de6b72d3311f10fa0cf74b7ce7ae11bf.json create mode 100644 .sqlx/query-effd0882ab00e5f91a97fa7ee4275775f369e2f8683a6b1aaa87c35984357804.json create mode 100644 .sqlx/query-f613f4cbd2d89bc061e41f69fe913e69d658242344be7c46ba4f4df90f8b74b3.json create mode 100644 .sqlx/query-f94d7fe59a2d4b7d246711a796571367172bce9446b9fb1e7ba057917a98d958.json create mode 100644 .sqlx/query-fc09093ce791d2d690b2e3f5ff2125a10757b06ff7d60c8843cb7814ea452f13.json create mode 100644 .sqlx/query-fd2f782d28612d969aa20eb35ea8da4bfdba6f059dbd45b510122210807ac5b6.json diff --git a/.sqlx/query-0342272c9798389c37e229018e30bed399723ca0dba70438ba519d3ee7dad01b.json b/.sqlx/query-0342272c9798389c37e229018e30bed399723ca0dba70438ba519d3ee7dad01b.json new file mode 100644 index 00000000..5f01f441 --- /dev/null +++ b/.sqlx/query-0342272c9798389c37e229018e30bed399723ca0dba70438ba519d3ee7dad01b.json @@ -0,0 +1,46 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM availabillity WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "userid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "comment", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "endtimestamp", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + true, + false, + false + ] + }, + "hash": "0342272c9798389c37e229018e30bed399723ca0dba70438ba519d3ee7dad01b" +} diff --git a/.sqlx/query-0a5318ab6466385e805f83e13cc0797146a27d523ad5ffab1828806fb2935af9.json b/.sqlx/query-0a5318ab6466385e805f83e13cc0797146a27d523ad5ffab1828806fb2935af9.json new file mode 100644 index 00000000..a02a99d2 --- /dev/null +++ b/.sqlx/query-0a5318ab6466385e805f83e13cc0797146a27d523ad5ffab1828806fb2935af9.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM area WHERE id = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "0a5318ab6466385e805f83e13cc0797146a27d523ad5ffab1828806fb2935af9" +} diff --git a/.sqlx/query-0eafc423ff404eadb5300ad47e5b81d5f3be1fb0c1723600b6f9bbe73b1e8155.json b/.sqlx/query-0eafc423ff404eadb5300ad47e5b81d5f3be1fb0c1723600b6f9bbe73b1e8155.json new file mode 100644 index 00000000..06245302 --- /dev/null +++ b/.sqlx/query-0eafc423ff404eadb5300ad47e5b81d5f3be1fb0c1723600b6f9bbe73b1e8155.json @@ -0,0 +1,57 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO user_ (name, email, password, salt, role, function, areaId)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n RETURNING id;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + "Text", + "Text", + { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + }, + { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + }, + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "0eafc423ff404eadb5300ad47e5b81d5f3be1fb0c1723600b6f9bbe73b1e8155" +} diff --git a/.sqlx/query-126a17ad3fe8937dfbf70e9a8c2bd7aee56eb35fdff0d0e47037b9af3e08b34f.json b/.sqlx/query-126a17ad3fe8937dfbf70e9a8c2bd7aee56eb35fdff0d0e47037b9af3e08b34f.json new file mode 100644 index 00000000..763a719e --- /dev/null +++ b/.sqlx/query-126a17ad3fe8937dfbf70e9a8c2bd7aee56eb35fdff0d0e47037b9af3e08b34f.json @@ -0,0 +1,40 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM vehicleAssignement WHERE vehicleAssignement.eventId = $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "eventid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "vehicleid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 3, + "name": "endtimestamp", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false + ] + }, + "hash": "126a17ad3fe8937dfbf70e9a8c2bd7aee56eb35fdff0d0e47037b9af3e08b34f" +} diff --git a/.sqlx/query-13d164ba2c29ac2bb4ee9428309807693ff1b29c61e7d07cbf8fb5fcd553f233.json b/.sqlx/query-13d164ba2c29ac2bb4ee9428309807693ff1b29c61e7d07cbf8fb5fcd553f233.json new file mode 100644 index 00000000..5f5db35c --- /dev/null +++ b/.sqlx/query-13d164ba2c29ac2bb4ee9428309807693ff1b29c61e7d07cbf8fb5fcd553f233.json @@ -0,0 +1,47 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment\n FROM availabillity\n WHERE availabillity.userId = $1\n AND availabillity.starttimestamp::date = $2;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "userid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 3, + "name": "endtimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "comment", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Int4", + "Date" + ] + }, + "nullable": [ + false, + false, + false, + false, + true + ] + }, + "hash": "13d164ba2c29ac2bb4ee9428309807693ff1b29c61e7d07cbf8fb5fcd553f233" +} diff --git a/.sqlx/query-1452258f916025c6367477e11a442360d2f6211d3f47b465c0024994006e0c08.json b/.sqlx/query-1452258f916025c6367477e11a442360d2f6211d3f47b465c0024994006e0c08.json new file mode 100644 index 00000000..170a438f --- /dev/null +++ b/.sqlx/query-1452258f916025c6367477e11a442360d2f6211d3f47b465c0024994006e0c08.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT token, userId FROM registration WHERE token = $1 AND expires > NOW();", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "token", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "userid", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "1452258f916025c6367477e11a442360d2f6211d3f47b465c0024994006e0c08" +} diff --git a/.sqlx/query-159c257e9e7a164d369de950940166706b5adf4815de81481c9eb67d94b7ee0d.json b/.sqlx/query-159c257e9e7a164d369de950940166706b5adf4815de81481c9eb67d94b7ee0d.json new file mode 100644 index 00000000..704c2e7c --- /dev/null +++ b/.sqlx/query-159c257e9e7a164d369de950940166706b5adf4815de81481c9eb67d94b7ee0d.json @@ -0,0 +1,41 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM vehicleAssignement WHERE vehicleAssignement.eventId = $1 AND vehicleAssignement.vehicleId = $2;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "eventid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "vehicleid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 3, + "name": "endtimestamp", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Int4", + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false + ] + }, + "hash": "159c257e9e7a164d369de950940166706b5adf4815de81481c9eb67d94b7ee0d" +} diff --git a/.sqlx/query-17f79edd7138f29f4279aeb2e72be1d1cea46d8aca559788420f532be0426723.json b/.sqlx/query-17f79edd7138f29f4279aeb2e72be1d1cea46d8aca559788420f532be0426723.json new file mode 100644 index 00000000..93be2c36 --- /dev/null +++ b/.sqlx/query-17f79edd7138f29f4279aeb2e72be1d1cea46d8aca559788420f532be0426723.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE area SET name = $1 WHERE id = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "17f79edd7138f29f4279aeb2e72be1d1cea46d8aca559788420f532be0426723" +} diff --git a/.sqlx/query-18d37157e02280e00c1f3db9650775e04a665d5ac1475cc7a88f9b469438c942.json b/.sqlx/query-18d37157e02280e00c1f3db9650775e04a665d5ac1475cc7a88f9b469438c942.json new file mode 100644 index 00000000..9c1b4fd7 --- /dev/null +++ b/.sqlx/query-18d37157e02280e00c1f3db9650775e04a665d5ac1475cc7a88f9b469438c942.json @@ -0,0 +1,136 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availabillity\n JOIN user_ ON availabillity.userId = user_.id\n WHERE availabillity.startTimestamp::date = $1\n AND user_.areaId = $2;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "userid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 3, + "name": "endtimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "comment", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "email", + "type_info": "Text" + }, + { + "ordinal": 7, + "name": "password", + "type_info": "Text" + }, + { + "ordinal": 8, + "name": "salt", + "type_info": "Text" + }, + { + "ordinal": 9, + "name": "role: Role", + "type_info": { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + } + }, + { + "ordinal": 10, + "name": "function: UserFunction", + "type_info": { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + } + }, + { + "ordinal": 11, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 12, + "name": "locked", + "type_info": "Bool" + }, + { + "ordinal": 13, + "name": "lastlogin", + "type_info": "Timestamptz" + }, + { + "ordinal": 14, + "name": "receivenotifications", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Date", + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false + ] + }, + "hash": "18d37157e02280e00c1f3db9650775e04a665d5ac1475cc7a88f9b469438c942" +} diff --git a/.sqlx/query-1c996712f62a1005990733cd9eee7a94bdcf2ef01b559304aea1d642fab7ae22.json b/.sqlx/query-1c996712f62a1005990733cd9eee7a94bdcf2ef01b559304aea1d642fab7ae22.json new file mode 100644 index 00000000..2b95f5a0 --- /dev/null +++ b/.sqlx/query-1c996712f62a1005990733cd9eee7a94bdcf2ef01b559304aea1d642fab7ae22.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM location WHERE id = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "1c996712f62a1005990733cd9eee7a94bdcf2ef01b559304aea1d642fab7ae22" +} diff --git a/.sqlx/query-1e0bac00becc335dbd0f71a3b65a91a77a9e4b1e323321fc41e29df7dda2b9da.json b/.sqlx/query-1e0bac00becc335dbd0f71a3b65a91a77a9e4b1e323321fc41e29df7dda2b9da.json new file mode 100644 index 00000000..8519f0ac --- /dev/null +++ b/.sqlx/query-1e0bac00becc335dbd0f71a3b65a91a77a9e4b1e323321fc41e29df7dda2b9da.json @@ -0,0 +1,29 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO assignment (eventId, availabillityId, function, startTimestamp, endTimestamp)\n VALUES ($1, $2, $3, $4, $5);\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4", + { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + }, + "Timestamptz", + "Timestamptz" + ] + }, + "nullable": [] + }, + "hash": "1e0bac00becc335dbd0f71a3b65a91a77a9e4b1e323321fc41e29df7dda2b9da" +} diff --git a/.sqlx/query-24449d7fa57151cc7bbe17b757c4a155eaf85f51b91e0724a100e7eedfa096ce.json b/.sqlx/query-24449d7fa57151cc7bbe17b757c4a155eaf85f51b91e0724a100e7eedfa096ce.json new file mode 100644 index 00000000..334996a4 --- /dev/null +++ b/.sqlx/query-24449d7fa57151cc7bbe17b757c4a155eaf85f51b91e0724a100e7eedfa096ce.json @@ -0,0 +1,111 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT id,\n name,\n email,\n password,\n salt,\n role AS \"role: Role\",\n function AS \"function: UserFunction\",\n areaId,\n locked,\n lastLogin,\n receiveNotifications\n FROM user_\n WHERE id = $1;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "email", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "password", + "type_info": "Text" + }, + { + "ordinal": 4, + "name": "salt", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "role: Role", + "type_info": { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + } + }, + { + "ordinal": 6, + "name": "function: UserFunction", + "type_info": { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + } + }, + { + "ordinal": 7, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 8, + "name": "locked", + "type_info": "Bool" + }, + { + "ordinal": 9, + "name": "lastlogin", + "type_info": "Timestamptz" + }, + { + "ordinal": 10, + "name": "receivenotifications", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false + ] + }, + "hash": "24449d7fa57151cc7bbe17b757c4a155eaf85f51b91e0724a100e7eedfa096ce" +} diff --git a/.sqlx/query-24fecf0d262d800b26cf90db0e12fea535a7b630000db10ea89419bff998f58d.json b/.sqlx/query-24fecf0d262d800b26cf90db0e12fea535a7b630000db10ea89419bff998f58d.json new file mode 100644 index 00000000..51bdd7a5 --- /dev/null +++ b/.sqlx/query-24fecf0d262d800b26cf90db0e12fea535a7b630000db10ea89419bff998f58d.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM user_ WHERE id = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "24fecf0d262d800b26cf90db0e12fea535a7b630000db10ea89419bff998f58d" +} diff --git a/.sqlx/query-2d9f2d0728983dfac09f6649da74aa5659072539a8f222b8ae202786ce958c37.json b/.sqlx/query-2d9f2d0728983dfac09f6649da74aa5659072539a8f222b8ae202786ce958c37.json new file mode 100644 index 00000000..977b22f1 --- /dev/null +++ b/.sqlx/query-2d9f2d0728983dfac09f6649da74aa5659072539a8f222b8ae202786ce958c37.json @@ -0,0 +1,32 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM location", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "areaid", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "2d9f2d0728983dfac09f6649da74aa5659072539a8f222b8ae202786ce958c37" +} diff --git a/.sqlx/query-348365fd1e76ebfcfa065d1ea7e22cd7cbcd2e981f75fce75f29f1c4fbfc3df5.json b/.sqlx/query-348365fd1e76ebfcfa065d1ea7e22cd7cbcd2e981f75fce75f29f1c4fbfc3df5.json new file mode 100644 index 00000000..2c416956 --- /dev/null +++ b/.sqlx/query-348365fd1e76ebfcfa065d1ea7e22cd7cbcd2e981f75fce75f29f1c4fbfc3df5.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE user_ SET locked = $1 WHERE id = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Bool", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "348365fd1e76ebfcfa065d1ea7e22cd7cbcd2e981f75fce75f29f1c4fbfc3df5" +} diff --git a/.sqlx/query-36afabfbbe056a63386f94edf2d49beb2d63130f8ea1bf4a840d7729bcb6f9cc.json b/.sqlx/query-36afabfbbe056a63386f94edf2d49beb2d63130f8ea1bf4a840d7729bcb6f9cc.json new file mode 100644 index 00000000..5aa5047c --- /dev/null +++ b/.sqlx/query-36afabfbbe056a63386f94edf2d49beb2d63130f8ea1bf4a840d7729bcb6f9cc.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE user_ SET lastLogin = NOW() WHERE id = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "36afabfbbe056a63386f94edf2d49beb2d63130f8ea1bf4a840d7729bcb6f9cc" +} diff --git a/.sqlx/query-39415450c15de43079d87443b71cf9bacb8e852fa434448d3cc4c52bad0bcf01.json b/.sqlx/query-39415450c15de43079d87443b71cf9bacb8e852fa434448d3cc4c52bad0bcf01.json new file mode 100644 index 00000000..3a226cf4 --- /dev/null +++ b/.sqlx/query-39415450c15de43079d87443b71cf9bacb8e852fa434448d3cc4c52bad0bcf01.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE vehicle SET radiocallname = $1, station = $2 WHERE id = $3;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "39415450c15de43079d87443b71cf9bacb8e852fa434448d3cc4c52bad0bcf01" +} diff --git a/.sqlx/query-3e246c54d31804140272a6fc2e3c241c17b086ff219d6084684a0f2b7c31eeed.json b/.sqlx/query-3e246c54d31804140272a6fc2e3c241c17b086ff219d6084684a0f2b7c31eeed.json new file mode 100644 index 00000000..ea9625d4 --- /dev/null +++ b/.sqlx/query-3e246c54d31804140272a6fc2e3c241c17b086ff219d6084684a0f2b7c31eeed.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE user_ SET receiveNotifications = $1 WHERE id = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Bool", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "3e246c54d31804140272a6fc2e3c241c17b086ff219d6084684a0f2b7c31eeed" +} diff --git a/.sqlx/query-40254661a2d8a7e4b803551419e082b6ae3a5cb32ddc30a8fa844a4be67564ff.json b/.sqlx/query-40254661a2d8a7e4b803551419e082b6ae3a5cb32ddc30a8fa844a4be67564ff.json new file mode 100644 index 00000000..e1c9205f --- /dev/null +++ b/.sqlx/query-40254661a2d8a7e4b803551419e082b6ae3a5cb32ddc30a8fa844a4be67564ff.json @@ -0,0 +1,57 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n assignment.eventId,\n assignment.availabillityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE assignment.AvailabillityId = $1;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "eventid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "availabillityid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "function: Function", + "type_info": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + }, + { + "ordinal": 3, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "endtimestamp", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false, + false + ] + }, + "hash": "40254661a2d8a7e4b803551419e082b6ae3a5cb32ddc30a8fa844a4be67564ff" +} diff --git a/.sqlx/query-413a3b2bdb7c23ab0f44bcc3ece79de6106c087ff85ca075fd9ca65a42cfa8cc.json b/.sqlx/query-413a3b2bdb7c23ab0f44bcc3ece79de6106c087ff85ca075fd9ca65a42cfa8cc.json new file mode 100644 index 00000000..950a1cf7 --- /dev/null +++ b/.sqlx/query-413a3b2bdb7c23ab0f44bcc3ece79de6106c087ff85ca075fd9ca65a42cfa8cc.json @@ -0,0 +1,30 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO registration (token, userId, expires) VALUES ($1, $2, $3) RETURNING token, userId;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "token", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "userid", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Int4", + "Timestamp" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "413a3b2bdb7c23ab0f44bcc3ece79de6106c087ff85ca075fd9ca65a42cfa8cc" +} diff --git a/.sqlx/query-478a745b8953efab4fbc915d99a4ad6a47a5c83e7054bc9fda81a31e6555f4ff.json b/.sqlx/query-478a745b8953efab4fbc915d99a4ad6a47a5c83e7054bc9fda81a31e6555f4ff.json new file mode 100644 index 00000000..a2f38349 --- /dev/null +++ b/.sqlx/query-478a745b8953efab4fbc915d99a4ad6a47a5c83e7054bc9fda81a31e6555f4ff.json @@ -0,0 +1,57 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n assignment.eventId,\n assignment.availabillityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE assignment.eventId = $1;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "eventid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "availabillityid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "function: Function", + "type_info": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + }, + { + "ordinal": 3, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "endtimestamp", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false, + false + ] + }, + "hash": "478a745b8953efab4fbc915d99a4ad6a47a5c83e7054bc9fda81a31e6555f4ff" +} diff --git a/.sqlx/query-483ad933fa1e935058cbe42b7ff083ceee80f74564ee3e8b7da6ab57e906368b.json b/.sqlx/query-483ad933fa1e935058cbe42b7ff083ceee80f74564ee3e8b7da6ab57e906368b.json new file mode 100644 index 00000000..8203ab8f --- /dev/null +++ b/.sqlx/query-483ad933fa1e935058cbe42b7ff083ceee80f74564ee3e8b7da6ab57e906368b.json @@ -0,0 +1,111 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT id,\n name,\n email,\n password,\n salt,\n role AS \"role: Role\",\n function AS \"function: UserFunction\",\n areaId,\n locked,\n lastLogin,\n receiveNotifications\n FROM user_\n WHERE areaId = $1;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "email", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "password", + "type_info": "Text" + }, + { + "ordinal": 4, + "name": "salt", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "role: Role", + "type_info": { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + } + }, + { + "ordinal": 6, + "name": "function: UserFunction", + "type_info": { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + } + }, + { + "ordinal": 7, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 8, + "name": "locked", + "type_info": "Bool" + }, + { + "ordinal": 9, + "name": "lastlogin", + "type_info": "Timestamptz" + }, + { + "ordinal": 10, + "name": "receivenotifications", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false + ] + }, + "hash": "483ad933fa1e935058cbe42b7ff083ceee80f74564ee3e8b7da6ab57e906368b" +} diff --git a/.sqlx/query-48e3cab60736bf95958b063013090c64160aff1bad2f0db851db2e421711a156.json b/.sqlx/query-48e3cab60736bf95958b063013090c64160aff1bad2f0db851db2e421711a156.json new file mode 100644 index 00000000..fd9a907a --- /dev/null +++ b/.sqlx/query-48e3cab60736bf95958b063013090c64160aff1bad2f0db851db2e421711a156.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM vehicleassignement WHERE eventId = $1 AND vehicleId = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "48e3cab60736bf95958b063013090c64160aff1bad2f0db851db2e421711a156" +} diff --git a/.sqlx/query-4b3eebd13b23df2046dabf6ad161f1ec32d95ec24d6da507387e9a7cf8287eaf.json b/.sqlx/query-4b3eebd13b23df2046dabf6ad161f1ec32d95ec24d6da507387e9a7cf8287eaf.json new file mode 100644 index 00000000..cc2cc774 --- /dev/null +++ b/.sqlx/query-4b3eebd13b23df2046dabf6ad161f1ec32d95ec24d6da507387e9a7cf8287eaf.json @@ -0,0 +1,41 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n vehicleAssignement.eventId,\n vehicleAssignement.vehicleId,\n vehicleAssignement.starttimestamp,\n vehicleAssignement.endtimestamp\n FROM vehicleAssignement\n JOIN event ON vehicleAssignement.eventId = event.id\n WHERE vehicleAssignement.vehicleid = $1\n AND event.starttimestamp::date = $2;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "eventid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "vehicleid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 3, + "name": "endtimestamp", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Int4", + "Date" + ] + }, + "nullable": [ + false, + false, + false, + false + ] + }, + "hash": "4b3eebd13b23df2046dabf6ad161f1ec32d95ec24d6da507387e9a7cf8287eaf" +} diff --git a/.sqlx/query-4bfce344fc6f0bfbb2b460677ce3eba3793ecf697355e81012e721357ba351b9.json b/.sqlx/query-4bfce344fc6f0bfbb2b460677ce3eba3793ecf697355e81012e721357ba351b9.json new file mode 100644 index 00000000..eaa739ca --- /dev/null +++ b/.sqlx/query-4bfce344fc6f0bfbb2b460677ce3eba3793ecf697355e81012e721357ba351b9.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM event WHERE id = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "4bfce344fc6f0bfbb2b460677ce3eba3793ecf697355e81012e721357ba351b9" +} diff --git a/.sqlx/query-5573e93ccc0b6a5ecc6183a5d5c589ccd58f786e70a3ff1efa662085c2035156.json b/.sqlx/query-5573e93ccc0b6a5ecc6183a5d5c589ccd58f786e70a3ff1efa662085c2035156.json new file mode 100644 index 00000000..2a034738 --- /dev/null +++ b/.sqlx/query-5573e93ccc0b6a5ecc6183a5d5c589ccd58f786e70a3ff1efa662085c2035156.json @@ -0,0 +1,109 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT id,\n name,\n email,\n password,\n salt,\n role AS \"role: Role\",\n function AS \"function: UserFunction\",\n areaId,\n locked,\n lastLogin,\n receiveNotifications\n FROM user_;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "email", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "password", + "type_info": "Text" + }, + { + "ordinal": 4, + "name": "salt", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "role: Role", + "type_info": { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + } + }, + { + "ordinal": 6, + "name": "function: UserFunction", + "type_info": { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + } + }, + { + "ordinal": 7, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 8, + "name": "locked", + "type_info": "Bool" + }, + { + "ordinal": 9, + "name": "lastlogin", + "type_info": "Timestamptz" + }, + { + "ordinal": 10, + "name": "receivenotifications", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false + ] + }, + "hash": "5573e93ccc0b6a5ecc6183a5d5c589ccd58f786e70a3ff1efa662085c2035156" +} diff --git a/.sqlx/query-55a70284a5ddc7bff778ed1ea012b05b1daadbe41c77a8bd317f7fb17b7991cb.json b/.sqlx/query-55a70284a5ddc7bff778ed1ea012b05b1daadbe41c77a8bd317f7fb17b7991cb.json new file mode 100644 index 00000000..2211bfa1 --- /dev/null +++ b/.sqlx/query-55a70284a5ddc7bff778ed1ea012b05b1daadbe41c77a8bd317f7fb17b7991cb.json @@ -0,0 +1,100 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n event.id AS eventId,\n event.startTimestamp,\n event.endTimestamp,\n event.name,\n event.locationId,\n event.voluntaryWachhabender,\n event.voluntaryFuehrungsassistent,\n event.amountOfPosten,\n event.clothing,\n event.canceled,\n event.note,\n location.id,\n location.name AS locationName,\n location.areaId AS locationAreaId\n FROM event\n JOIN location ON event.locationId = location.id\n WHERE event.id = $1;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "eventid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 2, + "name": "endtimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 3, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 4, + "name": "locationid", + "type_info": "Int4" + }, + { + "ordinal": 5, + "name": "voluntarywachhabender", + "type_info": "Bool" + }, + { + "ordinal": 6, + "name": "voluntaryfuehrungsassistent", + "type_info": "Bool" + }, + { + "ordinal": 7, + "name": "amountofposten", + "type_info": "Int2" + }, + { + "ordinal": 8, + "name": "clothing", + "type_info": "Text" + }, + { + "ordinal": 9, + "name": "canceled", + "type_info": "Bool" + }, + { + "ordinal": 10, + "name": "note", + "type_info": "Text" + }, + { + "ordinal": 11, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 12, + "name": "locationname", + "type_info": "Text" + }, + { + "ordinal": 13, + "name": "locationareaid", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + false, + false, + false + ] + }, + "hash": "55a70284a5ddc7bff778ed1ea012b05b1daadbe41c77a8bd317f7fb17b7991cb" +} diff --git a/.sqlx/query-5b87f4da0924338da1a30d7b74711d8073f6d62cf30a42381484846f0917bc33.json b/.sqlx/query-5b87f4da0924338da1a30d7b74711d8073f6d62cf30a42381484846f0917bc33.json new file mode 100644 index 00000000..cdeab8b7 --- /dev/null +++ b/.sqlx/query-5b87f4da0924338da1a30d7b74711d8073f6d62cf30a42381484846f0917bc33.json @@ -0,0 +1,32 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM vehicle;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "radiocallname", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "station", + "type_info": "Text" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "5b87f4da0924338da1a30d7b74711d8073f6d62cf30a42381484846f0917bc33" +} diff --git a/.sqlx/query-5c492ff7ad44ae4876bae9b9ba947d12ad03cda345ba6d1120e38081fdb1fa06.json b/.sqlx/query-5c492ff7ad44ae4876bae9b9ba947d12ad03cda345ba6d1120e38081fdb1fa06.json new file mode 100644 index 00000000..31dd2af1 --- /dev/null +++ b/.sqlx/query-5c492ff7ad44ae4876bae9b9ba947d12ad03cda345ba6d1120e38081fdb1fa06.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM registration WHERE userId = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "5c492ff7ad44ae4876bae9b9ba947d12ad03cda345ba6d1120e38081fdb1fa06" +} diff --git a/.sqlx/query-5ef1494706bb6c9d41f19f57d8120e57b274a5b38c0ded9f26824d4aba1822e9.json b/.sqlx/query-5ef1494706bb6c9d41f19f57d8120e57b274a5b38c0ded9f26824d4aba1822e9.json new file mode 100644 index 00000000..5c20701d --- /dev/null +++ b/.sqlx/query-5ef1494706bb6c9d41f19f57d8120e57b274a5b38c0ded9f26824d4aba1822e9.json @@ -0,0 +1,143 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications,\n area.name AS areaName\n FROM availabillity\n JOIN user_ ON availabillity.userId = user_.id\n JOIN area ON user_.areaId = area.id\n WHERE user_.areaId = $1 AND\n availabillity.starttimestamp::date >= $2 AND\n availabillity.starttimestamp::date <= $3;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "userid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 3, + "name": "endtimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "comment", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "email", + "type_info": "Text" + }, + { + "ordinal": 7, + "name": "password", + "type_info": "Text" + }, + { + "ordinal": 8, + "name": "salt", + "type_info": "Text" + }, + { + "ordinal": 9, + "name": "role: Role", + "type_info": { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + } + }, + { + "ordinal": 10, + "name": "function: UserFunction", + "type_info": { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + } + }, + { + "ordinal": 11, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 12, + "name": "locked", + "type_info": "Bool" + }, + { + "ordinal": 13, + "name": "lastlogin", + "type_info": "Timestamptz" + }, + { + "ordinal": 14, + "name": "receivenotifications", + "type_info": "Bool" + }, + { + "ordinal": 15, + "name": "areaname", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Int4", + "Date", + "Date" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false, + false + ] + }, + "hash": "5ef1494706bb6c9d41f19f57d8120e57b274a5b38c0ded9f26824d4aba1822e9" +} diff --git a/.sqlx/query-68d2b1ed0dc56056ec85ca38ba033ffcb6a480ca13c2beea0a543067840c64a7.json b/.sqlx/query-68d2b1ed0dc56056ec85ca38ba033ffcb6a480ca13c2beea0a543067840c64a7.json new file mode 100644 index 00000000..730cf8d5 --- /dev/null +++ b/.sqlx/query-68d2b1ed0dc56056ec85ca38ba033ffcb6a480ca13c2beea0a543067840c64a7.json @@ -0,0 +1,34 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM vehicle WHERE id = $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "radiocallname", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "station", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "68d2b1ed0dc56056ec85ca38ba033ffcb6a480ca13c2beea0a543067840c64a7" +} diff --git a/.sqlx/query-70850ec3f7c519c1fc104fead6a44d07ba76023567bc6ea0eec2267d1c592479.json b/.sqlx/query-70850ec3f7c519c1fc104fead6a44d07ba76023567bc6ea0eec2267d1c592479.json new file mode 100644 index 00000000..c7f56058 --- /dev/null +++ b/.sqlx/query-70850ec3f7c519c1fc104fead6a44d07ba76023567bc6ea0eec2267d1c592479.json @@ -0,0 +1,46 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT location.id AS locationId, location.name, location.areaId, area.id, area.name AS areaName FROM location JOIN area ON location.areaId = area.id WHERE areaId = $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "locationid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 3, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 4, + "name": "areaname", + "type_info": "Text" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false, + false + ] + }, + "hash": "70850ec3f7c519c1fc104fead6a44d07ba76023567bc6ea0eec2267d1c592479" +} diff --git a/.sqlx/query-73eba57512af51a7a7d5ea9b6b375dba701bf829b8cf8e37388c1de1c302f486.json b/.sqlx/query-73eba57512af51a7a7d5ea9b6b375dba701bf829b8cf8e37388c1de1c302f486.json new file mode 100644 index 00000000..8b79ea6c --- /dev/null +++ b/.sqlx/query-73eba57512af51a7a7d5ea9b6b375dba701bf829b8cf8e37388c1de1c302f486.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM passwordReset WHERE token = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "73eba57512af51a7a7d5ea9b6b375dba701bf829b8cf8e37388c1de1c302f486" +} diff --git a/.sqlx/query-75d96d0b937b8e222aa2ad6b9fc0fc185e2b6b5f1a7c80507d39d813af3e3478.json b/.sqlx/query-75d96d0b937b8e222aa2ad6b9fc0fc185e2b6b5f1a7c80507d39d813af3e3478.json new file mode 100644 index 00000000..8b5aa86d --- /dev/null +++ b/.sqlx/query-75d96d0b937b8e222aa2ad6b9fc0fc185e2b6b5f1a7c80507d39d813af3e3478.json @@ -0,0 +1,29 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE assignment SET function = $1, startTimestamp = $2, endTimestamp = $3 WHERE eventId = $4 AND availabillityId = $5;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + }, + "Timestamptz", + "Timestamptz", + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "75d96d0b937b8e222aa2ad6b9fc0fc185e2b6b5f1a7c80507d39d813af3e3478" +} diff --git a/.sqlx/query-7bc06d40e0e7f43f73861bb5fa9fe954aea7c821abf785b68d0731fcaf0f4845.json b/.sqlx/query-7bc06d40e0e7f43f73861bb5fa9fe954aea7c821abf785b68d0731fcaf0f4845.json new file mode 100644 index 00000000..52dd109b --- /dev/null +++ b/.sqlx/query-7bc06d40e0e7f43f73861bb5fa9fe954aea7c821abf785b68d0731fcaf0f4845.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE event SET canceled = $1 WHERE id = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Bool", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "7bc06d40e0e7f43f73861bb5fa9fe954aea7c821abf785b68d0731fcaf0f4845" +} diff --git a/.sqlx/query-7d2e4fcde5bee6c9dcd85e35fa5f0dd4ae6b638b85f0e3a54afc85a46de6ae3a.json b/.sqlx/query-7d2e4fcde5bee6c9dcd85e35fa5f0dd4ae6b638b85f0e3a54afc85a46de6ae3a.json new file mode 100644 index 00000000..26728978 --- /dev/null +++ b/.sqlx/query-7d2e4fcde5bee6c9dcd85e35fa5f0dd4ae6b638b85f0e3a54afc85a46de6ae3a.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM assignment WHERE assignment.eventId = $1 AND assignment.availabillityId = $2;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "7d2e4fcde5bee6c9dcd85e35fa5f0dd4ae6b638b85f0e3a54afc85a46de6ae3a" +} diff --git a/.sqlx/query-7f6c89117e8d4249e032235d03d264c3d5d47bd119c563237486cf47e402ae2e.json b/.sqlx/query-7f6c89117e8d4249e032235d03d264c3d5d47bd119c563237486cf47e402ae2e.json new file mode 100644 index 00000000..ea083cc2 --- /dev/null +++ b/.sqlx/query-7f6c89117e8d4249e032235d03d264c3d5d47bd119c563237486cf47e402ae2e.json @@ -0,0 +1,26 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM area ORDER by id", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false + ] + }, + "hash": "7f6c89117e8d4249e032235d03d264c3d5d47bd119c563237486cf47e402ae2e" +} diff --git a/.sqlx/query-843da813342d6d7875667d43a76f6f2820ef97b85e1185b846ff245113889096.json b/.sqlx/query-843da813342d6d7875667d43a76f6f2820ef97b85e1185b846ff245113889096.json new file mode 100644 index 00000000..28c82cdb --- /dev/null +++ b/.sqlx/query-843da813342d6d7875667d43a76f6f2820ef97b85e1185b846ff245113889096.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO availabillity (userId, startTimestamp, endTimestamp, comment)\n VALUES ($1, $2, $3, $4);\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Timestamptz", + "Timestamptz", + "Text" + ] + }, + "nullable": [] + }, + "hash": "843da813342d6d7875667d43a76f6f2820ef97b85e1185b846ff245113889096" +} diff --git a/.sqlx/query-85dc89689632abde0930ca3fde05ac1b6f3acb52e5ac2d2a98b966f05d5b9953.json b/.sqlx/query-85dc89689632abde0930ca3fde05ac1b6f3acb52e5ac2d2a98b966f05d5b9953.json new file mode 100644 index 00000000..4954f506 --- /dev/null +++ b/.sqlx/query-85dc89689632abde0930ca3fde05ac1b6f3acb52e5ac2d2a98b966f05d5b9953.json @@ -0,0 +1,138 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availabillity\n JOIN user_ ON availabillity.userId = user_.id\n WHERE availabillity.starttimestamp::date = $1\n AND user_.areaId = $2\n AND availabillity.startTimestamp <= $3 AND availabillity.endTimestamp >= $4;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "userid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 3, + "name": "endtimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "comment", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "email", + "type_info": "Text" + }, + { + "ordinal": 7, + "name": "password", + "type_info": "Text" + }, + { + "ordinal": 8, + "name": "salt", + "type_info": "Text" + }, + { + "ordinal": 9, + "name": "role: Role", + "type_info": { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + } + }, + { + "ordinal": 10, + "name": "function: UserFunction", + "type_info": { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + } + }, + { + "ordinal": 11, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 12, + "name": "locked", + "type_info": "Bool" + }, + { + "ordinal": 13, + "name": "lastlogin", + "type_info": "Timestamptz" + }, + { + "ordinal": 14, + "name": "receivenotifications", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Date", + "Int4", + "Timestamptz", + "Timestamptz" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false + ] + }, + "hash": "85dc89689632abde0930ca3fde05ac1b6f3acb52e5ac2d2a98b966f05d5b9953" +} diff --git a/.sqlx/query-868bbdcb65f0ee862f221b7e3d1a4f4dbc4d818315d1713a110c4ad7acd09e3e.json b/.sqlx/query-868bbdcb65f0ee862f221b7e3d1a4f4dbc4d818315d1713a110c4ad7acd09e3e.json new file mode 100644 index 00000000..c47a9b57 --- /dev/null +++ b/.sqlx/query-868bbdcb65f0ee862f221b7e3d1a4f4dbc4d818315d1713a110c4ad7acd09e3e.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE user_ SET password = $1, salt = $2 WHERE id = $3;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "868bbdcb65f0ee862f221b7e3d1a4f4dbc4d818315d1713a110c4ad7acd09e3e" +} diff --git a/.sqlx/query-890ac023f7b2a6517ca46dfff5fc10e5e1d0c4757aa097294f5d7d6b6368b558.json b/.sqlx/query-890ac023f7b2a6517ca46dfff5fc10e5e1d0c4757aa097294f5d7d6b6368b558.json new file mode 100644 index 00000000..a6a8a367 --- /dev/null +++ b/.sqlx/query-890ac023f7b2a6517ca46dfff5fc10e5e1d0c4757aa097294f5d7d6b6368b558.json @@ -0,0 +1,135 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n availabillity.id,\n availabillity.userId,\n availabillity.startTimestamp,\n availabillity.endTimestamp,\n availabillity.comment,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n user_.function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications\n FROM availabillity\n LEFT JOIN assignment ON availabillity.Id = assignment.availabillityId\n JOIN user_ ON availabillity.userId = user_.id\n WHERE availabillity.id = $1;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "userid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 3, + "name": "endtimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "comment", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 6, + "name": "email", + "type_info": "Text" + }, + { + "ordinal": 7, + "name": "password", + "type_info": "Text" + }, + { + "ordinal": 8, + "name": "salt", + "type_info": "Text" + }, + { + "ordinal": 9, + "name": "role: Role", + "type_info": { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + } + }, + { + "ordinal": 10, + "name": "function: UserFunction", + "type_info": { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + } + }, + { + "ordinal": 11, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 12, + "name": "locked", + "type_info": "Bool" + }, + { + "ordinal": 13, + "name": "lastlogin", + "type_info": "Timestamptz" + }, + { + "ordinal": 14, + "name": "receivenotifications", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false, + true, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false + ] + }, + "hash": "890ac023f7b2a6517ca46dfff5fc10e5e1d0c4757aa097294f5d7d6b6368b558" +} diff --git a/.sqlx/query-9091186ff6f2e2013cdca9d66c6f5be5207b0e868b6de0f558a469138838a650.json b/.sqlx/query-9091186ff6f2e2013cdca9d66c6f5be5207b0e868b6de0f558a469138838a650.json new file mode 100644 index 00000000..4977cda2 --- /dev/null +++ b/.sqlx/query-9091186ff6f2e2013cdca9d66c6f5be5207b0e868b6de0f558a469138838a650.json @@ -0,0 +1,111 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT id,\n name,\n email,\n password,\n salt,\n role AS \"role: Role\",\n function AS \"function: UserFunction\",\n areaId,\n locked,\n lastLogin,\n receiveNotifications\n FROM user_\n WHERE email = $1 AND locked = FALSE AND password IS NOT NULL AND salt IS NOT NULL;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "email", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "password", + "type_info": "Text" + }, + { + "ordinal": 4, + "name": "salt", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "role: Role", + "type_info": { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + } + }, + { + "ordinal": 6, + "name": "function: UserFunction", + "type_info": { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + } + }, + { + "ordinal": 7, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 8, + "name": "locked", + "type_info": "Bool" + }, + { + "ordinal": 9, + "name": "lastlogin", + "type_info": "Timestamptz" + }, + { + "ordinal": 10, + "name": "receivenotifications", + "type_info": "Bool" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false + ] + }, + "hash": "9091186ff6f2e2013cdca9d66c6f5be5207b0e868b6de0f558a469138838a650" +} diff --git a/.sqlx/query-9e77980b06e46b1c2d8cbcab7006b984c81afc8ef02fbe289170f48411147022.json b/.sqlx/query-9e77980b06e46b1c2d8cbcab7006b984c81afc8ef02fbe289170f48411147022.json new file mode 100644 index 00000000..d1112de5 --- /dev/null +++ b/.sqlx/query-9e77980b06e46b1c2d8cbcab7006b984c81afc8ef02fbe289170f48411147022.json @@ -0,0 +1,58 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n assignment.eventId,\n assignment.availabillityId,\n assignment.function AS \"function: Function\",\n assignment.startTimestamp,\n assignment.endTimestamp\n FROM assignment\n WHERE\n assignment.eventId = $1 AND\n assignment.availabillityId = $2;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "eventid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "availabillityid", + "type_info": "Int4" + }, + { + "ordinal": 2, + "name": "function: Function", + "type_info": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + }, + { + "ordinal": 3, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 4, + "name": "endtimestamp", + "type_info": "Timestamptz" + } + ], + "parameters": { + "Left": [ + "Int4", + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false, + false + ] + }, + "hash": "9e77980b06e46b1c2d8cbcab7006b984c81afc8ef02fbe289170f48411147022" +} diff --git a/.sqlx/query-a517738fabdf4a8c48778ea953f5ab6a3fa9a224ebacc32f75b60cbc91a11fea.json b/.sqlx/query-a517738fabdf4a8c48778ea953f5ab6a3fa9a224ebacc32f75b60cbc91a11fea.json new file mode 100644 index 00000000..fdebde0a --- /dev/null +++ b/.sqlx/query-a517738fabdf4a8c48778ea953f5ab6a3fa9a224ebacc32f75b60cbc91a11fea.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE availabillity SET startTimestamp = $1, endTimestamp = $2, comment = $3 WHERE id = $4", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Timestamptz", + "Timestamptz", + "Text", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "a517738fabdf4a8c48778ea953f5ab6a3fa9a224ebacc32f75b60cbc91a11fea" +} diff --git a/.sqlx/query-a7f6e57733c655534c3ae6379b8616fc3aa63ce322cc2d718f4b4e4e23903a61.json b/.sqlx/query-a7f6e57733c655534c3ae6379b8616fc3aa63ce322cc2d718f4b4e4e23903a61.json new file mode 100644 index 00000000..d5f055e1 --- /dev/null +++ b/.sqlx/query-a7f6e57733c655534c3ae6379b8616fc3aa63ce322cc2d718f4b4e4e23903a61.json @@ -0,0 +1,121 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n user_.id AS userId,\n user_.name,\n user_.email,\n user_.password,\n user_.salt,\n user_.role AS \"role: Role\",\n function AS \"function: UserFunction\",\n user_.areaId,\n user_.locked,\n user_.lastLogin,\n user_.receiveNotifications,\n area.id,\n area.name AS areaName\n FROM user_\n JOIN area ON user_.areaId = area.id\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "userid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "email", + "type_info": "Text" + }, + { + "ordinal": 3, + "name": "password", + "type_info": "Text" + }, + { + "ordinal": 4, + "name": "salt", + "type_info": "Text" + }, + { + "ordinal": 5, + "name": "role: Role", + "type_info": { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + } + }, + { + "ordinal": 6, + "name": "function: UserFunction", + "type_info": { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + } + }, + { + "ordinal": 7, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 8, + "name": "locked", + "type_info": "Bool" + }, + { + "ordinal": 9, + "name": "lastlogin", + "type_info": "Timestamptz" + }, + { + "ordinal": 10, + "name": "receivenotifications", + "type_info": "Bool" + }, + { + "ordinal": 11, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 12, + "name": "areaname", + "type_info": "Text" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false, + false, + false + ] + }, + "hash": "a7f6e57733c655534c3ae6379b8616fc3aa63ce322cc2d718f4b4e4e23903a61" +} diff --git a/.sqlx/query-ad4419211e4c98292eaa47ab04e0ea0201f1789ac906acc8cf79aacfbecd9f05.json b/.sqlx/query-ad4419211e4c98292eaa47ab04e0ea0201f1789ac906acc8cf79aacfbecd9f05.json new file mode 100644 index 00000000..097b0306 --- /dev/null +++ b/.sqlx/query-ad4419211e4c98292eaa47ab04e0ea0201f1789ac906acc8cf79aacfbecd9f05.json @@ -0,0 +1,55 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO user_ (name, email, role, function, areaId)\n VALUES ($1, $2, $3, $4, $5)\n RETURNING id;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Text", + { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + }, + { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + }, + "Int4" + ] + }, + "nullable": [ + false + ] + }, + "hash": "ad4419211e4c98292eaa47ab04e0ea0201f1789ac906acc8cf79aacfbecd9f05" +} diff --git a/.sqlx/query-b1e4b7c5d9a08923ab0512b2f2d402865f5d63cb828507c856293be62102aeef.json b/.sqlx/query-b1e4b7c5d9a08923ab0512b2f2d402865f5d63cb828507c856293be62102aeef.json new file mode 100644 index 00000000..50e566d6 --- /dev/null +++ b/.sqlx/query-b1e4b7c5d9a08923ab0512b2f2d402865f5d63cb828507c856293be62102aeef.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT token, userId FROM passwordReset WHERE token = $1 AND expires > NOW();", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "token", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "userid", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "b1e4b7c5d9a08923ab0512b2f2d402865f5d63cb828507c856293be62102aeef" +} diff --git a/.sqlx/query-b259a464a99501cb60551791af069f662da9fed90243ac4a42d1cf1020b614d3.json b/.sqlx/query-b259a464a99501cb60551791af069f662da9fed90243ac4a42d1cf1020b614d3.json new file mode 100644 index 00000000..03f33f16 --- /dev/null +++ b/.sqlx/query-b259a464a99501cb60551791af069f662da9fed90243ac4a42d1cf1020b614d3.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO event (startTimestamp, endTimestamp, name, locationId, voluntaryWachhabender, voluntaryFuehrungsassistent, amountOfPosten, clothing, note)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9);\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Timestamptz", + "Timestamptz", + "Text", + "Int4", + "Bool", + "Bool", + "Int2", + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "b259a464a99501cb60551791af069f662da9fed90243ac4a42d1cf1020b614d3" +} diff --git a/.sqlx/query-b55283e681bed3f5666cefca8acf2504e78ee2c8e094d96b89b68e8e7dddce48.json b/.sqlx/query-b55283e681bed3f5666cefca8acf2504e78ee2c8e094d96b89b68e8e7dddce48.json new file mode 100644 index 00000000..6b6f43f5 --- /dev/null +++ b/.sqlx/query-b55283e681bed3f5666cefca8acf2504e78ee2c8e094d96b89b68e8e7dddce48.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM registration WHERE token = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [] + }, + "hash": "b55283e681bed3f5666cefca8acf2504e78ee2c8e094d96b89b68e8e7dddce48" +} diff --git a/.sqlx/query-b670053eb906a244d3ce12a7eb36982d6b21ed1e637fbf0eee841031e217c6c5.json b/.sqlx/query-b670053eb906a244d3ce12a7eb36982d6b21ed1e637fbf0eee841031e217c6c5.json new file mode 100644 index 00000000..7370c14e --- /dev/null +++ b/.sqlx/query-b670053eb906a244d3ce12a7eb36982d6b21ed1e637fbf0eee841031e217c6c5.json @@ -0,0 +1,22 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO area (name) VALUES ($1) RETURNING id;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text" + ] + }, + "nullable": [ + false + ] + }, + "hash": "b670053eb906a244d3ce12a7eb36982d6b21ed1e637fbf0eee841031e217c6c5" +} diff --git a/.sqlx/query-bc79bfefe13543d35aca3443919dd4a2d4d8ee88a6bcdf0ee331cff0f7064811.json b/.sqlx/query-bc79bfefe13543d35aca3443919dd4a2d4d8ee88a6bcdf0ee331cff0f7064811.json new file mode 100644 index 00000000..1648700e --- /dev/null +++ b/.sqlx/query-bc79bfefe13543d35aca3443919dd4a2d4d8ee88a6bcdf0ee331cff0f7064811.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO vehicleassignement (eventId, vehicleId, startTimestamp, endTimestamp) VALUES ($1, $2, $3, $4);", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4", + "Int4", + "Timestamptz", + "Timestamptz" + ] + }, + "nullable": [] + }, + "hash": "bc79bfefe13543d35aca3443919dd4a2d4d8ee88a6bcdf0ee331cff0f7064811" +} diff --git a/.sqlx/query-c28c0fd372fa23b0053ec38ce59b5bf791d8a75ba68937609698bd52c97c8d0d.json b/.sqlx/query-c28c0fd372fa23b0053ec38ce59b5bf791d8a75ba68937609698bd52c97c8d0d.json new file mode 100644 index 00000000..bf0d2514 --- /dev/null +++ b/.sqlx/query-c28c0fd372fa23b0053ec38ce59b5bf791d8a75ba68937609698bd52c97c8d0d.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO vehicle (radioCallName, station) VALUES ($1, $2);", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text" + ] + }, + "nullable": [] + }, + "hash": "c28c0fd372fa23b0053ec38ce59b5bf791d8a75ba68937609698bd52c97c8d0d" +} diff --git a/.sqlx/query-cca2b280d655073557f035932eb7919b7e8263eee1e8026d9143a15f12fa81a5.json b/.sqlx/query-cca2b280d655073557f035932eb7919b7e8263eee1e8026d9143a15f12fa81a5.json new file mode 100644 index 00000000..a04e508e --- /dev/null +++ b/.sqlx/query-cca2b280d655073557f035932eb7919b7e8263eee1e8026d9143a15f12fa81a5.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM area WHERE id = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "cca2b280d655073557f035932eb7919b7e8263eee1e8026d9143a15f12fa81a5" +} diff --git a/.sqlx/query-d1d97d9f6cc8d9777dc4ce38a4b50041db855227c8d465d56e985bad86f0c8d9.json b/.sqlx/query-d1d97d9f6cc8d9777dc4ce38a4b50041db855227c8d465d56e985bad86f0c8d9.json new file mode 100644 index 00000000..e302df1e --- /dev/null +++ b/.sqlx/query-d1d97d9f6cc8d9777dc4ce38a4b50041db855227c8d465d56e985bad86f0c8d9.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO location (name, areaId) VALUES ($1, $2);", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "d1d97d9f6cc8d9777dc4ce38a4b50041db855227c8d465d56e985bad86f0c8d9" +} diff --git a/.sqlx/query-d4a8fe79186f648212fb270323942e60edd5163b6463c2f0ef22baaf8be7bcd5.json b/.sqlx/query-d4a8fe79186f648212fb270323942e60edd5163b6463c2f0ef22baaf8be7bcd5.json new file mode 100644 index 00000000..58c08cdf --- /dev/null +++ b/.sqlx/query-d4a8fe79186f648212fb270323942e60edd5163b6463c2f0ef22baaf8be7bcd5.json @@ -0,0 +1,101 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n event.id AS eventId,\n event.startTimestamp,\n event.endTimestamp,\n event.name,\n event.locationId,\n event.voluntaryWachhabender,\n event.voluntaryFuehrungsassistent,\n event.amountOfPosten,\n event.clothing,\n event.canceled,\n event.note,\n location.id,\n location.name AS locationName,\n location.areaId AS locationAreaId\n FROM event\n JOIN location ON event.locationId = location.id\n WHERE starttimestamp::date = $1\n AND location.areaId = $2;\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "eventid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "starttimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 2, + "name": "endtimestamp", + "type_info": "Timestamptz" + }, + { + "ordinal": 3, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 4, + "name": "locationid", + "type_info": "Int4" + }, + { + "ordinal": 5, + "name": "voluntarywachhabender", + "type_info": "Bool" + }, + { + "ordinal": 6, + "name": "voluntaryfuehrungsassistent", + "type_info": "Bool" + }, + { + "ordinal": 7, + "name": "amountofposten", + "type_info": "Int2" + }, + { + "ordinal": 8, + "name": "clothing", + "type_info": "Text" + }, + { + "ordinal": 9, + "name": "canceled", + "type_info": "Bool" + }, + { + "ordinal": 10, + "name": "note", + "type_info": "Text" + }, + { + "ordinal": 11, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 12, + "name": "locationname", + "type_info": "Text" + }, + { + "ordinal": 13, + "name": "locationareaid", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Date", + "Int4" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + true, + false, + false, + false + ] + }, + "hash": "d4a8fe79186f648212fb270323942e60edd5163b6463c2f0ef22baaf8be7bcd5" +} diff --git a/.sqlx/query-d556cb1971f386a7997c2e3dbce191cde2d488c55c05edbfe3746208a782d5f6.json b/.sqlx/query-d556cb1971f386a7997c2e3dbce191cde2d488c55c05edbfe3746208a782d5f6.json new file mode 100644 index 00000000..aa5e7a98 --- /dev/null +++ b/.sqlx/query-d556cb1971f386a7997c2e3dbce191cde2d488c55c05edbfe3746208a782d5f6.json @@ -0,0 +1,34 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM location WHERE id = $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "areaid", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "d556cb1971f386a7997c2e3dbce191cde2d488c55c05edbfe3746208a782d5f6" +} diff --git a/.sqlx/query-d79f4733454dfe8df4209fa94b3a3512716812561516c0fd602d8b9d9af4eca6.json b/.sqlx/query-d79f4733454dfe8df4209fa94b3a3512716812561516c0fd602d8b9d9af4eca6.json new file mode 100644 index 00000000..a18acb04 --- /dev/null +++ b/.sqlx/query-d79f4733454dfe8df4209fa94b3a3512716812561516c0fd602d8b9d9af4eca6.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM vehicle WHERE id = $1;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "d79f4733454dfe8df4209fa94b3a3512716812561516c0fd602d8b9d9af4eca6" +} diff --git a/.sqlx/query-ea9f427b5d5a3e3c5f720d6bab2417cb3b42de0a5bf1d8b48b11a6e6275cc8e4.json b/.sqlx/query-ea9f427b5d5a3e3c5f720d6bab2417cb3b42de0a5bf1d8b48b11a6e6275cc8e4.json new file mode 100644 index 00000000..d78e86db --- /dev/null +++ b/.sqlx/query-ea9f427b5d5a3e3c5f720d6bab2417cb3b42de0a5bf1d8b48b11a6e6275cc8e4.json @@ -0,0 +1,34 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT * FROM location WHERE areaId = $1;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "areaid", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "ea9f427b5d5a3e3c5f720d6bab2417cb3b42de0a5bf1d8b48b11a6e6275cc8e4" +} diff --git a/.sqlx/query-ee7abc2204854f5934e683d732493037de6b72d3311f10fa0cf74b7ce7ae11bf.json b/.sqlx/query-ee7abc2204854f5934e683d732493037de6b72d3311f10fa0cf74b7ce7ae11bf.json new file mode 100644 index 00000000..13b9a388 --- /dev/null +++ b/.sqlx/query-ee7abc2204854f5934e683d732493037de6b72d3311f10fa0cf74b7ce7ae11bf.json @@ -0,0 +1,23 @@ +{ + "db_name": "PostgreSQL", + "query": "\n UPDATE event SET startTimestamp = $1, endTimestamp = $2, name = $3, locationId = $4, voluntaryWachhabender = $5, voluntaryFuehrungsassistent = $6, amountOfPosten = $7, clothing = $8, note = $9 WHERE id = $10;\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Timestamptz", + "Timestamptz", + "Text", + "Int4", + "Bool", + "Bool", + "Int2", + "Text", + "Text", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "ee7abc2204854f5934e683d732493037de6b72d3311f10fa0cf74b7ce7ae11bf" +} diff --git a/.sqlx/query-effd0882ab00e5f91a97fa7ee4275775f369e2f8683a6b1aaa87c35984357804.json b/.sqlx/query-effd0882ab00e5f91a97fa7ee4275775f369e2f8683a6b1aaa87c35984357804.json new file mode 100644 index 00000000..ecf59a91 --- /dev/null +++ b/.sqlx/query-effd0882ab00e5f91a97fa7ee4275775f369e2f8683a6b1aaa87c35984357804.json @@ -0,0 +1,30 @@ +{ + "db_name": "PostgreSQL", + "query": "INSERT INTO passwordReset (token, userId, expires) VALUES ($1, $2, $3) RETURNING token, userid;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "token", + "type_info": "Text" + }, + { + "ordinal": 1, + "name": "userid", + "type_info": "Int4" + } + ], + "parameters": { + "Left": [ + "Text", + "Int4", + "Timestamp" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "effd0882ab00e5f91a97fa7ee4275775f369e2f8683a6b1aaa87c35984357804" +} diff --git a/.sqlx/query-f613f4cbd2d89bc061e41f69fe913e69d658242344be7c46ba4f4df90f8b74b3.json b/.sqlx/query-f613f4cbd2d89bc061e41f69fe913e69d658242344be7c46ba4f4df90f8b74b3.json new file mode 100644 index 00000000..7f27f873 --- /dev/null +++ b/.sqlx/query-f613f4cbd2d89bc061e41f69fe913e69d658242344be7c46ba4f4df90f8b74b3.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE location SET name = $1, areaid = $2 WHERE id = $3;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "f613f4cbd2d89bc061e41f69fe913e69d658242344be7c46ba4f4df90f8b74b3" +} diff --git a/.sqlx/query-f94d7fe59a2d4b7d246711a796571367172bce9446b9fb1e7ba057917a98d958.json b/.sqlx/query-f94d7fe59a2d4b7d246711a796571367172bce9446b9fb1e7ba057917a98d958.json new file mode 100644 index 00000000..31c380bf --- /dev/null +++ b/.sqlx/query-f94d7fe59a2d4b7d246711a796571367172bce9446b9fb1e7ba057917a98d958.json @@ -0,0 +1,44 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT location.id AS locationId, location.name, location.areaId, area.id, area.name AS areaName FROM location JOIN area ON location.areaId = area.id;", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "locationid", + "type_info": "Int4" + }, + { + "ordinal": 1, + "name": "name", + "type_info": "Text" + }, + { + "ordinal": 2, + "name": "areaid", + "type_info": "Int4" + }, + { + "ordinal": 3, + "name": "id", + "type_info": "Int4" + }, + { + "ordinal": 4, + "name": "areaname", + "type_info": "Text" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + false, + false, + false, + false, + false + ] + }, + "hash": "f94d7fe59a2d4b7d246711a796571367172bce9446b9fb1e7ba057917a98d958" +} diff --git a/.sqlx/query-fc09093ce791d2d690b2e3f5ff2125a10757b06ff7d60c8843cb7814ea452f13.json b/.sqlx/query-fc09093ce791d2d690b2e3f5ff2125a10757b06ff7d60c8843cb7814ea452f13.json new file mode 100644 index 00000000..29b30b9c --- /dev/null +++ b/.sqlx/query-fc09093ce791d2d690b2e3f5ff2125a10757b06ff7d60c8843cb7814ea452f13.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "DELETE FROM availabillity WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [] + }, + "hash": "fc09093ce791d2d690b2e3f5ff2125a10757b06ff7d60c8843cb7814ea452f13" +} diff --git a/.sqlx/query-fd2f782d28612d969aa20eb35ea8da4bfdba6f059dbd45b510122210807ac5b6.json b/.sqlx/query-fd2f782d28612d969aa20eb35ea8da4bfdba6f059dbd45b510122210807ac5b6.json new file mode 100644 index 00000000..8010fe0a --- /dev/null +++ b/.sqlx/query-fd2f782d28612d969aa20eb35ea8da4bfdba6f059dbd45b510122210807ac5b6.json @@ -0,0 +1,48 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE user_ SET name = $1, email = $2, role = $3, function = $4, areaId = $5 WHERE id = $6;", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + { + "Custom": { + "name": "role", + "kind": { + "Enum": [ + "staff", + "areamanager", + "admin" + ] + } + } + }, + { + "Custom": { + "name": "function[]", + "kind": { + "Array": { + "Custom": { + "name": "function", + "kind": { + "Enum": [ + "posten", + "fuehrungsassistent", + "wachhabender" + ] + } + } + } + } + } + }, + "Int4", + "Int4" + ] + }, + "nullable": [] + }, + "hash": "fd2f782d28612d969aa20eb35ea8da4bfdba6f059dbd45b510122210807ac5b6" +} diff --git a/web/src/endpoints/assignment/delete.rs b/web/src/endpoints/assignment/delete.rs index d140b569..13ecb37e 100644 --- a/web/src/endpoints/assignment/delete.rs +++ b/web/src/endpoints/assignment/delete.rs @@ -73,8 +73,8 @@ mod tests { use crate::{ models::{ - Assignment, AssignmentChangeset, Availability, AvailabilityChangeset, AvailabilityTime, - Event, EventChangeset, Function, Location, Role, User, + Assignment, AssignmentChangeset, Availability, AvailabilityChangeset, Event, + EventChangeset, Function, Location, Role, User, }, utils::test_helper::{test_delete, DbTestContext, RequestConfig}, }; @@ -92,10 +92,10 @@ mod tests { Event::create(pool, new_event).await?; let new_availability = AvailabilityChangeset { - time: AvailabilityTime::WholeDay, + time: (date.and_hms_opt(12, 0, 0).unwrap(), date.and_hms_opt(15, 0, 0).unwrap()), comment: None, }; - Availability::create(pool, 1, date, new_availability).await?; + Availability::create(pool, 1, new_availability).await?; let new_assignment = AssignmentChangeset { function: Function::Posten, diff --git a/web/src/endpoints/assignment/mod.rs b/web/src/endpoints/assignment/mod.rs index b89502ff..34b82821 100644 --- a/web/src/endpoints/assignment/mod.rs +++ b/web/src/endpoints/assignment/mod.rs @@ -2,7 +2,7 @@ use askama::Template; use crate::{ filters, - models::{Availability, AvailabilityTime, AvailabillityAssignmentState, Event}, + models::{Availability, AvailabillityAssignmentState, Event}, }; pub mod delete; diff --git a/web/src/endpoints/availability/get_new.rs b/web/src/endpoints/availability/get_new.rs index db610abf..6e708336 100644 --- a/web/src/endpoints/availability/get_new.rs +++ b/web/src/endpoints/availability/get_new.rs @@ -5,16 +5,12 @@ use sqlx::PgPool; use crate::endpoints::availability::NewOrEditAvailabilityTemplate; use crate::models::{ - find_free_time_slots, only_one_availability_exists_and_is_whole_day, Availability, - AvailabilityTime, User, + find_free_date_time_slots, Availability, User, }; use crate::utils::{ApplicationError, TemplateResponse}; -use crate::{END_OF_DAY, START_OF_DAY}; #[derive(Deserialize)] struct AvailabilityNewQuery { - #[serde(rename(deserialize = "wholeday"))] - whole_day: Option, date: NaiveDate, } @@ -26,29 +22,23 @@ pub async fn get( ) -> Result { let availabilities_from_user = Availability::read_by_user_and_date(pool.get_ref(), user.id, &query.date).await?; - let free_slots = find_free_time_slots(&availabilities_from_user); + let slot_suggestions = find_free_date_time_slots(&availabilities_from_user); let user_can_create_availabillity = availabilities_from_user.is_empty() - || !only_one_availability_exists_and_is_whole_day(&availabilities_from_user) - || !free_slots.is_empty(); + || !slot_suggestions.is_empty(); if !user_can_create_availabillity { return Ok(HttpResponse::BadRequest().finish()); } - let time_selection = if query.whole_day.unwrap_or(true) { - AvailabilityTime::WholeDay - } else { - AvailabilityTime::Temporarily(START_OF_DAY, END_OF_DAY) - }; - let template = NewOrEditAvailabilityTemplate { user: user.into_inner(), date: query.date, - time_selection, id: None, + start: None, + end: None, comment: None, - slot_suggestions: free_slots, + slot_suggestions, }; Ok(template.to_response()?) diff --git a/web/src/endpoints/availability/get_overview.rs b/web/src/endpoints/availability/get_overview.rs index cacda4a9..42d95561 100644 --- a/web/src/endpoints/availability/get_overview.rs +++ b/web/src/endpoints/availability/get_overview.rs @@ -1,14 +1,14 @@ use crate::{ filters, - models::{ - find_free_time_slots, only_one_availability_exists_and_is_whole_day, Assignment, - AvailabilityTime, Function, Vehicle, + models::{find_free_date_time_slots, Assignment, Function, Vehicle}, + utils::{ + event_planning_template::generate_vehicles_assigned_and_available, ApplicationError, + TemplateResponse, }, - utils::{event_planning_template::generate_vehicles_assigned_and_available, ApplicationError, TemplateResponse}, }; use actix_web::{web, HttpResponse, Responder}; -use chrono::{NaiveDate, Utc}; use askama::Template; +use chrono::{NaiveDate, Utc}; use serde::Deserialize; use sqlx::PgPool; @@ -74,8 +74,7 @@ async fn get( //println!("{availabilities_from_user:#?}"); let user_can_create_availabillity = availabilities_from_user.is_empty() - || !only_one_availability_exists_and_is_whole_day(&availabilities_from_user) - || !find_free_time_slots(&availabilities_from_user).is_empty(); + || !find_free_date_time_slots(&availabilities_from_user).is_empty(); //println!("{} || {} || {} = {user_can_create_availabillity}", availabilities_from_user.is_empty(), // !only_one_availability_exists_and_is_whole_day(&availabilities_from_user), @@ -116,24 +115,28 @@ async fn get( .clone() }) .collect(), - fuehrungsassistent.first().map(|fa| availabillities - .iter() - .find(|a| a.id == fa.availabillity_id) - .unwrap() - .user - .as_ref() - .unwrap() - .name - .clone()), - wachhabender.first().map(|wh| availabillities - .iter() - .find(|a| a.id == wh.availabillity_id) - .unwrap() - .user - .as_ref() - .unwrap() - .name - .clone()), + fuehrungsassistent.first().map(|fa| { + availabillities + .iter() + .find(|a| a.id == fa.availabillity_id) + .unwrap() + .user + .as_ref() + .unwrap() + .name + .clone() + }), + wachhabender.first().map(|wh| { + availabillities + .iter() + .find(|a| a.id == wh.availabillity_id) + .unwrap() + .user + .as_ref() + .unwrap() + .name + .clone() + }), assigned_vehicle, )); } diff --git a/web/src/endpoints/availability/get_update.rs b/web/src/endpoints/availability/get_update.rs index e9726765..27950430 100644 --- a/web/src/endpoints/availability/get_update.rs +++ b/web/src/endpoints/availability/get_update.rs @@ -1,26 +1,17 @@ use actix_web::{web, HttpResponse, Responder}; -use serde::Deserialize; use sqlx::PgPool; use crate::{ endpoints::{availability::NewOrEditAvailabilityTemplate, IdPath}, - models::{find_free_time_slots, Availability, AvailabilityTime, User}, + models::{find_free_date_time_slots, Availability, User}, utils::{ApplicationError, TemplateResponse}, - END_OF_DAY, START_OF_DAY, }; -#[derive(Deserialize)] -struct EditAvailabilityQuery { - #[serde(rename(deserialize = "wholeday"))] - whole_day: Option, -} - #[actix_web::get("/availabillity/edit/{id}")] pub async fn get( user: web::ReqData, pool: web::Data, path: web::Path, - query: web::Query, ) -> Result { let Some(availability) = Availability::read_by_id(pool.get_ref(), path.id).await? else { return Ok(HttpResponse::NotFound().finish()); @@ -30,37 +21,23 @@ pub async fn get( return Err(ApplicationError::Unauthorized); } - let suggestions = if let AvailabilityTime::Temporarily(start, end) = availability.time { - let availabilities = - Availability::read_by_user_and_date(pool.get_ref(), user.id, &availability.date) - .await?; + let availabilities = + Availability::read_by_user_and_date(pool.get_ref(), user.id, &availability.start.date()) + .await?; - find_free_time_slots(&availabilities) - .into_iter() - .filter(|(a, b)| *b == start || *a == end) - .collect() - } else { - Vec::new() - }; + let slot_suggestions = find_free_date_time_slots(&availabilities) + .into_iter() + .filter(|(a, b)| *b == availability.start || *a == availability.end) + .collect(); - let time_selection = if let Some(whole_day) = query.whole_day { - if whole_day { - AvailabilityTime::WholeDay - } else { - AvailabilityTime::Temporarily(START_OF_DAY, END_OF_DAY) - } - } else { - availability.time.clone() - }; - - //println!("{:?}", availability.time); let template = NewOrEditAvailabilityTemplate { user: user.into_inner(), - date: availability.date, + date: availability.start.date(), id: Some(path.id), - time_selection, + start: Some(availability.start.time()), + end: Some(availability.end), comment: availability.comment.as_deref(), - slot_suggestions: suggestions, + slot_suggestions }; Ok(template.to_response()?) diff --git a/web/src/endpoints/availability/mod.rs b/web/src/endpoints/availability/mod.rs index e96f1da3..4ad94b8d 100644 --- a/web/src/endpoints/availability/mod.rs +++ b/web/src/endpoints/availability/mod.rs @@ -1,8 +1,7 @@ -use chrono::{NaiveDate, NaiveTime}; use askama::Template; +use chrono::{Days, NaiveDate, NaiveDateTime, NaiveTime}; -use crate::filters; -use crate::models::{Availability, AvailabilityChangeset, AvailabilityTime, Role, User}; +use crate::models::{Availability, AvailabilityChangeset, Role, User}; pub mod delete; pub mod get_new; @@ -17,9 +16,10 @@ struct NewOrEditAvailabilityTemplate<'a> { user: User, date: NaiveDate, id: Option, - time_selection: AvailabilityTime, + start: Option, + end: Option, comment: Option<&'a str>, - slot_suggestions: Vec<(NaiveTime, NaiveTime)>, + slot_suggestions: Vec<(NaiveDateTime, NaiveDateTime)>, } fn find_adjacend_availability<'a>( @@ -27,20 +27,10 @@ fn find_adjacend_availability<'a>( availability_id_to_be_updated: Option, existing_availabilities: &'a [Availability], ) -> Option<&'a Availability> { - let AvailabilityTime::Temporarily(changeset_start, changeset_end) = changeset.time else { - return None; - }; - - for a in existing_availabilities + let existing_availability = existing_availabilities .iter() .filter(|a| availability_id_to_be_updated.is_none_or(|id| a.id != id)) - { - if let AvailabilityTime::Temporarily(start, end) = a.time { - if start == changeset_end || end == changeset_start { - return Some(a); - } - } - } + .find(|a| a.start == changeset.time.1 || a.end == changeset.time.0); - None + return existing_availability; } diff --git a/web/src/endpoints/availability/post_new.rs b/web/src/endpoints/availability/post_new.rs index f5a8660f..d8712880 100644 --- a/web/src/endpoints/availability/post_new.rs +++ b/web/src/endpoints/availability/post_new.rs @@ -1,20 +1,20 @@ use actix_web::{http::header::LOCATION, web, HttpResponse, Responder}; -use chrono::{NaiveDate, NaiveTime}; +use chrono::{NaiveDate, NaiveDateTime, NaiveTime}; use garde::Validate; use serde::Deserialize; use sqlx::PgPool; use crate::{ endpoints::availability::find_adjacend_availability, - models::{Availability, AvailabilityChangeset, AvailabilityContext, AvailabilityTime, User}, + models::{Availability, AvailabilityChangeset, AvailabilityContext, User}, utils::{self, ApplicationError}, }; #[derive(Deserialize)] pub struct AvailabillityForm { pub date: NaiveDate, - pub from: Option, - pub till: Option, + pub from: NaiveTime, + pub till: NaiveDateTime, pub comment: Option, } @@ -30,14 +30,8 @@ pub async fn post( existing_availabilities: existing_availabilities.clone(), }; - let time = if form.from.is_some() && form.till.is_some() { - AvailabilityTime::Temporarily(form.from.unwrap(), form.till.unwrap()) - } else { - AvailabilityTime::WholeDay - }; - let mut changeset = AvailabilityChangeset { - time, + time: (form.date.and_time(form.from), form.till), comment: form.comment.clone(), }; @@ -46,20 +40,19 @@ pub async fn post( }; if let Some(a) = find_adjacend_availability(&changeset, None, &existing_availabilities) { - let (changeset_start, changeset_end) = changeset.time.time_tuple_opt().unwrap(); - let (adjacent_start, adjacent_end) = changeset.time.time_tuple_opt().unwrap(); + let (changeset_start, changeset_end) = changeset.time; - if adjacent_end == changeset_start { - changeset.time = AvailabilityTime::Temporarily(adjacent_start, changeset_end); + if a.end == changeset_start { + changeset.time.0 = a.start; } - if adjacent_start == changeset_end { - changeset.time = AvailabilityTime::Temporarily(changeset_start, adjacent_end); + if a.start == changeset_end { + changeset.time.1 = a.end; } Availability::update(pool.get_ref(), a.id, changeset).await?; } else { - Availability::create(pool.get_ref(), user.id, form.date, changeset).await?; + Availability::create(pool.get_ref(), user.id, changeset).await?; } let url = utils::get_return_url_for_date(&form.date); diff --git a/web/src/endpoints/availability/post_update.rs b/web/src/endpoints/availability/post_update.rs index c34de2bc..1af3d408 100644 --- a/web/src/endpoints/availability/post_update.rs +++ b/web/src/endpoints/availability/post_update.rs @@ -8,7 +8,7 @@ use crate::{ availability::{find_adjacend_availability, post_new::AvailabillityForm}, IdPath, }, - models::{Availability, AvailabilityChangeset, AvailabilityContext, AvailabilityTime, User}, + models::{Availability, AvailabilityChangeset, AvailabilityContext, User}, utils::{self, ApplicationError}, END_OF_DAY, }; @@ -29,7 +29,7 @@ pub async fn post( } let existing_availabilities: Vec = - Availability::read_by_user_and_date(pool.get_ref(), user.id, &availability.date) + Availability::read_by_user_and_date(pool.get_ref(), user.id, &availability.start.date()) .await? .into_iter() .filter(|a| a.id != availability.id) @@ -39,19 +39,8 @@ pub async fn post( existing_availabilities: existing_availabilities.clone(), }; - let time = if form.from.is_some() && form.till.is_some() { - let end_time = if form.till.unwrap() == NaiveTime::from_hms_opt(23, 59, 0).unwrap() { - END_OF_DAY - } else { - form.till.unwrap() - }; - AvailabilityTime::Temporarily(form.from.unwrap(), end_time) - } else { - AvailabilityTime::WholeDay - }; - let mut changeset = AvailabilityChangeset { - time, + time: (form.date.and_time(form.from), form.till), comment: form.comment.clone(), }; @@ -62,15 +51,14 @@ pub async fn post( if let Some(a) = find_adjacend_availability(&changeset, Some(availability.id), &existing_availabilities) { - let (changeset_start, changeset_end) = changeset.time.time_tuple_opt().unwrap(); - let (adjacent_start, adjacent_end) = changeset.time.time_tuple_opt().unwrap(); + let (changeset_start, changeset_end) = changeset.time; - if adjacent_end == changeset_start { - changeset.time = AvailabilityTime::Temporarily(adjacent_start, changeset_end); + if a.end == changeset_start { + changeset.time.0 = a.start; } - if adjacent_start == changeset_end { - changeset.time = AvailabilityTime::Temporarily(changeset_start, adjacent_end); + if a.start == changeset_end { + changeset.time.1 = a.end; } Availability::update(pool.get_ref(), a.id, changeset).await?; diff --git a/web/src/endpoints/events/get_plan.rs b/web/src/endpoints/events/get_plan.rs index ac12004c..a45bba15 100644 --- a/web/src/endpoints/events/get_plan.rs +++ b/web/src/endpoints/events/get_plan.rs @@ -5,7 +5,7 @@ use sqlx::PgPool; use crate::{ endpoints::IdPath, filters, - models::{Availability, AvailabilityTime, AvailabillityAssignmentState, Event, Role, User, Vehicle}, + models::{Availability, AvailabillityAssignmentState, Event, Role, User, Vehicle}, utils::{ event_planning_template::{ generate_availabillity_assignment_list, generate_status_whether_staff_is_required, diff --git a/web/src/endpoints/events/post_edit.rs b/web/src/endpoints/events/post_edit.rs index c57076cd..8a5689db 100644 --- a/web/src/endpoints/events/post_edit.rs +++ b/web/src/endpoints/events/post_edit.rs @@ -7,11 +7,10 @@ use sqlx::PgPool; use crate::{ endpoints::IdPath, models::{ - Assignment, AssignmentChangeset, Availability, AvailabilityTime, Event, EventChangeset, + Assignment, AssignmentChangeset, Availability, Event, EventChangeset, EventContext, Function, Location, Role, User, }, utils::{self, ApplicationError}, - END_OF_DAY, START_OF_DAY, }; #[derive(Deserialize)] @@ -88,21 +87,17 @@ pub async fn post( .await?; if all_assignments.len() == 1 { - if let AvailabilityTime::Temporarily(start, end) = availability.time { - if start > common_time.0 { - common_time.0 = start; + // TODO: refactor + if availability.start.time() > common_time.0 { + common_time.0 = availability.start.time(); } - if end < common_time.1 { - common_time.1 = end; + if availability.end.time() < common_time.1 { + common_time.1 = availability.end.time(); } - } } else { - let mut slots = if let AvailabilityTime::Temporarily(start, end) = availability.time { - vec![(start, end)] - } else { - vec![(START_OF_DAY, END_OF_DAY)] - }; + // TODO: refactor + let mut slots = vec![(availability.start.time(), availability.end.time())]; for a in all_assignments .iter() .filter(|x| x.event_id != assignment.event_id) diff --git a/web/src/endpoints/export/get_availability_data.rs b/web/src/endpoints/export/get_availability_data.rs index 88df8499..d2b10ec4 100644 --- a/web/src/endpoints/export/get_availability_data.rs +++ b/web/src/endpoints/export/get_availability_data.rs @@ -2,15 +2,14 @@ use actix_web::{ http::header::{ContentDisposition, ContentType, CONTENT_DISPOSITION}, web, HttpResponse, Responder, }; -use chrono::{Months, NaiveDate, NaiveTime, Utc}; +use chrono::{Months, NaiveDate, NaiveDateTime, Utc}; use quick_xml::se::Serializer; use serde::{Deserialize, Serialize}; use sqlx::PgPool; use crate::{ - models::{Area, Availability, AvailabilityTime, UserFunction, Role, User}, + models::{Area, Availability, Role, User, UserFunction}, utils::ApplicationError, - END_OF_DAY, START_OF_DAY, }; #[derive(Deserialize)] @@ -34,12 +33,10 @@ struct ExportAvailabillity { name: String, area: String, function: UserFunction, - date: NaiveDate, - whole_day: bool, - start_time: NaiveTime, - end_time: NaiveTime, + start: NaiveDateTime, + end: NaiveDateTime, assigned: bool, - comment: String + comment: String, } #[actix_web::get("/export/availabilitydata")] @@ -71,24 +68,14 @@ pub async fn get( let export_availabillities = availabillities .into_iter() - .map(|a| { - let (start_time, end_time) = if let AvailabilityTime::Temporarily(start, end) = a.time { - (start, end) - } else { - (START_OF_DAY, END_OF_DAY) - }; - - ExportAvailabillity { - name: a.user.as_ref().unwrap().name.clone(), - area: a.user.as_ref().unwrap().area.as_ref().unwrap().name.clone(), - function: a.user.unwrap().function, - date: a.date, - whole_day: a.time == AvailabilityTime::WholeDay, - start_time, - end_time, - assigned: false, - comment: a.comment.unwrap_or(String::new()) - } + .map(|a| ExportAvailabillity { + name: a.user.as_ref().unwrap().name.clone(), + area: a.user.as_ref().unwrap().area.as_ref().unwrap().name.clone(), + function: a.user.unwrap().function, + start: a.start, + end: a.end, + assigned: false, + comment: a.comment.unwrap_or(String::new()), }) .collect(); diff --git a/web/src/models/assignment_changeset.rs b/web/src/models/assignment_changeset.rs index c5d62f96..93899c4f 100644 --- a/web/src/models/assignment_changeset.rs +++ b/web/src/models/assignment_changeset.rs @@ -2,7 +2,7 @@ use chrono::NaiveTime; use garde::Validate; use super::{ - start_time_lies_before_end_time, Assignment, Availability, AvailabilityTime, Event, Function, UserFunction, + start_time_lies_before_end_time, Assignment, Availability, Event, Function, UserFunction, }; #[derive(Validate)] @@ -35,13 +35,13 @@ fn available_time_fits( value: &(NaiveTime, NaiveTime), context: &AssignmentContext, ) -> garde::Result { - if let AvailabilityTime::Temporarily(start, end) = context.availabillity.time { - if value.0 < start || value.1 > end { - return Err(garde::Error::new( - "time not made available can't be assigned", - )); - } - } + // if let AvailabilityTime::Temporarily(start, end) = context.availabillity.time { + // if value.0 < start || value.1 > end { + // return Err(garde::Error::new( + // "time not made available can't be assigned", + // )); + // } + // } Ok(()) } diff --git a/web/src/models/availability_changeset.rs b/web/src/models/availability_changeset.rs index bfe08808..4fb57d6a 100644 --- a/web/src/models/availability_changeset.rs +++ b/web/src/models/availability_changeset.rs @@ -1,9 +1,9 @@ -use chrono::NaiveTime; +use chrono::NaiveDateTime; use garde::Validate; use crate::{END_OF_DAY, START_OF_DAY}; -use super::{start_time_lies_before_end_time, Availability, AvailabilityTime}; +use super::{start_date_time_lies_before_end_time, Availability}; #[derive(Validate)] #[garde(allow_unvalidated)] @@ -11,9 +11,9 @@ use super::{start_time_lies_before_end_time, Availability, AvailabilityTime}; pub struct AvailabilityChangeset { #[garde( custom(time_is_not_already_made_available), - custom(temporarily_start_time_before_end_time) + custom(start_date_time_lies_before_end_time) )] - pub time: AvailabilityTime, + pub time: (NaiveDateTime, NaiveDateTime), pub comment: Option, } @@ -21,60 +21,45 @@ pub struct AvailabilityContext { pub existing_availabilities: Vec, } -pub fn only_one_availability_exists_and_is_whole_day(a: &[Availability]) -> bool { - a.len() == 1 && a[0].time == AvailabilityTime::WholeDay -} - fn time_is_not_already_made_available( - value: &AvailabilityTime, + value: &(NaiveDateTime, NaiveDateTime), context: &AvailabilityContext, ) -> garde::Result { - if let AvailabilityTime::Temporarily(_, _) = value { - if only_one_availability_exists_and_is_whole_day(&context.existing_availabilities) { - return Err(garde::Error::new("cant create a availability while an other availability for the whole day is already present")); - } + if context.existing_availabilities.is_empty() { + return Ok(()); + } - if !context.existing_availabilities.is_empty() && find_free_time_slots(&context.existing_availabilities).is_empty() { - return Err(garde::Error::new( - "cant create a availability as every time slot is already filled", - )); - } - } else if !context.existing_availabilities.is_empty() { - return Err(garde::Error::new("cant create a availability for the whole day while an other availability is already present")); + let free_slots = find_free_date_time_slots(&context.existing_availabilities); + + if free_slots.is_empty() { + return Err(garde::Error::new( + "cant create a availability as every time slot is already filled", + )); + } + + let free_block_found_for_start = free_slots.iter().any(|s| s.0 <= value.0 && s.1 >= value.0); + let free_block_found_for_end = free_slots.iter().any(|s| s.0 <= value.1 && s.1 >= value.1); + + if !free_block_found_for_start || !free_block_found_for_end { + return Err(garde::Error::new( + "cant create availability as there exists already a availability with the desired time", + )); } Ok(()) } -fn temporarily_start_time_before_end_time( - value: &AvailabilityTime, - context: &AvailabilityContext, -) -> garde::Result { - if let AvailabilityTime::Temporarily(start, end) = value { - return start_time_lies_before_end_time(&(*start, *end), context); - } - - Ok(()) -} - -pub fn find_free_time_slots(availabilities: &[Availability]) -> Vec<(NaiveTime, NaiveTime)> { - let mut times = Vec::new(); - - for a in availabilities { - if let AvailabilityTime::Temporarily(start, end) = a.time { - times.push((start, end)); - } - } - - if times.is_empty() { +pub fn find_free_date_time_slots( + availabilities: &[Availability], +) -> Vec<(NaiveDateTime, NaiveDateTime)> { + if availabilities.is_empty() { return Vec::new(); } - println!("zeiten {times:?}"); + let mut times: Vec<(NaiveDateTime, NaiveDateTime)> = + availabilities.iter().map(|a| (a.start, a.end)).collect(); times.sort(); - //println!("zeiten sort {times:?}"); - let mut changed = true; while changed { changed = false; @@ -94,12 +79,17 @@ pub fn find_free_time_slots(availabilities: &[Availability]) -> Vec<(NaiveTime, //println!("zeiten unified {times:?}"); + let date = times.first().unwrap().0.date(); + let start_of_day = date.and_time(START_OF_DAY); + // for now only calculate suggestions for the same day (if not add one day for end_of_Day:) + let end_of_day = date.and_time(END_OF_DAY); + // now times contains unified list of existing availabilities -> now calculate the "inverse" let mut available_slots = Vec::new(); let start = times.first().unwrap(); - if start.0 != START_OF_DAY { - available_slots.push((START_OF_DAY, start.0)); + if start.0 != start_of_day { + available_slots.push((start_of_day, start.0)); } let mut iterator = times.iter().peekable(); @@ -110,10 +100,9 @@ pub fn find_free_time_slots(availabilities: &[Availability]) -> Vec<(NaiveTime, } let end = times.last().unwrap(); - if end.1 != END_OF_DAY { - available_slots.push((end.1, END_OF_DAY)); + if end.1 != end_of_day { + available_slots.push((end.1, end_of_day)); } - //println!("available {available_slots:?}"); available_slots } diff --git a/web/src/models/availabillity.rs b/web/src/models/availabillity.rs index 008c2571..81f5d930 100644 --- a/web/src/models/availabillity.rs +++ b/web/src/models/availabillity.rs @@ -1,8 +1,6 @@ -use chrono::{Local, NaiveDate, NaiveTime}; +use chrono::{Local, NaiveDate, NaiveDateTime, NaiveTime}; use sqlx::{query, PgPool}; -use crate::{END_OF_DAY, START_OF_DAY}; - use super::{Area, AvailabilityChangeset, Result, Role, User, UserFunction}; #[derive(Clone, Debug)] @@ -10,59 +8,26 @@ pub struct Availability { pub id: i32, pub user_id: i32, pub user: Option, - pub date: NaiveDate, - pub time: AvailabilityTime, + pub start: NaiveDateTime, + pub end: NaiveDateTime, pub comment: Option, } -#[derive(Clone, Debug, PartialEq)] -pub enum AvailabilityTime { - WholeDay, - Temporarily(NaiveTime, NaiveTime), -} - -impl AvailabilityTime { - pub fn time_tuple(&self) -> (NaiveTime, NaiveTime) { - match self { - AvailabilityTime::WholeDay => (START_OF_DAY, END_OF_DAY), - AvailabilityTime::Temporarily(start, end) => (*start, *end), - } - } - - pub fn time_tuple_opt(&self) -> Option<(NaiveTime, NaiveTime)> { - match self { - AvailabilityTime::WholeDay => None, - AvailabilityTime::Temporarily(start, end) => Some((*start, *end)), - } - } -} - impl Availability { // TODO: fix db name pub async fn create( pool: &PgPool, user_id: i32, - date: NaiveDate, changeset: AvailabilityChangeset, ) -> Result<()> { - let (start, end) = if let AvailabilityTime::Temporarily(s, e) = changeset.time { - (Some(s), Some(e)) - } else { - (None, None) - }; - - // TODO: refactor - let date1 = Local::now(); - let date2 = Local::now(); - query!( r#" INSERT INTO availabillity (userId, startTimestamp, endTimestamp, comment) VALUES ($1, $2, $3, $4); "#, user_id, - date1, - date2, + changeset.time.0.and_utc(), + changeset.time.1.and_utc(), changeset.comment ) .execute(pool) @@ -125,12 +90,8 @@ impl Availability { last_login: r.lastlogin, receive_notifications: r.receivenotifications, }), - date: r.starttimestamp.date_naive(), - // TODO: refactor - time: AvailabilityTime::Temporarily(r.starttimestamp.time(), r.endtimestamp.time()), - // (Some(start), Some(end)) => AvailabilityTime::Temporarily(start, end), - // (_, _) => AvailabilityTime::WholeDay, - // }, + start: r.starttimestamp.naive_utc(), + end: r.endtimestamp.naive_utc(), comment: r.comment.clone(), }) .collect(); @@ -141,13 +102,9 @@ impl Availability { pub async fn read_by_date_time_area_including_user( pool: &PgPool, date: NaiveDate, - time: (NaiveTime, NaiveTime), + time: (NaiveDateTime, NaiveDateTime), area_id: i32, ) -> Result> { - // TODO: refactor - let date1 = Local::now(); - let date2 = Local::now(); - let records = query!( r##" SELECT @@ -174,8 +131,8 @@ impl Availability { "##, date, area_id, - date1, - date2 + time.0.and_utc(), + time.1.and_utc() ) .fetch_all(pool) .await?; @@ -200,12 +157,8 @@ impl Availability { last_login: r.lastlogin, receive_notifications: r.receivenotifications, }), - // TODO: refactor - date: r.starttimestamp.date_naive(), - time: AvailabilityTime::Temporarily(r.starttimestamp.time(), r.endtimestamp.time()), - // (Some(start), Some(end)) => AvailabilityTime::Temporarily(start, end), - // (_, _) => AvailabilityTime::WholeDay, - // }, + start: r.starttimestamp.naive_utc(), + end: r.endtimestamp.naive_utc(), comment: r.comment.clone(), }) .collect(); @@ -259,12 +212,8 @@ impl Availability { last_login: r.lastlogin, receive_notifications: r.receivenotifications, }), - // TODO: refactor - date: r.starttimestamp.date_naive(), - time: AvailabilityTime::Temporarily(r.starttimestamp.time(), r.endtimestamp.time()), - // (Some(start), Some(end)) => AvailabilityTime::Temporarily(start, end), - // (_, _) => AvailabilityTime::WholeDay, - // }, + start: r.starttimestamp.naive_utc(), + end: r.endtimestamp.naive_utc(), comment: r.comment.clone(), }); @@ -280,15 +229,8 @@ impl Availability { id: record.id, user_id: record.userid, user: None, - // TODO: refactor - date: record.starttimestamp.date_naive(), - time: AvailabilityTime::Temporarily( - record.starttimestamp.time(), - record.endtimestamp.time(), - ), - // (Some(start), Some(end)) => AvailabilityTime::Temporarily(start, end), - // (_, _) => AvailabilityTime::WholeDay, - // }, + start: record.starttimestamp.naive_utc(), + end: record.endtimestamp.naive_utc(), comment: record.comment.clone(), }); @@ -356,12 +298,8 @@ impl Availability { last_login: r.lastlogin, receive_notifications: r.receivenotifications, }), - // TODO: refactor - date: r.starttimestamp.date_naive(), - time: AvailabilityTime::Temporarily(r.starttimestamp.time(), r.endtimestamp.time()), - // (Some(start), Some(end)) => AvailabilityTime::Temporarily(start, end), - // (_, _) => AvailabilityTime::WholeDay, - // }, + start: r.starttimestamp.naive_utc(), + end: r.endtimestamp.naive_utc(), comment: r.comment.clone(), }) .collect(); @@ -399,12 +337,8 @@ impl Availability { id: r.id, user_id: r.userid, user: None, - // TODO: refactor - date: r.starttimestamp.date_naive(), - time: AvailabilityTime::Temporarily(r.starttimestamp.time(), r.endtimestamp.time()), - // (Some(start), Some(end)) => AvailabilityTime::Temporarily(start, end), - // (_, _) => AvailabilityTime::WholeDay, - // }, + start: r.starttimestamp.naive_utc(), + end: r.endtimestamp.naive_utc(), comment: r.comment.clone(), }) .collect(); @@ -413,20 +347,10 @@ impl Availability { } pub async fn update(pool: &PgPool, id: i32, changeset: AvailabilityChangeset) -> Result<()> { - let (start, end) = if let AvailabilityTime::Temporarily(s, e) = changeset.time { - (Some(s), Some(e)) - } else { - (None, None) - }; - - // TODO: refactor - let date1 = Local::now(); - let date2 = Local::now(); - query!( "UPDATE availabillity SET startTimestamp = $1, endTimestamp = $2, comment = $3 WHERE id = $4", - date1, - date2, + changeset.time.0.and_utc(), + changeset.time.1.and_utc(), changeset.comment, id ) diff --git a/web/src/models/mod.rs b/web/src/models/mod.rs index 283c0d0f..7d51bacb 100644 --- a/web/src/models/mod.rs +++ b/web/src/models/mod.rs @@ -21,12 +21,11 @@ pub use area::Area; pub use assignement::Assignment; pub use assignment_changeset::{AssignmentChangeset, AssignmentContext}; pub use availability_changeset::{ - find_free_time_slots, only_one_availability_exists_and_is_whole_day, AvailabilityChangeset, - AvailabilityContext, + find_free_date_time_slots, AvailabilityChangeset, AvailabilityContext, }; -pub use availabillity::{Availability, AvailabilityTime}; +pub use availabillity::Availability; pub use availabillity_assignment_state::AvailabillityAssignmentState; -use chrono::NaiveTime; +use chrono::{NaiveDateTime, NaiveTime}; pub use event::Event; pub use event_changeset::{EventChangeset, EventContext}; pub use function::Function; @@ -52,3 +51,14 @@ fn start_time_lies_before_end_time( Ok(()) } + +fn start_date_time_lies_before_end_time( + value: &(NaiveDateTime, NaiveDateTime), + _context: &T, +) -> garde::Result { + if value.0 >= value.1 { + return Err(garde::Error::new("endtime can't lie before starttime")); + } + + Ok(()) +} diff --git a/web/templates/availability/new_or_edit.html b/web/templates/availability/new_or_edit.html index 2c0ddc9a..94d190d1 100644 --- a/web/templates/availability/new_or_edit.html +++ b/web/templates/availability/new_or_edit.html @@ -12,57 +12,29 @@ {% endif %} - {% let whole_day_selected = time_selection == AvailabilityTime::WholeDay %} + {% let time = "%R" %}
- +
-
- - -
-
-
-
- -
-
- -
-
- {% let times = time_selection.time_tuple() -%} -
- + {% if slot_suggestions.len() > 0 %}

noch mögliche Zeiträume:

{% for (s, e) in slot_suggestions %} - {{ s.format("%R") }} - {{ e.format("%R") }} + {{ s.format(time) }} - {{ e.format(time) }} {% endfor %}
{% endif %}
- +
diff --git a/web/templates/events/plan_personal_table.html b/web/templates/events/plan_personal_table.html index eaedb9eb..6902653f 100644 --- a/web/templates/events/plan_personal_table.html +++ b/web/templates/events/plan_personal_table.html @@ -27,12 +27,7 @@ {{ u.function|show_tree|safe }} - {% match availabillity.time %} - {% when AvailabilityTime::Temporarily(start, end) %} - {{ start.format("%R") }} bis {{ end.format("%R") }} - {% when _ %} - ganztägig - {% endmatch %} + {{ availabillity.start.format("%R") }} bis {{ availabillity.end.format("%d.%m.%Y %R") }} {{ availabillity.comment.as_deref().unwrap_or("") }} diff --git a/web/templates/index.html b/web/templates/index.html index 701f40c6..374735d3 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -220,12 +220,7 @@ {{ u.function|show_tree|safe }} - {% match availabillity.time %} - {% when AvailabilityTime::Temporarily(start, end) %} - {{ start.format("%R") }} bis {{ end.format("%R") }} - {% when _ %} - ganztägig - {% endmatch %} + {{ availabillity.start.format("%R") }} bis {{ availabillity.end.format("%d.%m.%Y %R") }} {{ availabillity.comment.as_deref().unwrap_or("") }}