2024-07-07 02:01:13 +01:00
|
|
|
use actix_web::{web, App, Error, HttpResponse, HttpServer};
|
|
|
|
use confik::{Configuration as _, EnvSource};
|
|
|
|
use deadpool_postgres::{Client, Pool};
|
|
|
|
use dotenvy::dotenv;
|
|
|
|
use tokio_postgres::NoTls;
|
2020-01-16 06:46:28 -05:00
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
use crate::config::ExampleConfig;
|
2022-07-09 21:08:11 +01:00
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
mod config;
|
|
|
|
mod db;
|
|
|
|
mod errors;
|
|
|
|
mod models;
|
2023-07-22 17:28:57 -04:00
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
use self::{errors::MyError, models::User};
|
2023-07-22 17:28:57 -04:00
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
pub async fn get_users(db_pool: web::Data<Pool>) -> Result<HttpResponse, Error> {
|
|
|
|
let client: Client = db_pool.get().await.map_err(MyError::PoolError)?;
|
2023-07-22 17:28:57 -04:00
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
let users = db::get_users(&client).await?;
|
2020-01-16 06:46:28 -05:00
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
Ok(HttpResponse::Ok().json(users))
|
2020-01-15 19:19:15 -05:00
|
|
|
}
|
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
pub async fn add_user(
|
|
|
|
user: web::Json<User>,
|
|
|
|
db_pool: web::Data<Pool>,
|
|
|
|
) -> Result<HttpResponse, Error> {
|
|
|
|
let user_info: User = user.into_inner();
|
2020-01-15 19:19:15 -05:00
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
let client: Client = db_pool.get().await.map_err(MyError::PoolError)?;
|
2022-07-09 21:08:11 +01:00
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
let new_user = db::add_user(&client, user_info).await?;
|
2023-07-22 17:28:57 -04:00
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
Ok(HttpResponse::Ok().json(new_user))
|
2020-01-15 19:19:15 -05:00
|
|
|
}
|
|
|
|
|
2020-09-12 16:49:45 +01:00
|
|
|
#[actix_web::main]
|
2020-01-15 19:19:15 -05:00
|
|
|
async fn main() -> std::io::Result<()> {
|
2020-01-16 18:41:45 +01:00
|
|
|
dotenv().ok();
|
2020-01-15 19:19:15 -05:00
|
|
|
|
2024-07-07 02:01:13 +01:00
|
|
|
let config = ExampleConfig::builder()
|
|
|
|
.override_with(EnvSource::new())
|
|
|
|
.try_build()
|
2022-06-07 19:51:42 -04:00
|
|
|
.unwrap();
|
|
|
|
|
2022-02-02 15:14:15 +00:00
|
|
|
let pool = config.pg.create_pool(None, NoTls).unwrap();
|
2020-01-15 19:19:15 -05:00
|
|
|
|
2020-01-16 06:46:28 -05:00
|
|
|
let server = HttpServer::new(move || {
|
2023-07-22 22:29:35 +01:00
|
|
|
App::new().app_data(web::Data::new(pool.clone())).service(
|
|
|
|
web::resource("/users")
|
|
|
|
.route(web::post().to(add_user))
|
|
|
|
.route(web::get().to(get_users)),
|
|
|
|
)
|
2020-01-16 06:46:28 -05:00
|
|
|
})
|
2020-01-16 18:41:45 +01:00
|
|
|
.bind(config.server_addr.clone())?
|
2020-01-16 06:46:28 -05:00
|
|
|
.run();
|
2020-01-16 18:41:45 +01:00
|
|
|
println!("Server running at http://{}/", config.server_addr);
|
2020-01-15 19:19:15 -05:00
|
|
|
|
|
|
|
server.await
|
|
|
|
}
|