Skip to content

Commit 1633697

Browse files
authored
feat: add endpoint to query all users in a simplified format (#45)
1 parent 80dd8e7 commit 1633697

File tree

4 files changed

+56
-7
lines changed

4 files changed

+56
-7
lines changed

src/database.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ use crate::filters::{
22
filter_by_assigned_user, filter_by_labels, filter_by_status, filter_by_title,
33
};
44
use crate::models::{
5-
DataBaseUser, DatabaseSession, NewSession, NewTicket, NewUser, SqliteTicket, Status, Ticket,
5+
DataBaseUser, DatabaseSession, DisplayUser, NewSession, NewTicket, NewUser, SqliteTicket,
6+
Status, Ticket,
67
};
78
use crate::payloads::{FilterPayload, TicketPayload};
89
use crate::schema::sessions::dsl::sessions;
910
use crate::schema::sessions::token;
1011
use crate::schema::tickets::dsl::tickets;
1112
use crate::schema::tickets::{body, id, labels, last_modified, status, title};
1213
use crate::schema::users::dsl::users;
13-
use crate::schema::users::email;
14+
use crate::schema::users::{display_name, email};
1415
use actix_web::web::Json;
1516
use argonautica::Hasher;
1617
use diesel::{Connection, ExpressionMethods, QueryDsl, QueryResult, RunQueryDsl, SqliteConnection};
@@ -142,6 +143,12 @@ pub fn get_user_by_email(
142143
users.filter(email.eq(user_email)).get_result(connection)
143144
}
144145

146+
pub fn get_all_users(connection: &mut SqliteConnection) -> QueryResult<Vec<DisplayUser>> {
147+
users
148+
.select((email, display_name))
149+
.load::<DisplayUser>(connection)
150+
}
151+
145152
pub fn filter_tickets_in_database(
146153
connection: &mut SqliteConnection,
147154
filter_payload: Json<FilterPayload>,

src/main.rs

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,17 @@ mod test_helpers;
99

1010
use crate::database::{
1111
create_ticket, create_user, delete_ticket, edit_ticket, filter_tickets_in_database,
12-
get_all_tickets, get_single_ticket, get_user_by_email, remove_session_from_db,
12+
get_all_tickets, get_all_users, get_single_ticket, get_user_by_email, remove_session_from_db,
1313
write_session_to_db, DataBase,
1414
};
1515
use crate::middleware::validator;
1616
use crate::models::{NewSession, NewUser, Ticket, TokenClaims};
1717
use crate::payloads::{FilterPayload, LoginPayload, TicketPayload};
1818
use crate::status_messages::{
1919
CANNOT_LOGOUT, ERROR_COULD_NOT_CREATE_TICKET, ERROR_COULD_NOT_CREATE_USER,
20-
ERROR_COULD_NOT_DELETE, ERROR_COULD_NOT_GET, ERROR_COULD_NOT_UPDATE, ERROR_INCORRECT_PASSWORD,
21-
ERROR_INVALID_ID, ERROR_NOT_FOUND, ERROR_NOT_LOGGED_IN, ERROR_NO_USER_FOUND,
22-
ERROR_USER_ALREADY_EXISTS, SUCCESS_LOGOUT,
20+
ERROR_COULD_NOT_DELETE, ERROR_COULD_NOT_GET, ERROR_COULD_NOT_RETRIEVE_USERS,
21+
ERROR_COULD_NOT_UPDATE, ERROR_INCORRECT_PASSWORD, ERROR_INVALID_ID, ERROR_NOT_FOUND,
22+
ERROR_NOT_LOGGED_IN, ERROR_NO_USER_FOUND, ERROR_USER_ALREADY_EXISTS, SUCCESS_LOGOUT,
2323
};
2424
use actix_cors::Cors;
2525
use actix_web::cookie::time::{Duration, OffsetDateTime};
@@ -54,7 +54,8 @@ async fn main() -> Result<()> {
5454
.service(delete)
5555
.service(edit)
5656
.service(filter_tickets)
57-
.service(logout),
57+
.service(logout)
58+
.service(get_users),
5859
),
5960
)
6061
})
@@ -258,6 +259,16 @@ async fn login(payload: Json<LoginPayload>) -> impl Responder {
258259
}
259260
}
260261

262+
#[get("/users")]
263+
async fn get_users() -> impl Responder {
264+
let mut database = DataBase::new();
265+
266+
match get_all_users(&mut database.connection) {
267+
Ok(all_users) => HttpResponse::Ok().json(all_users),
268+
Err(_) => HttpResponse::InternalServerError().json(ERROR_COULD_NOT_RETRIEVE_USERS),
269+
}
270+
}
271+
261272
/*
262273
* To fully understand the tests and the test data,
263274
* have a look at the setup_database function in test_helpers.rs.
@@ -754,6 +765,30 @@ mod tests {
754765
}
755766
}
756767

768+
mod test_get_users {
769+
use actix_web::{
770+
test::{self, TestRequest},
771+
App,
772+
};
773+
use serial_test::serial;
774+
775+
use crate::{get_users, models::DisplayUser, test_helpers::helpers::setup_database};
776+
777+
#[actix_web::test]
778+
#[serial]
779+
async fn test_get_all_users() {
780+
setup_database();
781+
782+
let app = test::init_service(App::new().service(get_users)).await;
783+
let req = TestRequest::get().uri("/users").to_request();
784+
785+
let response: Vec<DisplayUser> = test::call_and_read_body_json(&app, req).await;
786+
787+
assert_eq!(response[0].email, "test@example.com");
788+
assert_eq!(response[0].display_name, "user");
789+
}
790+
}
791+
757792
mod test_logout {
758793
use crate::database::DataBase;
759794
use crate::logout;

src/models.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ pub struct DataBaseUser {
101101
pub password: String,
102102
}
103103

104+
#[derive(Serialize, Deserialize, Debug, Queryable)]
105+
pub struct DisplayUser {
106+
pub email: String,
107+
pub display_name: String,
108+
}
109+
104110
#[derive(Serialize, Deserialize, Insertable)]
105111
#[diesel(table_name = crate::schema::users)]
106112
#[diesel(check_for_backend(diesel::sqlite::Sqlite))]

src/status_messages.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub const ERROR_COULD_NOT_CREATE_USER: &str = "Could not create user";
1111
pub const ERROR_INCORRECT_PASSWORD: &str = "Incorrect email or password";
1212
pub const ERROR_NO_USER_FOUND: &str = "No user found";
1313
pub const ERROR_USER_ALREADY_EXISTS: &str = "User with that email already exists";
14+
pub const ERROR_COULD_NOT_RETRIEVE_USERS: &str = "Could not retriever users";
1415

1516
// success messages
1617
pub const SUCCESS_LOGOUT: &str = "Successfully logged out";

0 commit comments

Comments
 (0)