mirror of
https://github.com/actix/examples
synced 2025-02-23 17:53:02 +01:00
61 lines
1.5 KiB
Rust
61 lines
1.5 KiB
Rust
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;
|
|
|
|
use crate::config::ExampleConfig;
|
|
|
|
mod config;
|
|
mod db;
|
|
mod errors;
|
|
mod models;
|
|
|
|
use self::{errors::MyError, models::User};
|
|
|
|
pub async fn get_users(db_pool: web::Data<Pool>) -> Result<HttpResponse, Error> {
|
|
let client: Client = db_pool.get().await.map_err(MyError::PoolError)?;
|
|
|
|
let users = db::get_users(&client).await?;
|
|
|
|
Ok(HttpResponse::Ok().json(users))
|
|
}
|
|
|
|
pub async fn add_user(
|
|
user: web::Json<User>,
|
|
db_pool: web::Data<Pool>,
|
|
) -> Result<HttpResponse, Error> {
|
|
let user_info: User = user.into_inner();
|
|
|
|
let client: Client = db_pool.get().await.map_err(MyError::PoolError)?;
|
|
|
|
let new_user = db::add_user(&client, user_info).await?;
|
|
|
|
Ok(HttpResponse::Ok().json(new_user))
|
|
}
|
|
|
|
#[actix_web::main]
|
|
async fn main() -> std::io::Result<()> {
|
|
dotenv().ok();
|
|
|
|
let config = ExampleConfig::builder()
|
|
.override_with(EnvSource::new())
|
|
.try_build()
|
|
.unwrap();
|
|
|
|
let pool = config.pg.create_pool(None, NoTls).unwrap();
|
|
|
|
let server = HttpServer::new(move || {
|
|
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)),
|
|
)
|
|
})
|
|
.bind(config.server_addr.clone())?
|
|
.run();
|
|
println!("Server running at http://{}/", config.server_addr);
|
|
|
|
server.await
|
|
}
|