- Add
actix-web , serde, serde_json, tokio, anyhow as a dependency.
[package]
name = "backend"
version = "0.1.0"
edition = "2024"
[dependencies]
actix-web = "4.12.0"
serde = "1.0.228"
serde_json = "1.0.145"
tokio = "1.48.0"
anyhow = "1.0.100"
[package]
name = "backend"
version = "0.1.0"
edition = "2024"
[dependencies]
actix-web = "4.12.0"
serde = "1.0.228"
serde_json = "1.0.145"
tokio = "1.48.0"
anyhow = "1.0.100"
db = { path = "../db" }
use anyhow::Result;
use actix_web::{web, App, HttpServer};
pub mod routes;
use routes::user::{create_user, sign_in};
#[actix_web::main]
async fn main() -> Result<()> {
dotenvy::dotenv().ok();
let store = db::Store::new().await?;
HttpServer::new(move || {
actix_web::App::new()
.service(web::scope("/api/v1")
.service(web::resource("/signup").route(web::post().to(create_user)))
.service(web::resource("/signin").route(web::post().to(sign_in))))
.app_data(web::Data::new(store.clone()))
})
.bind("0.0.0.0:8080")?
.run()
.await?;
Ok(())
}
use actix_web::{web, Result};
use db::Store;
use db::models::user::{CreateUserRequest, CreateUserResponse, GetUserRequest};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
pub struct SignInResponse {
pub token: String,
}
pub async fn create_user(data: web::Data<Store>, request: web::Json<CreateUserRequest>) -> Result<web::Json<CreateUserResponse>> {
let store = data.into_inner();
let user = store.create_user(request.into_inner()).await.map_err(|e| actix_web::error::ErrorInternalServerError(e.to_string()))?;
Ok(web::Json(user))
}
pub async fn sign_in(data: web::Data<Store>, request: web::Json<CreateUserRequest>) -> Result<web::Json<SignInResponse>> {
let store = data.into_inner();
let user = store.get_user(GetUserRequest { username: request.into_inner().username }).await.map_err(|e| actix_web::error::ErrorInternalServerError(e.to_string()))?;
let token = String::from(""); // add jwt logic here
Ok(web::Json(SignInResponse { token: token }))
}