feat: complete backend service
This commit is contained in:
@@ -4,6 +4,5 @@ SURREALDB_USERNAME=
|
||||
SURREALDB_PASSWORD=
|
||||
SURREALDB_NAMESPACE=
|
||||
SURREALDB_DBNAME=
|
||||
REDISDB_URL=
|
||||
ACCESS_TOKEN_SECRET=
|
||||
REFRESH_TOKEN_SECRET=
|
||||
|
||||
@@ -41,8 +41,8 @@ jobs:
|
||||
username: ${{ secrets.VPS_USER }}
|
||||
key: ${{ secrets.VPS_SSH_KEY }}
|
||||
port: ${{ secrets.VPS_PORT }}
|
||||
source: ./target/release/najm-course-api
|
||||
target: /opt/najm-course-api/najm-course-api
|
||||
source: ./target/release/imphnen-backend-service
|
||||
target: /opt/imphnen-backend-service/imphnen-backend-service
|
||||
rm: true
|
||||
overwrite: true
|
||||
|
||||
|
||||
Generated
+27
-27
@@ -1870,6 +1870,33 @@ version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed"
|
||||
|
||||
[[package]]
|
||||
name = "imphnen-backend-service"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"argon2",
|
||||
"axum",
|
||||
"axum-test",
|
||||
"chrono",
|
||||
"fancy-regex",
|
||||
"jsonwebtoken",
|
||||
"lazy_static",
|
||||
"lettre",
|
||||
"log",
|
||||
"rand 0.9.0",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"surrealdb",
|
||||
"thiserror 2.0.12",
|
||||
"tokio",
|
||||
"tower-http",
|
||||
"utoipa",
|
||||
"utoipa-swagger-ui",
|
||||
"validator",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "1.9.3"
|
||||
@@ -2256,33 +2283,6 @@ dependencies = [
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "najm-course-api"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"argon2",
|
||||
"axum",
|
||||
"axum-test",
|
||||
"chrono",
|
||||
"fancy-regex",
|
||||
"jsonwebtoken",
|
||||
"lazy_static",
|
||||
"lettre",
|
||||
"log",
|
||||
"rand 0.9.0",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"surrealdb",
|
||||
"thiserror 2.0.12",
|
||||
"tokio",
|
||||
"tower-http",
|
||||
"utoipa",
|
||||
"utoipa-swagger-ui",
|
||||
"validator",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nanoid"
|
||||
version = "0.4.0"
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
[package]
|
||||
name = "najm-course-api"
|
||||
name = "imphnen-backend-service"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
|
||||
+3
-3
@@ -11,12 +11,12 @@ WORKDIR /app
|
||||
COPY Cargo.toml Cargo.lock ./
|
||||
COPY ./src ./src
|
||||
|
||||
RUN cargo build --release && strip /app/target/release/axum-surrealdb-boilerplate
|
||||
RUN cargo build --release && strip /app/target/release/imphnen-backend-service
|
||||
|
||||
FROM gcr.io/distroless/cc AS runner
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=builder /app/target/release/axum-surrealdb-boilerplate .
|
||||
COPY --from=builder /app/target/release/imphnen-backend-service .
|
||||
|
||||
CMD ["/app/axum-boilerplate-surrealdb"]
|
||||
CMD ["/app/imphnen-backend-service"]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
description = "IMPHNEN CMS API Nix Flake";
|
||||
description = "IMPHNEN Backend Service Nix Flake";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
|
||||
@@ -28,13 +28,7 @@ pub struct AuthUserItemDto {
|
||||
pub email: String,
|
||||
pub avatar: Option<String>,
|
||||
pub phone_number: String,
|
||||
pub referred_by: Option<String>,
|
||||
pub referral_code: Option<String>,
|
||||
pub student_type: String,
|
||||
pub is_active: bool,
|
||||
pub is_profile_completed: bool,
|
||||
pub identity_number: Option<String>,
|
||||
pub religion: Option<String>,
|
||||
pub gender: Option<String>,
|
||||
pub birthdate: Option<String>,
|
||||
}
|
||||
|
||||
@@ -16,15 +16,9 @@ mod auth_repository_test {
|
||||
is_deleted: false,
|
||||
avatar: None,
|
||||
phone_number: "081234567890".to_string(),
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
identity_number: None,
|
||||
is_active: true,
|
||||
student_type: "general".to_string(),
|
||||
religion: None,
|
||||
gender: None,
|
||||
birthdate: None,
|
||||
is_profile_completed: false,
|
||||
role: make_thing("roles", "user"),
|
||||
created_at: get_iso_date(),
|
||||
updated_at: get_iso_date(),
|
||||
@@ -59,13 +53,7 @@ mod auth_repository_test {
|
||||
email: email.clone(),
|
||||
avatar: None,
|
||||
phone_number: "08123456789".into(),
|
||||
referred_by: None,
|
||||
referral_code: None,
|
||||
student_type: "TNI".into(),
|
||||
is_active: true,
|
||||
is_profile_completed: false,
|
||||
identity_number: None,
|
||||
religion: None,
|
||||
gender: None,
|
||||
birthdate: None,
|
||||
role: RolesItemDtoRaw {
|
||||
|
||||
@@ -82,14 +82,8 @@ impl AuthService {
|
||||
is_active: user.is_active.clone(),
|
||||
avatar: user.avatar.clone(),
|
||||
phone_number: user.phone_number.clone(),
|
||||
referral_code: user.referral_code.clone(),
|
||||
referred_by: user.referred_by.clone(),
|
||||
identity_number: user.identity_number.clone(),
|
||||
student_type: user.student_type.clone(),
|
||||
religion: user.religion.clone(),
|
||||
gender: user.gender.clone(),
|
||||
birthdate: user.birthdate.clone(),
|
||||
is_profile_completed: user.is_profile_completed.clone(),
|
||||
role: RolesItemDto {
|
||||
id: role_response.id,
|
||||
name: role_response.name,
|
||||
@@ -187,9 +181,6 @@ impl AuthService {
|
||||
fullname: new_user.fullname.clone(),
|
||||
password: new_user.password.clone(),
|
||||
phone_number: new_user.phone_number.clone(),
|
||||
referral_code: new_user.referral_code.clone(),
|
||||
referred_by: new_user.referred_by.clone(),
|
||||
student_type: new_user.student_type.clone(),
|
||||
created_at: get_iso_date(),
|
||||
updated_at: get_iso_date(),
|
||||
role: role_thing,
|
||||
|
||||
@@ -69,8 +69,8 @@ use utoipa::{
|
||||
)
|
||||
),
|
||||
info(
|
||||
title = "NAJM Course API",
|
||||
description = "NAJM Course API",
|
||||
title = "IMPHNEN Backend Service",
|
||||
description = "IMPHNEN Backend Service for Provide Gacha, Dimentorin and Backoffice Web App",
|
||||
version = "0.1.0",
|
||||
contact(
|
||||
name = "Maulana Sodiqin",
|
||||
|
||||
@@ -119,11 +119,8 @@ async fn test_create_user_should_return_201() {
|
||||
email: format!("test-{}@create.com", Uuid::new_v4()).into(),
|
||||
role_id,
|
||||
password: "Password1!".into(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
};
|
||||
let res = server.post("/v1/users/create").json(&payload).await;
|
||||
assert_eq!(res.status_code(), StatusCode::CREATED);
|
||||
@@ -148,11 +145,8 @@ async fn test_get_user_detail_should_return_200() {
|
||||
email: "detail@test.com".into(),
|
||||
role_id,
|
||||
password: "Password1!".into(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
};
|
||||
server.post("/v1/users/create").json(&payload).await;
|
||||
let user = repo.query_user_by_email(payload.email).await.unwrap();
|
||||
@@ -178,12 +172,9 @@ async fn test_delete_user_should_return_200() {
|
||||
fullname: "Test Delete Me".into(),
|
||||
email: "test@delete-me.com".into(),
|
||||
password: "Password1!".into(),
|
||||
student_type: "general".into(),
|
||||
role_id: role.id.clone(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
};
|
||||
let create_res = server.post("/v1/users/create").json(&payload).await;
|
||||
assert_eq!(create_res.status_code(), StatusCode::CREATED);
|
||||
@@ -216,11 +207,8 @@ async fn test_activate_user_should_return_200() {
|
||||
email: format!("inactive-{}@test.com", Uuid::new_v4()).into(),
|
||||
password: "Password1!".into(),
|
||||
role_id,
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: false,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
};
|
||||
let res_create = server.post("/v1/users/create").json(&payload).await;
|
||||
dbg!(res_create.text());
|
||||
@@ -255,11 +243,8 @@ async fn test_update_user_should_return_200() {
|
||||
email: unique_email.clone(),
|
||||
password: "Password1!".into(),
|
||||
role_id: role_id.clone(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
};
|
||||
let create_res = server.post("/v1/users/create").json(&payload).await;
|
||||
assert_eq!(create_res.status_code(), StatusCode::CREATED);
|
||||
@@ -268,14 +253,9 @@ async fn test_update_user_should_return_200() {
|
||||
let update_payload = UsersUpdateRequestDto {
|
||||
fullname: "Updated Name".into(),
|
||||
email: payload.email.clone(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
role_id: user.role.id.id.to_raw(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
identity_number: Some("1234567890123456".into()),
|
||||
religion: Some("Islam".into()),
|
||||
gender: Some("Laki-laki".into()),
|
||||
birthdate: Some("2000-01-01".into()),
|
||||
avatar: None,
|
||||
@@ -307,12 +287,9 @@ async fn test_create_user_should_fail_if_email_taken() {
|
||||
fullname: "User Satu".into(),
|
||||
email: email.clone(),
|
||||
password: "Password1!".into(),
|
||||
student_type: "general".into(),
|
||||
role_id,
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
};
|
||||
let res1 = server.post("/v1/users/create").json(&payload).await;
|
||||
assert_eq!(res1.status_code(), StatusCode::CREATED);
|
||||
@@ -354,11 +331,8 @@ async fn test_delete_user_should_fail_if_already_deleted() {
|
||||
email: "delete-me@example.com".into(),
|
||||
role_id,
|
||||
password: "Password1!".into(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
};
|
||||
server.post("/v1/users/create").json(&payload).await;
|
||||
let user = repo.query_user_by_email(payload.email).await.unwrap();
|
||||
@@ -387,14 +361,9 @@ async fn test_update_user_should_fail_if_user_not_found() {
|
||||
let update_payload = UsersUpdateRequestDto {
|
||||
fullname: "Does Not Exist".into(),
|
||||
email: "nonexistent@test.com".into(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
role_id,
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
identity_number: Some("1234567890123456".into()),
|
||||
religion: Some("Islam".into()),
|
||||
gender: Some("Laki-laki".into()),
|
||||
birthdate: Some("2000-01-01".into()),
|
||||
avatar: None,
|
||||
@@ -526,11 +495,8 @@ async fn test_user_detail_should_fail_if_user_is_soft_deleted() {
|
||||
fullname: "Soft Deleted".into(),
|
||||
email: "softdeleted@test.com".into(),
|
||||
password: "Password1!".into(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
};
|
||||
server.post("/v1/users/create").json(&payload).await;
|
||||
let user = repo.query_user_by_email(payload.email).await.unwrap();
|
||||
@@ -562,11 +528,8 @@ async fn test_update_user_should_fail_if_user_is_deleted() {
|
||||
fullname: "To Be Deleted".into(),
|
||||
email: "deleteduser@test.com".into(),
|
||||
password: "Password1!".into(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
};
|
||||
server.post("/v1/users/create").json(&payload).await;
|
||||
let user = repo.query_user_by_email(payload.email).await.unwrap();
|
||||
@@ -576,13 +539,8 @@ async fn test_update_user_should_fail_if_user_is_deleted() {
|
||||
role_id: role_id.clone(),
|
||||
fullname: "Should Fail".into(),
|
||||
email: "deleteduser@test.com".into(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
identity_number: Some("1234567890123456".into()),
|
||||
religion: Some("Islam".into()),
|
||||
gender: Some("Laki-laki".into()),
|
||||
birthdate: Some("2000-01-01".into()),
|
||||
avatar: None,
|
||||
@@ -615,11 +573,8 @@ async fn test_update_user_should_fail_if_payload_invalid() {
|
||||
email: "invalid@test.com".into(),
|
||||
role_id: role_id.clone(),
|
||||
password: "Password1!".into(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
};
|
||||
server.post("/v1/users/create").json(&payload).await;
|
||||
let user = repo.query_user_by_email(payload.email).await.unwrap();
|
||||
@@ -627,14 +582,9 @@ async fn test_update_user_should_fail_if_payload_invalid() {
|
||||
let update_payload = UsersUpdateRequestDto {
|
||||
fullname: "".into(),
|
||||
email: "invalid@test.com".into(),
|
||||
student_type: "general".into(),
|
||||
phone_number: "081234567890".into(),
|
||||
is_active: true,
|
||||
referral_code: None,
|
||||
role_id: role_id.clone(),
|
||||
referred_by: None,
|
||||
identity_number: Some("1234567890123456".into()),
|
||||
religion: Some("Islam".into()),
|
||||
gender: Some("Laki-laki".into()),
|
||||
birthdate: Some("2000-01-01".into()),
|
||||
avatar: None,
|
||||
|
||||
@@ -34,19 +34,11 @@ pub struct UsersCreateRequestDto {
|
||||
pub password: String,
|
||||
#[validate(length(min = 2, message = "Fullname at least have 2 character"))]
|
||||
pub fullname: String,
|
||||
#[validate(length(min = 1, message = "Student type is required"))]
|
||||
pub student_type: String,
|
||||
#[validate(length(
|
||||
min = 10,
|
||||
message = "Phone number at least have 10 character"
|
||||
))]
|
||||
pub phone_number: String,
|
||||
#[validate(length(
|
||||
max = 4,
|
||||
message = "Referal code cannot be more than 4 character"
|
||||
))]
|
||||
pub referral_code: Option<String>,
|
||||
pub referred_by: Option<String>,
|
||||
pub is_active: bool,
|
||||
pub role_id: String,
|
||||
}
|
||||
@@ -64,24 +56,12 @@ pub struct UsersUpdateRequestDto {
|
||||
))]
|
||||
#[validate(length(min = 2, message = "Fullname at least have 2 character"))]
|
||||
pub fullname: String,
|
||||
#[validate(length(min = 1, message = "Student type is required"))]
|
||||
pub student_type: String,
|
||||
#[validate(length(
|
||||
min = 10,
|
||||
message = "Phone number at least have 10 character"
|
||||
))]
|
||||
pub phone_number: String,
|
||||
#[validate(length(
|
||||
max = 4,
|
||||
message = "Referal code cannot be more than 4 character"
|
||||
))]
|
||||
pub referral_code: Option<String>,
|
||||
pub referred_by: Option<String>,
|
||||
pub is_active: bool,
|
||||
#[validate(length(min = 16, message = "NIK at least have 16 character"))]
|
||||
pub identity_number: Option<String>,
|
||||
#[validate(length(min = 1, message = "Religion is required"))]
|
||||
pub religion: Option<String>,
|
||||
#[validate(length(min = 1, message = "Gender is required"))]
|
||||
pub gender: Option<String>,
|
||||
#[validate(length(min = 1, message = "Birthdate is required"))]
|
||||
@@ -99,14 +79,8 @@ pub struct UsersItemDto {
|
||||
pub email: String,
|
||||
pub avatar: Option<String>,
|
||||
pub phone_number: String,
|
||||
pub referred_by: Option<String>,
|
||||
pub referral_code: Option<String>,
|
||||
pub student_type: String,
|
||||
pub is_active: bool,
|
||||
pub is_profile_completed: bool,
|
||||
pub is_deleted: bool,
|
||||
pub identity_number: Option<String>,
|
||||
pub religion: Option<String>,
|
||||
pub gender: Option<String>,
|
||||
pub birthdate: Option<String>,
|
||||
pub password: String,
|
||||
@@ -122,13 +96,7 @@ pub struct UsersDetailItemDto {
|
||||
pub email: String,
|
||||
pub avatar: Option<String>,
|
||||
pub phone_number: String,
|
||||
pub referred_by: Option<String>,
|
||||
pub referral_code: Option<String>,
|
||||
pub student_type: String,
|
||||
pub is_active: bool,
|
||||
pub is_profile_completed: bool,
|
||||
pub identity_number: Option<String>,
|
||||
pub religion: Option<String>,
|
||||
pub gender: Option<String>,
|
||||
pub birthdate: Option<String>,
|
||||
}
|
||||
@@ -141,10 +109,9 @@ pub struct UsersListItemDto {
|
||||
pub email: String,
|
||||
pub avatar: Option<String>,
|
||||
pub phone_number: String,
|
||||
pub referred_by: Option<String>,
|
||||
pub referral_code: Option<String>,
|
||||
pub student_type: String,
|
||||
pub is_active: bool,
|
||||
pub created_at: String,
|
||||
pub updated_at: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
@@ -155,10 +122,9 @@ pub struct UsersListItemDtoRaw {
|
||||
pub email: String,
|
||||
pub avatar: Option<String>,
|
||||
pub phone_number: String,
|
||||
pub referred_by: Option<String>,
|
||||
pub referral_code: Option<String>,
|
||||
pub student_type: String,
|
||||
pub is_active: bool,
|
||||
pub created_at: String,
|
||||
pub updated_at: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
@@ -168,14 +134,8 @@ pub struct UsersItemDtoRaw {
|
||||
pub email: String,
|
||||
pub avatar: Option<String>,
|
||||
pub phone_number: String,
|
||||
pub referred_by: Option<String>,
|
||||
pub referral_code: Option<String>,
|
||||
pub student_type: String,
|
||||
pub is_active: bool,
|
||||
pub is_profile_completed: bool,
|
||||
pub is_deleted: bool,
|
||||
pub identity_number: Option<String>,
|
||||
pub religion: Option<String>,
|
||||
pub gender: Option<String>,
|
||||
pub birthdate: Option<String>,
|
||||
pub role: RolesItemDtoRaw,
|
||||
|
||||
@@ -23,37 +23,28 @@ impl<'a> UsersRepository<'a> {
|
||||
meta: MetaRequestDto,
|
||||
) -> Result<ResponseListSuccessDto<Vec<UsersListItemDto>>> {
|
||||
let db = &self.state.surrealdb_ws;
|
||||
|
||||
let mut conditions = vec!["is_deleted = false".to_string()];
|
||||
|
||||
if let Some(search) = meta.search.as_deref() {
|
||||
if !search.is_empty() {
|
||||
conditions.push("string::contains(fullname ?? '', $search)".to_string());
|
||||
}
|
||||
}
|
||||
|
||||
if let (Some(filter_by), Some(_filter)) =
|
||||
(meta.filter_by.as_ref(), meta.filter.as_ref())
|
||||
{
|
||||
conditions.push(format!("{} = $filter", filter_by));
|
||||
}
|
||||
|
||||
let where_clause = if !conditions.is_empty() {
|
||||
format!("WHERE {}", conditions.join(" AND "))
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
|
||||
let limit = meta.per_page.unwrap_or(10);
|
||||
let page = meta.page.unwrap_or(1);
|
||||
|
||||
// Validate pagination parameters explicitly
|
||||
if page < 1 || limit < 1 {
|
||||
return Err(anyhow!("Invalid pagination parameters"));
|
||||
}
|
||||
|
||||
let start = (page - 1) * limit;
|
||||
|
||||
let select_query = format!(
|
||||
"
|
||||
SELECT
|
||||
@@ -63,15 +54,11 @@ impl<'a> UsersRepository<'a> {
|
||||
email,
|
||||
avatar,
|
||||
phone_number,
|
||||
referred_by,
|
||||
referral_code,
|
||||
student_type,
|
||||
is_active,
|
||||
is_profile_completed,
|
||||
identity_number,
|
||||
religion,
|
||||
gender,
|
||||
birthdate
|
||||
birthdate,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM {}
|
||||
{}
|
||||
LIMIT {} START {}
|
||||
@@ -82,7 +69,6 @@ impl<'a> UsersRepository<'a> {
|
||||
limit,
|
||||
start
|
||||
);
|
||||
|
||||
let raw_result = query_list_with_meta::<UsersListItemDtoRaw>(
|
||||
db,
|
||||
&ResourceEnum::Users.to_string(),
|
||||
@@ -91,7 +77,6 @@ impl<'a> UsersRepository<'a> {
|
||||
Some(select_query),
|
||||
)
|
||||
.await?;
|
||||
|
||||
let transformed_data = raw_result
|
||||
.data
|
||||
.into_iter()
|
||||
@@ -101,14 +86,12 @@ impl<'a> UsersRepository<'a> {
|
||||
email: user.email,
|
||||
avatar: user.avatar,
|
||||
phone_number: user.phone_number,
|
||||
referred_by: user.referred_by,
|
||||
referral_code: user.referral_code,
|
||||
student_type: user.student_type,
|
||||
is_active: user.is_active,
|
||||
role: user.role.unwrap_or_else(|| "-".into()),
|
||||
created_at: user.created_at,
|
||||
updated_at: user.updated_at,
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
Ok(ResponseListSuccessDto {
|
||||
data: transformed_data,
|
||||
meta: raw_result.meta,
|
||||
@@ -147,14 +130,8 @@ impl<'a> UsersRepository<'a> {
|
||||
email: user.email,
|
||||
avatar: user.avatar,
|
||||
phone_number: user.phone_number,
|
||||
referred_by: user.referred_by,
|
||||
referral_code: user.referral_code,
|
||||
student_type: user.student_type,
|
||||
is_active: user.is_active,
|
||||
is_deleted: user.is_deleted,
|
||||
is_profile_completed: user.is_profile_completed,
|
||||
identity_number: user.identity_number,
|
||||
religion: user.religion,
|
||||
gender: user.gender,
|
||||
birthdate: user.birthdate,
|
||||
password: user.password,
|
||||
@@ -206,14 +183,8 @@ impl<'a> UsersRepository<'a> {
|
||||
email: user.email,
|
||||
avatar: user.avatar,
|
||||
phone_number: user.phone_number,
|
||||
referred_by: user.referred_by,
|
||||
referral_code: user.referral_code,
|
||||
student_type: user.student_type,
|
||||
is_active: user.is_active,
|
||||
is_deleted: user.is_deleted,
|
||||
is_profile_completed: user.is_profile_completed,
|
||||
identity_number: user.identity_number,
|
||||
religion: user.religion,
|
||||
gender: user.gender,
|
||||
birthdate: user.birthdate,
|
||||
password: user.password,
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
use crate::{get_iso_date, ResourceEnum};
|
||||
use crate::{get_iso_date, make_thing, ResourceEnum};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use surrealdb::{
|
||||
sql::{Id, Thing},
|
||||
Uuid,
|
||||
};
|
||||
use surrealdb::{sql::Thing, Uuid};
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
pub struct UsersSchema {
|
||||
@@ -13,16 +10,10 @@ pub struct UsersSchema {
|
||||
pub password: String,
|
||||
pub avatar: Option<String>,
|
||||
pub phone_number: String,
|
||||
pub referral_code: Option<String>,
|
||||
pub referred_by: Option<String>,
|
||||
pub identity_number: Option<String>,
|
||||
pub is_active: bool,
|
||||
pub is_deleted: bool,
|
||||
pub student_type: String,
|
||||
pub religion: Option<String>,
|
||||
pub gender: Option<String>,
|
||||
pub birthdate: Option<String>,
|
||||
pub is_profile_completed: bool,
|
||||
pub role: Thing,
|
||||
pub created_at: String,
|
||||
pub updated_at: String,
|
||||
@@ -31,29 +22,23 @@ pub struct UsersSchema {
|
||||
impl Default for UsersSchema {
|
||||
fn default() -> Self {
|
||||
UsersSchema {
|
||||
id: Thing::from((
|
||||
ResourceEnum::Users.to_string(),
|
||||
Id::String(Uuid::new_v4().to_string()),
|
||||
)),
|
||||
id: make_thing(
|
||||
&ResourceEnum::Users.to_string(),
|
||||
&Uuid::new_v4().to_string(),
|
||||
),
|
||||
fullname: String::new(),
|
||||
email: String::new(),
|
||||
password: String::new(),
|
||||
avatar: None,
|
||||
phone_number: String::new(),
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
identity_number: None,
|
||||
is_active: false,
|
||||
is_deleted: false,
|
||||
student_type: String::new(),
|
||||
religion: None,
|
||||
gender: None,
|
||||
birthdate: None,
|
||||
is_profile_completed: false,
|
||||
role: Thing::from((
|
||||
ResourceEnum::Roles.to_string(),
|
||||
Id::String(Uuid::new_v4().to_string()),
|
||||
)),
|
||||
role: make_thing(
|
||||
&ResourceEnum::Roles.to_string(),
|
||||
&Uuid::new_v4().to_string(),
|
||||
),
|
||||
created_at: get_iso_date(),
|
||||
updated_at: get_iso_date(),
|
||||
}
|
||||
|
||||
@@ -43,13 +43,7 @@ impl UsersService {
|
||||
email: user.email,
|
||||
avatar: user.avatar,
|
||||
phone_number: user.phone_number,
|
||||
referred_by: user.referred_by,
|
||||
referral_code: user.referral_code,
|
||||
student_type: user.student_type,
|
||||
is_active: user.is_active,
|
||||
is_profile_completed: user.is_profile_completed,
|
||||
identity_number: user.identity_number,
|
||||
religion: user.religion,
|
||||
gender: user.gender,
|
||||
birthdate: user.birthdate,
|
||||
},
|
||||
@@ -72,13 +66,7 @@ impl UsersService {
|
||||
email: user.email,
|
||||
avatar: user.avatar,
|
||||
phone_number: user.phone_number,
|
||||
referred_by: user.referred_by,
|
||||
referral_code: user.referral_code,
|
||||
student_type: user.student_type,
|
||||
is_active: user.is_active,
|
||||
is_profile_completed: user.is_profile_completed,
|
||||
identity_number: user.identity_number,
|
||||
religion: user.religion,
|
||||
gender: user.gender,
|
||||
birthdate: user.birthdate,
|
||||
},
|
||||
@@ -109,12 +97,8 @@ impl UsersService {
|
||||
fullname: new_user.fullname.clone(),
|
||||
password: hash_password(&new_user.password).unwrap(),
|
||||
phone_number: new_user.phone_number.clone(),
|
||||
referral_code: new_user.referral_code.clone(),
|
||||
referred_by: new_user.referred_by.clone(),
|
||||
student_type: new_user.student_type.clone(),
|
||||
is_active: new_user.is_active.clone(),
|
||||
role: role_thing,
|
||||
is_profile_completed: false,
|
||||
..Default::default()
|
||||
})
|
||||
.await
|
||||
@@ -145,16 +129,10 @@ impl UsersService {
|
||||
fullname: user.fullname,
|
||||
email: user.email,
|
||||
phone_number: user.phone_number,
|
||||
referral_code: user.referral_code,
|
||||
referred_by: user.referred_by,
|
||||
identity_number: user.identity_number,
|
||||
is_active: user.is_active,
|
||||
student_type: user.student_type,
|
||||
religion: user.religion,
|
||||
gender: user.gender,
|
||||
birthdate: user.birthdate,
|
||||
avatar: user.avatar,
|
||||
is_profile_completed: false,
|
||||
role: role_id,
|
||||
updated_at: get_iso_date(),
|
||||
..Default::default()
|
||||
@@ -185,16 +163,13 @@ impl UsersService {
|
||||
fullname: user.fullname,
|
||||
email: user.email,
|
||||
phone_number: user.phone_number,
|
||||
referral_code: user.referral_code,
|
||||
referred_by: user.referred_by,
|
||||
identity_number: user.identity_number,
|
||||
|
||||
is_active: user.is_active,
|
||||
student_type: user.student_type,
|
||||
religion: user.religion,
|
||||
|
||||
gender: user.gender,
|
||||
birthdate: user.birthdate,
|
||||
avatar: user.avatar,
|
||||
is_profile_completed: true,
|
||||
|
||||
role: role_id,
|
||||
updated_at: get_iso_date(),
|
||||
..Default::default()
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
use najm_course_api::{apps, axum_init};
|
||||
use imphnen_backend_service::{apps, axum_init};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use najm_course_api::{get_iso_date, Env};
|
||||
use imphnen_backend_service::{get_iso_date, Env};
|
||||
use serde_json::json;
|
||||
use std::error::Error;
|
||||
use surrealdb::{engine::remote::ws::Ws, opt::auth::Root, Surreal};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use najm_course_api::{get_iso_date, Env};
|
||||
use imphnen_backend_service::{get_iso_date, Env};
|
||||
use serde_json::json;
|
||||
use std::error::Error;
|
||||
use surrealdb::{engine::remote::ws::Ws, opt::auth::Root, Surreal};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use najm_course_api::{get_iso_date, make_thing, Env};
|
||||
use imphnen_backend_service::{get_iso_date, make_thing, Env};
|
||||
use std::error::Error;
|
||||
use surrealdb::{engine::remote::ws::Ws, opt::auth::Root, Surreal};
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use najm_course_api::{get_iso_date, hash_password, Env};
|
||||
use imphnen_backend_service::{get_iso_date, hash_password, Env};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::error::Error;
|
||||
use surrealdb::{engine::remote::ws::Ws, opt::auth::Root, sql::Thing, Surreal};
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
use najm_course_api::{apps, axum_init};
|
||||
use imphnen_backend_service::{apps, axum_init};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
|
||||
@@ -66,15 +66,9 @@ pub fn create_test_user(
|
||||
is_deleted: false,
|
||||
avatar: None,
|
||||
phone_number: "081234567890".to_string(),
|
||||
referral_code: None,
|
||||
referred_by: None,
|
||||
identity_number: None,
|
||||
is_active,
|
||||
student_type: "TNI".to_string(),
|
||||
religion: None,
|
||||
gender: None,
|
||||
birthdate: None,
|
||||
is_profile_completed: false,
|
||||
role: make_thing("app_roles", role_id),
|
||||
..Default::default()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user