feat(api): added json body deserialization to the api endpoints
This commit is contained in:
parent
25934dff07
commit
49eb7cb524
|
@ -284,6 +284,7 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix-web",
|
"actix-web",
|
||||||
"anyhow",
|
"anyhow",
|
||||||
|
"serde",
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -895,6 +896,20 @@ name = "serde"
|
||||||
version = "1.0.183"
|
version = "1.0.183"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c"
|
checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.183"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn 2.0.28",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
|
|
|
@ -10,3 +10,4 @@ license = "MIT"
|
||||||
tokio = { version = "1.29", features = ["macros", "rt-multi-thread", "sync"] }
|
tokio = { version = "1.29", features = ["macros", "rt-multi-thread", "sync"] }
|
||||||
anyhow = "1.0"
|
anyhow = "1.0"
|
||||||
actix-web = "4"
|
actix-web = "4"
|
||||||
|
serde = { version = "1.0.183", features = ["derive"] }
|
||||||
|
|
38
src/api.rs
38
src/api.rs
|
@ -1,5 +1,6 @@
|
||||||
use actix_web::{post, web, App, HttpResponse, HttpServer, Responder};
|
use actix_web::{post, web, App, HttpResponse, HttpServer, Responder};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
|
use serde::Deserialize;
|
||||||
use tokio::sync::{mpsc, oneshot};
|
use tokio::sync::{mpsc, oneshot};
|
||||||
|
|
||||||
use crate::call::Call;
|
use crate::call::Call;
|
||||||
|
@ -8,11 +9,27 @@ struct ApiState {
|
||||||
tx: mpsc::Sender<(Call, oneshot::Sender<Result<()>>)>,
|
tx: mpsc::Sender<(Call, oneshot::Sender<Result<()>>)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
struct AuthenticateData {
|
||||||
|
username: String,
|
||||||
|
password: String,
|
||||||
|
}
|
||||||
|
|
||||||
#[post("/authenticate")]
|
#[post("/authenticate")]
|
||||||
async fn authenticate(data: web::Data<ApiState>) -> impl Responder {
|
async fn authenticate(
|
||||||
|
data: web::Data<ApiState>,
|
||||||
|
body: web::Json<AuthenticateData>,
|
||||||
|
) -> impl Responder {
|
||||||
let (tx, rx) = oneshot::channel();
|
let (tx, rx) = oneshot::channel();
|
||||||
|
|
||||||
if let Err(_) = data.tx.send((Call::Authenticate, tx)).await {
|
if let Err(_) = data
|
||||||
|
.tx
|
||||||
|
.send((
|
||||||
|
Call::Authenticate(body.username.clone(), body.password.clone()),
|
||||||
|
tx,
|
||||||
|
))
|
||||||
|
.await
|
||||||
|
{
|
||||||
return HttpResponse::InternalServerError().finish();
|
return HttpResponse::InternalServerError().finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,11 +39,24 @@ async fn authenticate(data: web::Data<ApiState>) -> impl Responder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize)]
|
||||||
|
struct RegisterData {
|
||||||
|
username: String,
|
||||||
|
password: String,
|
||||||
|
}
|
||||||
|
|
||||||
#[post("/register")]
|
#[post("/register")]
|
||||||
async fn register(data: web::Data<ApiState>) -> impl Responder {
|
async fn register(data: web::Data<ApiState>, body: web::Json<RegisterData>) -> impl Responder {
|
||||||
let (tx, rx) = oneshot::channel();
|
let (tx, rx) = oneshot::channel();
|
||||||
|
|
||||||
if let Err(_) = data.tx.send((Call::Register, tx)).await {
|
if let Err(_) = data
|
||||||
|
.tx
|
||||||
|
.send((
|
||||||
|
Call::Register(body.username.clone(), body.password.clone()),
|
||||||
|
tx,
|
||||||
|
))
|
||||||
|
.await
|
||||||
|
{
|
||||||
return HttpResponse::InternalServerError().finish();
|
return HttpResponse::InternalServerError().finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,9 @@ use tokio::sync::{mpsc, oneshot};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum Call {
|
pub enum Call {
|
||||||
Register,
|
Register(String, String),
|
||||||
Authenticate,
|
Authenticate(String, String),
|
||||||
Delete,
|
Delete(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn worker(mut rx: mpsc::Receiver<(Call, oneshot::Sender<Result<()>>)>) -> Result<()> {
|
async fn worker(mut rx: mpsc::Receiver<(Call, oneshot::Sender<Result<()>>)>) -> Result<()> {
|
||||||
|
|
Loading…
Reference in New Issue