From efaf2bda5ae0bc259fdb9cac4e3b3f40606f695b Mon Sep 17 00:00:00 2001
From: Philippe Loctaux
Date: Sun, 7 May 2023 12:26:29 +0200
Subject: [PATCH] roles: sql, crate, struct, id, rocket id, list page
---
Cargo.lock | 12 ++
.../migrations/20230506170211_roles.down.sql | 1 +
.../migrations/20230506170211_roles.up.sql | 7 +
crates/database/queries/roles/get_all.sql | 7 +
crates/database/queries/roles/insert.sql | 2 +
crates/database/sqlx-data.json | 46 +++++++
crates/database/src/tables.rs | 2 +
crates/database/src/tables/roles.rs | 34 +++++
crates/ezidam/Cargo.toml | 1 +
crates/ezidam/src/error/conversion.rs | 6 +
crates/ezidam/src/icons.rs | 4 +-
crates/ezidam/src/id.rs | 22 ++-
crates/ezidam/src/menu/items/admin.rs | 9 ++
crates/ezidam/src/page.rs | 5 +
crates/ezidam/src/routes/admin.rs | 12 ++
crates/ezidam/src/routes/admin/roles.rs | 25 ++++
.../pages/admin/roles/list.html.tera | 127 ++++++++++++++++++
crates/id/src/lib.rs | 2 +
crates/id/src/role.rs | 63 +++++++++
crates/roles/Cargo.toml | 11 ++
crates/roles/src/database.rs | 26 ++++
crates/roles/src/error.rs | 8 ++
crates/roles/src/lib.rs | 32 +++++
23 files changed, 462 insertions(+), 2 deletions(-)
create mode 100644 crates/database/migrations/20230506170211_roles.down.sql
create mode 100644 crates/database/migrations/20230506170211_roles.up.sql
create mode 100644 crates/database/queries/roles/get_all.sql
create mode 100644 crates/database/queries/roles/insert.sql
create mode 100644 crates/database/src/tables/roles.rs
create mode 100644 crates/ezidam/src/routes/admin/roles.rs
create mode 100644 crates/ezidam/templates/pages/admin/roles/list.html.tera
create mode 100644 crates/id/src/role.rs
create mode 100644 crates/roles/Cargo.toml
create mode 100644 crates/roles/src/database.rs
create mode 100644 crates/roles/src/error.rs
create mode 100644 crates/roles/src/lib.rs
diff --git a/Cargo.lock b/Cargo.lock
index 4f2df05..5cbedca 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -828,6 +828,7 @@ dependencies = [
"rocket_cors",
"rocket_db_pools",
"rocket_dyn_templates",
+ "roles",
"settings",
"totp",
"url",
@@ -2686,6 +2687,17 @@ dependencies = [
"uncased",
]
+[[package]]
+name = "roles"
+version = "0.0.0"
+dependencies = [
+ "chrono",
+ "database",
+ "id",
+ "serde",
+ "thiserror",
+]
+
[[package]]
name = "rsa"
version = "0.7.2"
diff --git a/crates/database/migrations/20230506170211_roles.down.sql b/crates/database/migrations/20230506170211_roles.down.sql
new file mode 100644
index 0000000..289fe8b
--- /dev/null
+++ b/crates/database/migrations/20230506170211_roles.down.sql
@@ -0,0 +1 @@
+drop table if exists roles;
diff --git a/crates/database/migrations/20230506170211_roles.up.sql b/crates/database/migrations/20230506170211_roles.up.sql
new file mode 100644
index 0000000..0deba39
--- /dev/null
+++ b/crates/database/migrations/20230506170211_roles.up.sql
@@ -0,0 +1,7 @@
+create table if not exists roles
+(
+ name TEXT not null primary key,
+ label TEXT not null,
+ created_at TEXT not null default CURRENT_TIMESTAMP,
+ is_archived INTEGER not null default 0
+);
diff --git a/crates/database/queries/roles/get_all.sql b/crates/database/queries/roles/get_all.sql
new file mode 100644
index 0000000..3bad7fb
--- /dev/null
+++ b/crates/database/queries/roles/get_all.sql
@@ -0,0 +1,7 @@
+select name,
+ label,
+ created_at as "created_at: DateTime",
+ is_archived as "is_archived: bool"
+from roles
+
+order by created_at desc
diff --git a/crates/database/queries/roles/insert.sql b/crates/database/queries/roles/insert.sql
new file mode 100644
index 0000000..3bac2ae
--- /dev/null
+++ b/crates/database/queries/roles/insert.sql
@@ -0,0 +1,2 @@
+insert into roles (name, label)
+values (?, ?)
diff --git a/crates/database/sqlx-data.json b/crates/database/sqlx-data.json
index 7c415d0..66e82fb 100644
--- a/crates/database/sqlx-data.json
+++ b/crates/database/sqlx-data.json
@@ -286,6 +286,16 @@
},
"query": "update refresh_tokens\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere token is ?"
},
+ "44cc12d7659e618fcb44a82697d60da940bdab3c87690ee42569ae3da1a8e791": {
+ "describe": {
+ "columns": [],
+ "nullable": [],
+ "parameters": {
+ "Right": 2
+ }
+ },
+ "query": "insert into roles (name, label)\nvalues (?, ?)\n"
+ },
"520fe30e21f6b6c4d9a47c457675eebd144cf020e9230d154e9e4d0c8d6e01ca": {
"describe": {
"columns": [],
@@ -474,6 +484,42 @@
},
"query": "update totp_login_requests\n\nset used_at = CURRENT_TIMESTAMP\n\nwhere user is ?\n and used_at is null"
},
+ "5e148a43d9f64c73296b2b70deef07d2c863a93fff693aec1b47378c44bf77de": {
+ "describe": {
+ "columns": [
+ {
+ "name": "name",
+ "ordinal": 0,
+ "type_info": "Text"
+ },
+ {
+ "name": "label",
+ "ordinal": 1,
+ "type_info": "Text"
+ },
+ {
+ "name": "created_at: DateTime",
+ "ordinal": 2,
+ "type_info": "Text"
+ },
+ {
+ "name": "is_archived: bool",
+ "ordinal": 3,
+ "type_info": "Int64"
+ }
+ ],
+ "nullable": [
+ false,
+ false,
+ false,
+ false
+ ],
+ "parameters": {
+ "Right": 0
+ }
+ },
+ "query": "select name,\n label,\n created_at as \"created_at: DateTime\",\n is_archived as \"is_archived: bool\"\nfrom roles\n\norder by created_at desc\n"
+ },
"5f946348ad62389fab3c97a1563d1592cbc5180abbba6d5abd44326bf0862669": {
"describe": {
"columns": [
diff --git a/crates/database/src/tables.rs b/crates/database/src/tables.rs
index 2f8c2e6..eadb26a 100644
--- a/crates/database/src/tables.rs
+++ b/crates/database/src/tables.rs
@@ -2,6 +2,7 @@ mod apps;
mod authorization_codes;
mod keys;
mod refresh_tokens;
+mod roles;
mod settings;
mod totp_login_requests;
mod users;
@@ -10,6 +11,7 @@ pub use apps::Apps;
pub use authorization_codes::AuthorizationCodes;
pub use keys::Keys;
pub use refresh_tokens::RefreshTokens;
+pub use roles::Roles;
pub use settings::Settings;
pub use totp_login_requests::TotpLoginRequests;
pub use users::Users;
diff --git a/crates/database/src/tables/roles.rs b/crates/database/src/tables/roles.rs
new file mode 100644
index 0000000..162b9f4
--- /dev/null
+++ b/crates/database/src/tables/roles.rs
@@ -0,0 +1,34 @@
+use crate::error::{handle_error, Error};
+use sqlx::sqlite::SqliteQueryResult;
+use sqlx::types::chrono::{DateTime, Utc};
+use sqlx::{FromRow, SqliteExecutor};
+
+#[derive(FromRow)]
+pub struct Roles {
+ pub name: String,
+ pub label: String,
+ pub created_at: DateTime,
+ pub is_archived: bool,
+}
+
+impl Roles {
+ pub async fn insert(
+ conn: impl SqliteExecutor<'_>,
+ name: &str,
+ label: &str,
+ ) -> Result