Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 0 additions & 32 deletions src/database/auth/change_password/view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,35 +34,3 @@ impl Display for ChangePasswordQueryView {
write!(f, "ChangePasswordQueryView: password = [PROTECTED]")
}
}

#[derive(Debug, sqlx::FromRow, PartialEq, Eq)]
pub struct LoginUserQueryResultView {
#[sqlx(rename = "id")]
user_id: i32,
#[sqlx(rename = "password")]
password: String,
#[sqlx(rename = "first_connect")]
first_connect: bool,
}

impl LoginUserQueryResultView {
pub fn new(user_id: i32, password: String, first_connect: bool) -> Self {
Self {
user_id,
password,
first_connect,
}
}

pub fn password(&self) -> &str {
&self.password
}

pub fn user_id(&self) -> i32 {
self.user_id
}

pub fn first_connect(&self) -> bool {
self.first_connect
}
}
8 changes: 0 additions & 8 deletions src/database/users/about/mod.rs

This file was deleted.

29 changes: 0 additions & 29 deletions src/database/users/about/view.rs

This file was deleted.

6 changes: 6 additions & 0 deletions src/database/users/get_user_by_id/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
mod query;
pub use query::get_user_by_id_query;

mod view;
pub use view::GetUserByIdQueryResultView;
pub use view::GetUserByIdQueryView;
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
use crate::database::users::about::AboutUserQueryResultView;
use crate::database::users::about::AboutUserQueryView;
use crate::database::users::get_user_by_id::GetUserByIdQueryResultView;
use crate::database::users::get_user_by_id::GetUserByIdQueryView;
use mairie360_api_lib::database::db_interface::DatabaseQueryView;
use mairie360_api_lib::database::errors::DatabaseError;
use mairie360_api_lib::database::queries::QueryError;
use sqlx::PgPool;

pub async fn about_user_query(
view: AboutUserQueryView,
pub async fn get_user_by_id_query(
view: GetUserByIdQueryView,
pool: PgPool,
) -> Result<AboutUserQueryResultView, DatabaseError> {
let result = sqlx::query_as::<_, AboutUserQueryResultView>(&view.get_request())
) -> Result<GetUserByIdQueryResultView, DatabaseError> {
let result = sqlx::query_as::<_, GetUserByIdQueryResultView>(&view.get_request())
.bind(view.get_id() as i32)
.fetch_optional(&pool)
.await?;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,60 @@
use mairie360_api_lib::database::db_interface::DatabaseQueryView;
use serde::{Deserialize, Serialize};
use serde_json;
use std::fmt::Display;

pub struct GetUserByIdQueryView {
id: u64,
}

impl GetUserByIdQueryView {
pub fn new(id: u64) -> Self {
Self { id }
}

pub fn get_id(&self) -> u64 {
self.id
}
}

impl DatabaseQueryView for GetUserByIdQueryView {
fn get_request(&self) -> String {
"SELECT first_name, last_name, email, phone_number, status, is_archived FROM users WHERE id = $1"
.to_string()
}
}

impl Display for GetUserByIdQueryView {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "GetUserByIdQueryView: id = {}", self.id)
}
}

#[derive(Serialize, Deserialize, Debug, sqlx::FromRow)]
pub struct AboutUserQueryResultView {
pub struct GetUserByIdQueryResultView {
first_name: String,
last_name: String,
email: String,
phone_number: String,
status: String,
is_archived: bool,
}

impl AboutUserQueryResultView {
impl GetUserByIdQueryResultView {
pub fn new(
first_name: &str,
last_name: &str,
email: &str,
phone_number: &str,
status: &str,
is_archived: bool,
) -> Self {
Self {
first_name: first_name.to_string(),
last_name: last_name.to_string(),
email: email.to_string(),
phone_number: phone_number.to_string(),
status: status.to_string(),
is_archived,
}
}

Expand All @@ -50,4 +81,8 @@ impl AboutUserQueryResultView {
pub fn status(&self) -> &str {
&self.status
}

pub fn is_archived(&self) -> bool {
self.is_archived
}
}
3 changes: 2 additions & 1 deletion src/database/users/mod.rs
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
pub mod about;
pub mod get_user_by_id;
pub mod patch_user;
5 changes: 5 additions & 0 deletions src/database/users/patch_user/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
mod query;
pub use query::patch_user_query;

mod view;
pub use view::PatchUserQueryView;
56 changes: 56 additions & 0 deletions src/database/users/patch_user/query.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
use crate::database::users::patch_user::PatchUserQueryView;
use mairie360_api_lib::database::errors::DatabaseError;
use sqlx::PgPool;

pub async fn patch_user_query(
view: PatchUserQueryView,
pool: &PgPool,
) -> Result<(), DatabaseError> {
let mut query_builder = sqlx::QueryBuilder::new("UPDATE users SET ");

// On utilise un booléen pour savoir si on a déjà ajouté un champ
let mut first = true;

// Macro pour ajouter proprement chaque champ
macro_rules! add_field {
($field_name:expr, $value:expr) => {
if !first {
query_builder.push(", ");
}
query_builder.push($field_name);
query_builder.push(" = ");
query_builder.push_bind($value);
first = false;
};
}

if let Some(first_name) = view.first_name() {
add_field!("first_name", first_name);
}
if let Some(last_name) = view.last_name() {
add_field!("last_name", last_name);
}
if let Some(email) = view.email() {
add_field!("email", email);
}
if let Some(phone_number) = view.phone_number() {
add_field!("phone_number", phone_number);
}

// Si aucun champ n'a été ajouté, on arrête tout
if first {
return Ok(());
}

// Ajout de la clause WHERE
query_builder.push(" WHERE id = ");
query_builder.push_bind(view.id() as i32);

query_builder
.build()
.execute(pool)
.await
.map_err(DatabaseError::from)?;

Comment thread
Quentintnrl marked this conversation as resolved.
Ok(())
}
75 changes: 75 additions & 0 deletions src/database/users/patch_user/view.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
use mairie360_api_lib::database::db_interface::DatabaseQueryView;
use std::fmt::Display;

pub struct PatchUserQueryView {
id: u64,
first_name: Option<String>,
last_name: Option<String>,
email: Option<String>,
phone_number: Option<String>,
}

impl PatchUserQueryView {
pub fn new(
id: u64,
first_name: Option<&str>,
last_name: Option<&str>,
email: Option<&str>,
phone_number: Option<&str>,
) -> Self {
Self {
id,
first_name: first_name.map(|s| s.to_string()),
last_name: last_name.map(|s| s.to_string()),
email: email.map(|s| s.to_string()),
phone_number: phone_number.map(|s| s.to_string()),
}
}

pub fn id(&self) -> u64 {
self.id
}

pub fn first_name(&self) -> Option<&str> {
self.first_name.as_deref()
}
pub fn last_name(&self) -> Option<&str> {
self.last_name.as_deref()
}
pub fn email(&self) -> Option<&str> {
self.email.as_deref()
}
pub fn phone_number(&self) -> Option<&str> {
self.phone_number.as_deref()
}
}

impl DatabaseQueryView for PatchUserQueryView {
fn get_request(&self) -> String {
let mut request = "UPDATE users SET ".to_string();
if let Some(first_name) = &self.first_name {
request.push_str(&format!("first_name = '{}', ", first_name));
}
if let Some(last_name) = &self.last_name {
request.push_str(&format!("last_name = '{}', ", last_name));
}
if let Some(email) = &self.email {
request.push_str(&format!("email = '{}', ", email));
}
if let Some(phone_number) = &self.phone_number {
request.push_str(&format!("phone_number = '{}', ", phone_number));
}
request.push_str(&format!("WHERE id = {}", self.id));
request.push_str(" RETURNING true");
request
}
Comment thread
Quentintnrl marked this conversation as resolved.
}

impl Display for PatchUserQueryView {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.phone_number {
Comment thread
Quentintnrl marked this conversation as resolved.
Some(_) => write!(f, "PatchUserQueryView: id = {:?}, first_name = {:?}, last_name = {:?}, email = {:?}, phone_number = {:?}", self.id(), self.first_name(), self.last_name(), self.email(), self.phone_number()),
None => write!(f, "PatchUserQueryView: id = {:?}, first_name = {:?}, last_name = {:?}, email = {:?}", self.id(), self.first_name(), self.last_name(), self.email()),
}
}
}
2 changes: 1 addition & 1 deletion src/endpoints/v1/auth/force_change_password/endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ async fn force_change_password_trigger(
(status = 403, description = "Unknown user token"),
(status = 500, description = "Internal server error")
),
tag = "Auth"
tag = "Authentication"
)]
#[post("/force_change_password")]
pub async fn force_change_password(
Expand Down
2 changes: 1 addition & 1 deletion src/endpoints/v1/auth/forgot_password/endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ async fn forgot_password_trigger(
(status = 404, description = "User not found"),
(status = 500, description = "Internal server error")
),
tag = "Auth",
tag = "Authentication",
security(
("jwt" = [])
)
Expand Down
2 changes: 1 addition & 1 deletion src/endpoints/v1/auth/reset_password/endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ async fn reset_password_trigger(
(status = 401, description = "Unauthorized, invalid token"),
(status = 500, description = "Internal server error")
),
tag = "Auth",
tag = "Authentication",
)]
#[post("/reset_password")]
pub async fn reset_password(
Expand Down
41 changes: 0 additions & 41 deletions src/endpoints/v1/user/about/about_request_view.rs

This file was deleted.

9 changes: 0 additions & 9 deletions src/endpoints/v1/user/about/doc.rs

This file was deleted.

Loading
Loading