From e7f9bf8778e9638e98d6b7486cba863bb124db50 Mon Sep 17 00:00:00 2001 From: Manuel Cillero Date: Sun, 24 Apr 2022 18:44:37 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1ade=20funciones=20de=20acceso=20b=C3=A1s?= =?UTF-8?q?ico=20a=20base=20de=20datos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pagetop-node/src/lib.rs | 2 +- ...m20220316_000001_create_table_node_type.rs | 2 +- .../m20220316_000002_create_table_node.rs | 2 +- ...0220316_000003_create_table_node_access.rs | 2 +- ...20316_000004_create_table_node_revision.rs | 2 +- pagetop-user/src/lib.rs | 2 +- .../m20220312_000001_create_table_role.rs | 88 ++++++++++--------- ...312_000002_create_table_role_permission.rs | 2 +- .../m20220312_000003_create_table_user.rs | 2 +- ...m20220312_000004_create_table_user_role.rs | 2 +- pagetop/STARTER.bin.Cargo.toml | 2 - pagetop/STARTER.lib.Cargo.toml | 2 - pagetop/src/app/db.rs | 44 ++++++++-- pagetop/src/db.rs | 14 +-- pagetop/src/module/all.rs | 2 +- pagetop/src/module/definition.rs | 2 +- pagetop/src/prelude.rs | 2 +- 17 files changed, 99 insertions(+), 75 deletions(-) diff --git a/pagetop-node/src/lib.rs b/pagetop-node/src/lib.rs index 0f5c4662..a05800ec 100644 --- a/pagetop-node/src/lib.rs +++ b/pagetop-node/src/lib.rs @@ -24,7 +24,7 @@ impl ModuleTrait for NodeModule { cfg.route("/node", app::web::get().to(node)); } - fn migrations(&self) -> Vec> { + fn migrations(&self) -> Vec> { vec![ boxed_migration!(m20220316_000001_create_table_node_type), boxed_migration!(m20220316_000002_create_table_node), diff --git a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs index 5180a785..6ce9abe1 100644 --- a/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs +++ b/pagetop-node/src/migration/m20220316_000001_create_table_node_type.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; /// Stores information about all defined {node} types. #[derive(Iden)] diff --git a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs index fe65fc2c..927c92f9 100644 --- a/pagetop-node/src/migration/m20220316_000002_create_table_node.rs +++ b/pagetop-node/src/migration/m20220316_000002_create_table_node.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; /// The base table for nodes. #[derive(Iden)] diff --git a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs index a179240f..2b55da75 100644 --- a/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs +++ b/pagetop-node/src/migration/m20220316_000003_create_table_node_access.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; // Identifies which realm/grant pairs a user must possess in order to view, update, or delete specific nodes. #[derive(Iden)] diff --git a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs index 4dc4e1b6..5162407c 100644 --- a/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs +++ b/pagetop-node/src/migration/m20220316_000004_create_table_node_revision.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; // Stores information about each saved version of a {node}. #[derive(Iden)] diff --git a/pagetop-user/src/lib.rs b/pagetop-user/src/lib.rs index a55ea4e8..d5d96f37 100644 --- a/pagetop-user/src/lib.rs +++ b/pagetop-user/src/lib.rs @@ -23,7 +23,7 @@ impl ModuleTrait for UserModule { cfg.route("/user/login", app::web::get().to(login)); } - fn migrations(&self) -> Vec> { + fn migrations(&self) -> Vec> { vec![ boxed_migration!(m20220312_000001_create_table_role), boxed_migration!(m20220312_000002_create_table_role_permission), diff --git a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs index af453f74..1028bb5a 100644 --- a/pagetop-user/src/migration/m20220312_000001_create_table_role.rs +++ b/pagetop-user/src/migration/m20220312_000001_create_table_role.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; #[derive(Iden)] enum Role { Table, @@ -12,49 +12,55 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - // Store user roles. - Table::create() - .table(Role::Table) - .if_not_exists() - // Primary Key: Unique role ID. - .col(ColumnDef::new(Role::Rid) - .unsigned() - .not_null() - .auto_increment() - .primary_key() - ) - // Unique role name. - .col(ColumnDef::new(Role::Name) - .string_len(64) - .not_null() - .unique_key() - ) - // The weight of this role in listings and the user interface. - .col(ColumnDef::new(Role::Weight) - .integer() - .not_null() - .default(0) - ) - // INDEXES. - .index(Index::create() - .name("name-weight") - .col(Role::Name) - .col(Role::Weight) - ) - .to_owned() - ) - .await + manager.create_table( + // Store user roles. + Table::create() + .table(Role::Table) + .if_not_exists() + // Primary Key: Unique role ID. + .col(ColumnDef::new(Role::Rid) + .unsigned() + .not_null() + .auto_increment() + .primary_key() + ) + // Unique role name. + .col(ColumnDef::new(Role::Name) + .string_len(64) + .not_null() + .unique_key() + ) + // The weight of this role in listings and the user interface. + .col(ColumnDef::new(Role::Weight) + .integer() + .not_null() + .default(0) + ) + // INDEXES. + .index(Index::create() + .name("name-weight") + .col(Role::Name) + .col(Role::Weight) + ) + .to_owned() + ) + .await?; + + app::db::exec::(Query::insert() + .into_table(Role::Table) + .columns(vec![Role::Name]) + .values_panic(vec!["anonymous".into()]) + .values_panic(vec!["authenticated".into()]) + ) + .await.map(|_| ()) } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop() - .table(Role::Table) - .to_owned() - ) - .await + manager.drop_table(Table::drop() + .table(Role::Table) + .to_owned() + ) + .await } } diff --git a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs index 0148af5f..3c997872 100644 --- a/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs +++ b/pagetop-user/src/migration/m20220312_000002_create_table_role_permission.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; #[derive(Iden)] enum RolePermission { Table, diff --git a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs index bf151f50..2ef84287 100644 --- a/pagetop-user/src/migration/m20220312_000003_create_table_user.rs +++ b/pagetop-user/src/migration/m20220312_000003_create_table_user.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; #[derive(Iden)] enum User { Table, diff --git a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs index f92d019b..373f7e53 100644 --- a/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs +++ b/pagetop-user/src/migration/m20220312_000004_create_table_user_role.rs @@ -1,4 +1,4 @@ -use pagetop::db::migration::*; +use pagetop::prelude::*; #[derive(Iden)] enum UserRole { Table, diff --git a/pagetop/STARTER.bin.Cargo.toml b/pagetop/STARTER.bin.Cargo.toml index f9c6560f..f3169356 100644 --- a/pagetop/STARTER.bin.Cargo.toml +++ b/pagetop/STARTER.bin.Cargo.toml @@ -21,7 +21,5 @@ default-features = false actix-web = "3.3.3" # Si se usa la macro html!: maud = { version = "0.23.0" } -# Si se usa base de datos: -sea-orm = { version = "0.7.1" } # Si se requiere serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/STARTER.lib.Cargo.toml b/pagetop/STARTER.lib.Cargo.toml index 7a74f96e..c268b8cc 100644 --- a/pagetop/STARTER.lib.Cargo.toml +++ b/pagetop/STARTER.lib.Cargo.toml @@ -10,7 +10,5 @@ edition = "2021" pagetop = { path = "../pagetop" } # Si se usa la macro html!: maud = { version = "0.23.0" } -# Si se usa base de datos: -sea-orm = { version = "0.7.1" } # Si se requiere serialización de estructuras de datos: serde = { version = "1.0", features = ["derive"] } diff --git a/pagetop/src/app/db.rs b/pagetop/src/app/db.rs index 9d196970..aa3f0045 100644 --- a/pagetop/src/app/db.rs +++ b/pagetop/src/app/db.rs @@ -1,10 +1,11 @@ -use crate::{Lazy, db, run_now, trace}; +use crate::{Lazy, run_now, trace}; use crate::config::SETTINGS; +use crate::db::*; -use sea_orm::{ConnectOptions, Database}; +use sea_orm::{ConnectionTrait, ConnectOptions, Database, DatabaseBackend, Statement}; use tracing_unwrap::ResultExt; -pub static DBCONN: Lazy = Lazy::new(|| { +pub static DBCONN: Lazy = Lazy::new(|| { trace::info!( "Connecting to database \"{}\" using a pool of {} connections", &SETTINGS.database.db_name, @@ -13,7 +14,7 @@ pub static DBCONN: Lazy = Lazy::new(|| { let db_uri = match SETTINGS.database.db_type.as_str() { "mysql" | "postgres" => { - let mut tmp_uri = db::DbUri::parse(format!( + let mut tmp_uri = DbUri::parse(format!( "{}://{}/{}", &SETTINGS.database.db_type, &SETTINGS.database.db_host, @@ -33,7 +34,7 @@ pub static DBCONN: Lazy = Lazy::new(|| { } tmp_uri }, - "sqlite" => db::DbUri::parse( + "sqlite" => DbUri::parse( format!("{}://{}", &SETTINGS.database.db_type, &SETTINGS.database.db_name @@ -43,7 +44,7 @@ pub static DBCONN: Lazy = Lazy::new(|| { "Unrecognized database type \"{}\"", &SETTINGS.database.db_type ); - db::DbUri::parse("").unwrap() + DbUri::parse("").unwrap() } }; @@ -55,3 +56,34 @@ pub static DBCONN: Lazy = Lazy::new(|| { }) ).expect_or_log("Failed to connect to database") }); + +static DBBACKEND: Lazy = Lazy::new(|| { + DBCONN.get_database_backend() +}); + + +pub async fn query(stmt: &mut Q) -> Result, DbErr> { + DBCONN.query_all(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + } + )).await +} + +pub async fn exec(stmt: &mut Q) -> Result, DbErr> { + DBCONN.query_one(Statement::from_string( + *DBBACKEND, + match *DBBACKEND { + DatabaseBackend::MySql => stmt.to_string(MysqlQueryBuilder), + DatabaseBackend::Postgres => stmt.to_string(PostgresQueryBuilder), + DatabaseBackend::Sqlite => stmt.to_string(SqliteQueryBuilder), + } + )).await +} + +pub async fn exec_raw(stmt: String) -> Result { + DBCONN.execute(Statement::from_string(*DBBACKEND, stmt)).await +} diff --git a/pagetop/src/db.rs b/pagetop/src/db.rs index 550f8f66..4b35bd59 100644 --- a/pagetop/src/db.rs +++ b/pagetop/src/db.rs @@ -1,18 +1,8 @@ pub use url::Url as DbUri; -pub use sea_orm::{ - DbErr, - DatabaseConnection as DbConn, -}; +pub use sea_orm::{DatabaseConnection as DbConn, ExecResult, QueryResult}; -pub mod entity { - pub use sea_orm::entity::prelude::*; -} - -pub mod migration { - pub use sea_schema::migration::prelude::*; - pub use crate::module_name; -} +pub use sea_schema::migration::prelude::*; #[macro_export] macro_rules! boxed_migration { diff --git a/pagetop/src/module/all.rs b/pagetop/src/module/all.rs index c95583e9..6380917a 100644 --- a/pagetop/src/module/all.rs +++ b/pagetop/src/module/all.rs @@ -1,5 +1,5 @@ use crate::{Lazy, app, run_now, trace}; -use crate::db::migration::*; +use crate::db::*; use super::ModuleTrait; use std::sync::RwLock; diff --git a/pagetop/src/module/definition.rs b/pagetop/src/module/definition.rs index b01f9801..a3affa2f 100644 --- a/pagetop/src/module/definition.rs +++ b/pagetop/src/module/definition.rs @@ -23,7 +23,7 @@ pub trait ModuleTrait: Send + Sync { #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] #[allow(unused_variables)] - fn migrations(&self) -> Vec> { + fn migrations(&self) -> Vec> { vec![] } } diff --git a/pagetop/src/prelude.rs b/pagetop/src/prelude.rs index 55c9681e..4cbd9a7d 100644 --- a/pagetop/src/prelude.rs +++ b/pagetop/src/prelude.rs @@ -13,7 +13,7 @@ pub use crate::trace; pub use crate::localize; #[cfg(any(feature = "mysql", feature = "postgres", feature = "sqlite"))] -pub use crate::{db, boxed_migration}; +pub use crate::{db, db::*, boxed_migration}; pub use crate::html::*; pub use crate::theme::*;