feat: adjust readme and add new seeder script
This commit is contained in:
@@ -6,14 +6,14 @@
|
|||||||
|
|
||||||
This repository serves as the **monorepo** for all backend services of IMPHNEN. It encompasses several main services:
|
This repository serves as the **monorepo** for all backend services of IMPHNEN. It encompasses several main services:
|
||||||
|
|
||||||
1. **Core Service** - Provides fundamental functionalities and shared resources for other services.
|
1. **IMPHNEN-Backend** - Provides fundamental functionalities and shared resources for other services.
|
||||||
2. **IAM Service** - Handles identity and access management across IMPHNEN applications.
|
2. **IMPHNEN-IAM** - Handles identity and access management across IMPHNEN applications.
|
||||||
3. **CMS Service** - Supports the cms services by IMPHNEN [Landing Page website](https://imphnen.dev/).
|
3. **IMPHNEN-CMS** - Supports the cms services by IMPHNEN [Landing Page website](https://imphnen.dev/).
|
||||||
4. **Gacha Service** - Supports the gacha services by IMPHNEN [Gacha website](https://gacha.imphnen.dev/).
|
4. **IMPHNEN-Gacha** - Supports the gacha services by IMPHNEN [Gacha website](https://gacha.imphnen.dev/).
|
||||||
5. **Dimentorin Service** - Supports the mentoring services by IMPHNEN [Dimentorin website](https://dimentorin.imphnen.dev/).
|
5. **IMPHNEN-Dimentorin** - Supports the mentoring services by IMPHNEN [Dimentorin website](https://dimentorin.imphnen.dev/).
|
||||||
6. **Gateway Service** - Acts as the API gateway, routing requests to appropriate services.
|
6. **IMPHNEN-Gateway** - Acts as the API gateway, routing requests to appropriate services.
|
||||||
|
|
||||||
## How to Install
|
## IMPORTANT How to Install
|
||||||
|
|
||||||
1. **Clone the repository**:
|
1. **Clone the repository**:
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ This repository serves as the **monorepo** for all backend services of IMPHNEN.
|
|||||||
if you use unix based system
|
if you use unix based system
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sh apply-env.sh
|
source ./apply-env.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
- Modify the `.env` files with your specific configuration settings.
|
- Modify the `.env` files with your specific configuration settings.
|
||||||
@@ -49,7 +49,15 @@ This repository serves as the **monorepo** for all backend services of IMPHNEN.
|
|||||||
Ensure you have [Rust](https://www.rust-lang.org/) installed. Then, run:
|
Ensure you have [Rust](https://www.rust-lang.org/) installed. Then, run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cargo build
|
cargo check
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Run the seeders**:
|
||||||
|
|
||||||
|
to run the seeders, run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo run --bin seeder
|
||||||
```
|
```
|
||||||
|
|
||||||
## How to Run
|
## How to Run
|
||||||
@@ -64,10 +72,16 @@ To run the services in development mode:
|
|||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
2. **Run the desired service**. For example, to run the Core Service:
|
2. **Run using cargo run**. For example, to run the Core Service:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
cargo run -p imphnen-core-service --bin api
|
cargo run --bin api
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Run using cargo watch**. For example, to run the Core Service:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cargo watch -x "run --bin api"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Production
|
### Production
|
||||||
@@ -83,7 +97,7 @@ For production deployment:
|
|||||||
2. **Run the Docker container**:
|
2. **Run the Docker container**:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker run -d --env-file .env -p 8080:8080 imphnen-backend-service
|
docker run -d --env-file .env -p 3000:3000 imphnen-backend-service
|
||||||
```
|
```
|
||||||
|
|
||||||
Adjust the port and environment variables as needed.
|
Adjust the port and environment variables as needed.
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use imphnen_iam::PermissionsEnum;
|
||||||
use imphnen_utils::{get_iso_date, Env};
|
use imphnen_utils::{get_iso_date, Env};
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
@@ -15,131 +16,50 @@ async fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
db.use_ns(env.surrealdb_namespace)
|
db.use_ns(env.surrealdb_namespace)
|
||||||
.use_db(env.surrealdb_dbname)
|
.use_db(env.surrealdb_dbname)
|
||||||
.await?;
|
.await?;
|
||||||
let permissions = vec![
|
|
||||||
(
|
for permission in [
|
||||||
"023e2dfe-93c3-4008-94a8-b5dff403f73b",
|
PermissionsEnum::ReadListUsers,
|
||||||
"Create Users",
|
PermissionsEnum::ReadDetailUsers,
|
||||||
Some("2025-01-29T06:08:23.838311+00"),
|
PermissionsEnum::CreateUsers,
|
||||||
Some("2025-01-29T06:08:23.838312+00"),
|
PermissionsEnum::DeleteUsers,
|
||||||
),
|
PermissionsEnum::UpdateUsers,
|
||||||
(
|
PermissionsEnum::ActivateUsers,
|
||||||
"0269ed71-0ae0-4c43-ad29-e3d861d8f9a0",
|
PermissionsEnum::ReadListRoles,
|
||||||
"Create Permissions",
|
PermissionsEnum::ReadDetailRoles,
|
||||||
Some("2025-01-29T05:11:01.265+00"),
|
PermissionsEnum::CreateRoles,
|
||||||
Some("2025-01-29T05:11:01.265001+00"),
|
PermissionsEnum::DeleteRoles,
|
||||||
),
|
PermissionsEnum::UpdateRoles,
|
||||||
(
|
PermissionsEnum::ReadListPermissions,
|
||||||
"299cb4d5-6556-4cc9-b6c1-32e6d31e0f9b",
|
PermissionsEnum::ReadDetailPermissions,
|
||||||
"Update Permissions",
|
PermissionsEnum::CreatePermissions,
|
||||||
Some("2025-01-29T05:11:01.265+00"),
|
PermissionsEnum::DeletePermissions,
|
||||||
Some("2025-01-29T05:11:01.265001+00"),
|
PermissionsEnum::UpdatePermissions,
|
||||||
),
|
PermissionsEnum::CreateGachaClaims,
|
||||||
(
|
PermissionsEnum::ReadDetailGachaClaims,
|
||||||
"319ee593-ff0a-4f29-bbaf-9feb3174a3a2",
|
PermissionsEnum::ReadListGachaItems,
|
||||||
"Create Roles",
|
PermissionsEnum::ReadDetailGachaItems,
|
||||||
Some("2025-01-29T05:11:01.265+00"),
|
PermissionsEnum::CreateGachaItems,
|
||||||
Some("2025-01-29T05:11:01.265001+00"),
|
PermissionsEnum::DeleteGachaItems,
|
||||||
),
|
PermissionsEnum::UpdateGachaItems,
|
||||||
(
|
PermissionsEnum::ReadDetailGachaRolls,
|
||||||
"319ee593-ff0a-4f29-bbaf-9feb3174a3a6",
|
PermissionsEnum::CreateGachaRolls,
|
||||||
"Read Detail Users",
|
PermissionsEnum::ExecuteGachaRolls,
|
||||||
Some("2025-01-29T05:11:01.265+00"),
|
] {
|
||||||
Some("2025-01-29T05:11:01.265001+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"35b0d992-65c8-4b62-b030-e6e0320e4048",
|
|
||||||
"Delete Roles",
|
|
||||||
Some("2025-01-29T05:34:40.621554+00"),
|
|
||||||
Some("2025-01-29T05:34:40.621555+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"4da8b434-89f9-4d91-85ae-eebd63cdbeda",
|
|
||||||
"Update Activate Users",
|
|
||||||
Some("2025-02-01T12:38:09.741726+00"),
|
|
||||||
Some("2025-02-01T12:38:09.741727+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"73888d18-b3e9-4f62-95a5-ba2c0d69fccb",
|
|
||||||
"Read Detail Roles",
|
|
||||||
Some("2025-01-29T05:13:06.445925+00"),
|
|
||||||
Some("2025-01-29T10:31:46.408564+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"7c15e31d-36e2-49f9-97db-138c03fb0cf6",
|
|
||||||
"Read List Users",
|
|
||||||
Some("2025-01-28T15:02:41.772931+00"),
|
|
||||||
Some("2025-01-28T15:02:41.772933+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"7d4b1379-4960-416a-b045-98cd82c0cac9",
|
|
||||||
"Read Detail Sessions",
|
|
||||||
Some("2025-02-24T16:52:26.886664+00"),
|
|
||||||
Some("2025-02-24T16:52:26.886673+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"8195eeb8-e64f-4172-aa57-596492c84a72",
|
|
||||||
"Read List Permissions",
|
|
||||||
Some("2025-01-28T15:05:28.6299+00"),
|
|
||||||
Some("2025-01-28T15:05:28.629901+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"81eba91d-b8ab-44b9-bbfe-4e6da2f98952",
|
|
||||||
"Read List Tests",
|
|
||||||
Some("2025-02-24T16:52:27.179542+00"),
|
|
||||||
Some("2025-02-24T16:52:27.179551+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"9164ca6e-c7e3-4238-a15f-f36ab9577e7e",
|
|
||||||
"Read List Roles",
|
|
||||||
Some("2025-01-29T05:34:40.621554+00"),
|
|
||||||
Some("2025-01-29T05:34:40.621555+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"96df0689-2ae9-4894-bf00-837c19415e5c",
|
|
||||||
"Delete Users",
|
|
||||||
Some("2025-02-02T06:52:05.195565+00"),
|
|
||||||
Some("2025-02-02T06:52:05.195565+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"98b3dc4c-0124-461f-afcd-166637c5e6e8",
|
|
||||||
"Update Users",
|
|
||||||
Some("2025-01-29T05:34:40.621554+00"),
|
|
||||||
Some("2025-01-29T05:34:40.621555+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"a00d5608-4c48-4542-845c-dfe004687022",
|
|
||||||
"Update Roles",
|
|
||||||
Some("2025-01-29T05:34:40.621554+00"),
|
|
||||||
Some("2025-01-29T05:34:40.621555+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"b2dc3928-86ba-4c59-a03d-0b57d5183ebc",
|
|
||||||
"Delete Permissions",
|
|
||||||
Some("2025-01-29T05:14:22.511084+00"),
|
|
||||||
Some("2025-01-29T05:14:22.511085+00"),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
"dad435cf-042c-41bd-a946-cea61ed2ffbc",
|
|
||||||
"Read Detail Permissions",
|
|
||||||
Some("2025-01-28T15:07:10.990214+00"),
|
|
||||||
Some("2025-01-28T15:07:10.990214+00"),
|
|
||||||
),
|
|
||||||
];
|
|
||||||
for (id, name, _created_at, _updated_at) in permissions {
|
|
||||||
db.query("CREATE type::thing('app_permissions', $id) CONTENT $data")
|
db.query("CREATE type::thing('app_permissions', $id) CONTENT $data")
|
||||||
.bind(("id", id))
|
.bind(("id", permission.id()))
|
||||||
.bind((
|
.bind((
|
||||||
"data",
|
"data",
|
||||||
json!({
|
json!({
|
||||||
"name": name,
|
"name": permission.to_string(),
|
||||||
"is_deleted": false,
|
"is_deleted": false,
|
||||||
"created_at": get_iso_date(),
|
"created_at": get_iso_date(),
|
||||||
"updated_at": get_iso_date()
|
"updated_at": get_iso_date()
|
||||||
}),
|
}),
|
||||||
))
|
))
|
||||||
.await?;
|
.await?;
|
||||||
println!("✅ Inserted: {}", name);
|
println!("✅ Inserted: {}", permission.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("✅ All Permissions seeded");
|
println!("✅ All Permissions seeded");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use imphnen_iam::{get_iso_date, make_thing, Env};
|
use imphnen_iam::{get_iso_date, make_thing, Env, PermissionsEnum};
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use surrealdb::{engine::remote::ws::Ws, opt::auth::Root, Surreal};
|
use surrealdb::{engine::remote::ws::Ws, opt::auth::Root, Surreal};
|
||||||
|
|
||||||
@@ -6,52 +6,51 @@ use surrealdb::{engine::remote::ws::Ws, opt::auth::Root, Surreal};
|
|||||||
async fn main() -> Result<(), Box<dyn Error>> {
|
async fn main() -> Result<(), Box<dyn Error>> {
|
||||||
let env = Env::new();
|
let env = Env::new();
|
||||||
let db = Surreal::new::<Ws>(env.surrealdb_url).await?;
|
let db = Surreal::new::<Ws>(env.surrealdb_url).await?;
|
||||||
|
|
||||||
db.signin(Root {
|
db.signin(Root {
|
||||||
username: &env.surrealdb_username,
|
username: &env.surrealdb_username,
|
||||||
password: &env.surrealdb_password,
|
password: &env.surrealdb_password,
|
||||||
})
|
})
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
db.use_ns(env.surrealdb_namespace)
|
db.use_ns(env.surrealdb_namespace)
|
||||||
.use_db(env.surrealdb_dbname)
|
.use_db(env.surrealdb_dbname)
|
||||||
.await?;
|
.await?;
|
||||||
|
let permission_refs_admin: Vec<_> = [
|
||||||
let admin_permissions = vec![
|
PermissionsEnum::ReadListUsers,
|
||||||
"023e2dfe-93c3-4008-94a8-b5dff403f73b",
|
PermissionsEnum::ReadDetailUsers,
|
||||||
"0269ed71-0ae0-4c43-ad29-e3d861d8f9a0",
|
PermissionsEnum::CreateUsers,
|
||||||
"299cb4d5-6556-4cc9-b6c1-32e6d31e0f9b",
|
PermissionsEnum::DeleteUsers,
|
||||||
"319ee593-ff0a-4f29-bbaf-9feb3174a3a2",
|
PermissionsEnum::UpdateUsers,
|
||||||
"319ee593-ff0a-4f29-bbaf-9feb3174a3a6",
|
PermissionsEnum::ActivateUsers,
|
||||||
"35b0d992-65c8-4b62-b030-e6e0320e4048",
|
PermissionsEnum::ReadListRoles,
|
||||||
"4da8b434-89f9-4d91-85ae-eebd63cdbeda",
|
PermissionsEnum::ReadDetailRoles,
|
||||||
"73888d18-b3e9-4f62-95a5-ba2c0d69fccb",
|
PermissionsEnum::CreateRoles,
|
||||||
"7c15e31d-36e2-49f9-97db-138c03fb0cf6",
|
PermissionsEnum::DeleteRoles,
|
||||||
"7d4b1379-4960-416a-b045-98cd82c0cac9",
|
PermissionsEnum::UpdateRoles,
|
||||||
"8195eeb8-e64f-4172-aa57-596492c84a72",
|
PermissionsEnum::ReadListPermissions,
|
||||||
"81eba91d-b8ab-44b9-bbfe-4e6da2f98952",
|
PermissionsEnum::ReadDetailPermissions,
|
||||||
"9164ca6e-c7e3-4238-a15f-f36ab9577e7e",
|
PermissionsEnum::CreatePermissions,
|
||||||
"96df0689-2ae9-4894-bf00-837c19415e5c",
|
PermissionsEnum::DeletePermissions,
|
||||||
"98b3dc4c-0124-461f-afcd-166637c5e6e8",
|
PermissionsEnum::UpdatePermissions,
|
||||||
"a00d5608-4c48-4542-845c-dfe004687022",
|
PermissionsEnum::CreateGachaClaims,
|
||||||
"b2dc3928-86ba-4c59-a03d-0b57d5183ebc",
|
PermissionsEnum::ReadDetailGachaClaims,
|
||||||
"dad435cf-042c-41bd-a946-cea61ed2ffbc",
|
PermissionsEnum::ReadListGachaItems,
|
||||||
];
|
PermissionsEnum::ReadDetailGachaItems,
|
||||||
|
PermissionsEnum::CreateGachaItems,
|
||||||
let admin_role_id = "f6b03f25-e416-4893-ac88-caaa690afb07";
|
PermissionsEnum::DeleteGachaItems,
|
||||||
|
PermissionsEnum::UpdateGachaItems,
|
||||||
let permission_refs_admin: Vec<_> = admin_permissions
|
PermissionsEnum::ReadDetailGachaRolls,
|
||||||
.into_iter()
|
PermissionsEnum::CreateGachaRolls,
|
||||||
.map(|perm_id| make_thing("app_permissions", perm_id))
|
PermissionsEnum::ExecuteGachaRolls,
|
||||||
|
]
|
||||||
|
.iter()
|
||||||
|
.map(|perm| make_thing("app_permissions", perm.id()))
|
||||||
.collect();
|
.collect();
|
||||||
|
let admin_role_id = "f6b03f25-e416-4893-ac88-caaa690afb07";
|
||||||
db.query("UPDATE type::thing('app_roles', $role_id) SET permissions = $permissions, updated_at = $updated_at WHERE is_deleted = false")
|
db.query("UPDATE type::thing('app_roles', $role_id) SET permissions = $permissions, updated_at = $updated_at WHERE is_deleted = false")
|
||||||
.bind(("role_id", admin_role_id))
|
.bind(("role_id", admin_role_id))
|
||||||
.bind(("permissions", permission_refs_admin))
|
.bind(("permissions", permission_refs_admin))
|
||||||
.bind(("updated_at", get_iso_date()))
|
.bind(("updated_at", get_iso_date()))
|
||||||
.await?;
|
.await?;
|
||||||
|
println!("✅ All permissions successfully added to Admin role");
|
||||||
println!("✅ All permissions successfully added to each role");
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
use std::error::Error;
|
||||||
|
use std::process::Command;
|
||||||
|
|
||||||
|
fn run_seed(bin: &str) -> Result<(), Box<dyn Error>> {
|
||||||
|
println!("🔧 Seeding: {bin}");
|
||||||
|
let status = Command::new("cargo").args(["run", "--bin", bin]).status()?;
|
||||||
|
|
||||||
|
if !status.success() {
|
||||||
|
Err(format!("❌ Failed to run seed: {bin}").into())
|
||||||
|
} else {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
println!("🚀 Running all seeders...\n");
|
||||||
|
|
||||||
|
run_seed("seed_permissions")?;
|
||||||
|
run_seed("seed_roles")?;
|
||||||
|
run_seed("seed_roles_permissions")?;
|
||||||
|
run_seed("seed_users")?;
|
||||||
|
|
||||||
|
println!("\n✅ All seeding completed successfully.");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
@@ -63,3 +63,44 @@ impl fmt::Display for PermissionsEnum {
|
|||||||
write!(f, "{}", permission_str)
|
write!(f, "{}", permission_str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PermissionsEnum {
|
||||||
|
pub fn id(&self) -> &'static str {
|
||||||
|
match self {
|
||||||
|
PermissionsEnum::ReadListUsers => "7c15e31d-36e2-49f9-97db-138c03fb0cf6",
|
||||||
|
PermissionsEnum::ReadDetailUsers => "319ee593-ff0a-4f29-bbaf-9feb3174a3a6",
|
||||||
|
PermissionsEnum::CreateUsers => "023e2dfe-93c3-4008-94a8-b5dff403f73b",
|
||||||
|
PermissionsEnum::DeleteUsers => "96df0689-2ae9-4894-bf00-837c19415e5c",
|
||||||
|
PermissionsEnum::UpdateUsers => "98b3dc4c-0124-461f-afcd-166637c5e6e8",
|
||||||
|
PermissionsEnum::ActivateUsers => "4da8b434-89f9-4d91-85ae-eebd63cdbeda",
|
||||||
|
PermissionsEnum::ReadListRoles => "9164ca6e-c7e3-4238-a15f-f36ab9577e7e",
|
||||||
|
PermissionsEnum::ReadDetailRoles => "73888d18-b3e9-4f62-95a5-ba2c0d69fccb",
|
||||||
|
PermissionsEnum::CreateRoles => "319ee593-ff0a-4f29-bbaf-9feb3174a3a2",
|
||||||
|
PermissionsEnum::DeleteRoles => "35b0d992-65c8-4b62-b030-e6e0320e4048",
|
||||||
|
PermissionsEnum::UpdateRoles => "a00d5608-4c48-4542-845c-dfe004687022",
|
||||||
|
PermissionsEnum::ReadListPermissions => "8195eeb8-e64f-4172-aa57-596492c84a72",
|
||||||
|
PermissionsEnum::ReadDetailPermissions => {
|
||||||
|
"dad435cf-042c-41bd-a946-cea61ed2ffbc"
|
||||||
|
}
|
||||||
|
PermissionsEnum::CreatePermissions => "0269ed71-0ae0-4c43-ad29-e3d861d8f9a0",
|
||||||
|
PermissionsEnum::DeletePermissions => "b2dc3928-86ba-4c59-a03d-0b57d5183ebc",
|
||||||
|
PermissionsEnum::UpdatePermissions => "299cb4d5-6556-4cc9-b6c1-32e6d31e0f9b",
|
||||||
|
PermissionsEnum::CreateGachaClaims => "f41d53ce-4f88-4bb6-b9b4-5e3a8c38d962",
|
||||||
|
PermissionsEnum::ReadDetailGachaClaims => {
|
||||||
|
"c1c3d6c2-19fb-4b70-b58c-c19f2e8cfc79"
|
||||||
|
}
|
||||||
|
PermissionsEnum::ReadListGachaItems => "fa6eb842-0a61-40c2-9c24-b226ad975037",
|
||||||
|
PermissionsEnum::ReadDetailGachaItems => {
|
||||||
|
"9c7857d7-b5ae-4688-923d-ef5572e9bc8b"
|
||||||
|
}
|
||||||
|
PermissionsEnum::CreateGachaItems => "cf063be1-4d71-489e-b9fb-1c08c65f396c",
|
||||||
|
PermissionsEnum::DeleteGachaItems => "46f8c6cf-ea0c-4c90-860c-69e2e65f7eb1",
|
||||||
|
PermissionsEnum::UpdateGachaItems => "2d0cf4ae-56ae-4714-a12e-655cfc3d9eb2",
|
||||||
|
PermissionsEnum::ReadDetailGachaRolls => {
|
||||||
|
"53d6483a-04cd-4667-8792-2d0cc8e2d343"
|
||||||
|
}
|
||||||
|
PermissionsEnum::CreateGachaRolls => "18e36c63-fcb7-4877-b911-c5aa611e878f",
|
||||||
|
PermissionsEnum::ExecuteGachaRolls => "14c6a1cd-5c63-4643-89b5-b1a5f9920cc0",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ pub struct UsersListQueryDto {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl UsersListQueryDto {
|
impl UsersListQueryDto {
|
||||||
pub fn from(&self) -> UsersListItemDto {
|
pub fn from(self) -> UsersListItemDto {
|
||||||
UsersListItemDto {
|
UsersListItemDto {
|
||||||
id: self.id.id.to_raw(),
|
id: self.id.id.to_raw(),
|
||||||
role: self.role.name.clone(),
|
role: self.role.name.clone(),
|
||||||
|
|||||||
@@ -36,8 +36,7 @@ impl<'a> UsersRepository<'a> {
|
|||||||
meta: MetaRequestDto,
|
meta: MetaRequestDto,
|
||||||
) -> Result<ResponseListSuccessDto<Vec<UsersListItemDto>>> {
|
) -> Result<ResponseListSuccessDto<Vec<UsersListItemDto>>> {
|
||||||
let db = &self.state.surrealdb_ws;
|
let db = &self.state.surrealdb_ws;
|
||||||
|
let result = query_list_with_meta::<UsersListQueryDto>(
|
||||||
let raw_result = query_list_with_meta::<UsersListQueryDto>(
|
|
||||||
db,
|
db,
|
||||||
&ResourceEnum::Users.to_string(),
|
&ResourceEnum::Users.to_string(),
|
||||||
&meta,
|
&meta,
|
||||||
@@ -48,16 +47,14 @@ impl<'a> UsersRepository<'a> {
|
|||||||
Some(vec!["role", "role.permissions"]),
|
Some(vec!["role", "role.permissions"]),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
let data = result
|
||||||
let data = raw_result
|
|
||||||
.data
|
.data
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|schema| UsersListQueryDto::from(&schema))
|
.map(UsersListQueryDto::from)
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
Ok(ResponseListSuccessDto {
|
Ok(ResponseListSuccessDto {
|
||||||
data,
|
data,
|
||||||
meta: raw_result.meta,
|
meta: result.meta,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,52 +63,46 @@ impl<'a> UsersRepository<'a> {
|
|||||||
email: String,
|
email: String,
|
||||||
) -> Result<UsersDetailQueryDto> {
|
) -> Result<UsersDetailQueryDto> {
|
||||||
let db = &self.state.surrealdb_ws;
|
let db = &self.state.surrealdb_ws;
|
||||||
|
|
||||||
let builder = DetailQueryBuilder::new(ResourceEnum::Users.to_string())
|
let builder = DetailQueryBuilder::new(ResourceEnum::Users.to_string())
|
||||||
.with_where("email")
|
.with_where("email")
|
||||||
.where_value(email.clone())
|
.where_value(email.clone())
|
||||||
.with_select_fields(vec!["*"])
|
.with_select_fields(vec!["*"])
|
||||||
.with_fetch("role")
|
.with_fetch("role")
|
||||||
.with_fetch("role.permissions");
|
.with_fetch("role.permissions");
|
||||||
|
|
||||||
let sql = builder.build();
|
let sql = builder.build();
|
||||||
|
|
||||||
let user_opt: Option<UsersDetailQueryDto> =
|
let user_opt: Option<UsersDetailQueryDto> =
|
||||||
builder.apply_bindings(db.query(sql)).await?.take(0)?;
|
builder.apply_bindings(db.query(sql)).await?.take(0)?;
|
||||||
|
|
||||||
let Some(user) = user_opt else {
|
let Some(user) = user_opt else {
|
||||||
bail!("User not found");
|
bail!("User not found");
|
||||||
};
|
};
|
||||||
|
if user.is_deleted {
|
||||||
|
bail!("User not found");
|
||||||
|
}
|
||||||
if user.role.is_deleted {
|
if user.role.is_deleted {
|
||||||
bail!("User not found");
|
bail!("User not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(UsersDetailQueryDto::from(&user))
|
Ok(UsersDetailQueryDto::from(&user))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn query_user_by_id(&self, id: String) -> Result<UsersDetailQueryDto> {
|
pub async fn query_user_by_id(&self, id: String) -> Result<UsersDetailQueryDto> {
|
||||||
let db = &self.state.surrealdb_ws;
|
let db = &self.state.surrealdb_ws;
|
||||||
|
|
||||||
let builder = DetailQueryBuilder::new(ResourceEnum::Users.to_string())
|
let builder = DetailQueryBuilder::new(ResourceEnum::Users.to_string())
|
||||||
.with_id(&id)
|
.with_id(&id)
|
||||||
.with_select_fields(vec!["*"])
|
.with_select_fields(vec!["*"])
|
||||||
.with_fetch("role")
|
.with_fetch("role")
|
||||||
.with_fetch("role.permissions");
|
.with_fetch("role.permissions");
|
||||||
|
|
||||||
let sql = builder.build();
|
let sql = builder.build();
|
||||||
|
|
||||||
let result: Option<UsersDetailQueryDto> =
|
let result: Option<UsersDetailQueryDto> =
|
||||||
builder.apply_bindings(db.query(sql)).await?.take(0)?;
|
builder.apply_bindings(db.query(sql)).await?.take(0)?;
|
||||||
|
|
||||||
let Some(user) = result else {
|
let Some(user) = result else {
|
||||||
bail!("User not found");
|
bail!("User not found");
|
||||||
};
|
};
|
||||||
|
if user.is_deleted {
|
||||||
|
bail!("User not found");
|
||||||
|
}
|
||||||
if user.role.is_deleted {
|
if user.role.is_deleted {
|
||||||
bail!("User not found");
|
bail!("User not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(UsersDetailQueryDto::from(&user))
|
Ok(UsersDetailQueryDto::from(&user))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,7 +147,7 @@ impl<'a> UsersRepository<'a> {
|
|||||||
let db = &self.state.surrealdb_ws;
|
let db = &self.state.surrealdb_ws;
|
||||||
let user = self.query_user_by_id(id).await?;
|
let user = self.query_user_by_id(id).await?;
|
||||||
if user.is_deleted {
|
if user.is_deleted {
|
||||||
bail!("User already deleted");
|
bail!("User not found");
|
||||||
}
|
}
|
||||||
let record_key = get_id(&user.id)?;
|
let record_key = get_id(&user.id)?;
|
||||||
let record: Option<UsersSchema> = db
|
let record: Option<UsersSchema> = db
|
||||||
|
|||||||
@@ -1,31 +1,34 @@
|
|||||||
|
use surrealdb::Uuid;
|
||||||
|
|
||||||
use crate::{MetaRequestDto, UsersRepository};
|
use crate::{MetaRequestDto, UsersRepository};
|
||||||
use crate::{RolesRepository, create_mock_app_state, create_test_user};
|
use crate::{RolesRepository, create_mock_app_state, create_test_user};
|
||||||
|
|
||||||
async fn get_role_id(state: &crate::AppState) -> String {
|
async fn get_role_id(state: &crate::AppState) -> String {
|
||||||
RolesRepository::new(state)
|
RolesRepository::new(state)
|
||||||
.query_role_by_name("Student".into())
|
.query_role_by_name("User".into())
|
||||||
.await
|
.await
|
||||||
.expect("Role not found")
|
.expect("Role not found")
|
||||||
.id
|
.id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn generate_unique_email(prefix: &str) -> String {
|
||||||
|
format!("{}_{}@example.com", prefix, Uuid::new_v4())
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_create_and_get_user() {
|
async fn test_create_and_get_user() {
|
||||||
let app_state = create_mock_app_state().await;
|
let app_state = create_mock_app_state().await;
|
||||||
let repo = UsersRepository::new(&app_state);
|
let repo = UsersRepository::new(&app_state);
|
||||||
let user = create_test_user(
|
let email = generate_unique_email("testuser");
|
||||||
"testuser@example.com",
|
let user =
|
||||||
"Test User",
|
create_test_user(&email, "Test User", true, &get_role_id(&app_state).await);
|
||||||
true,
|
|
||||||
&get_role_id(&app_state).await,
|
|
||||||
);
|
|
||||||
let create_result = repo.query_create_user(user.clone()).await;
|
let create_result = repo.query_create_user(user.clone()).await;
|
||||||
assert!(create_result.is_ok());
|
assert!(create_result.is_ok());
|
||||||
let fetched = repo
|
let fetched = repo
|
||||||
.query_user_by_email("testuser@example.com".into())
|
.query_user_by_email("testuser@example.com".into())
|
||||||
.await;
|
.await;
|
||||||
assert!(fetched.is_ok());
|
assert!(fetched.is_ok());
|
||||||
assert_eq!(fetched.unwrap().email, "testuser@example.com");
|
assert_eq!(fetched.unwrap().email, email.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
@@ -100,9 +103,7 @@ async fn test_query_delete_user() {
|
|||||||
.query_delete_user(user_detail.id.id.to_raw().clone())
|
.query_delete_user(user_detail.id.id.to_raw().clone())
|
||||||
.await;
|
.await;
|
||||||
assert!(delete_result.is_ok());
|
assert!(delete_result.is_ok());
|
||||||
let fetch_result = repo
|
let fetch_result = repo.query_user_by_email(user_detail.email.clone()).await;
|
||||||
.query_user_by_email(user_detail.id.id.to_raw().clone())
|
|
||||||
.await;
|
|
||||||
assert!(fetch_result.is_err());
|
assert!(fetch_result.is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user