From c6edcbd0096c34f5ff51c212d980f90171940786 Mon Sep 17 00:00:00 2001 From: Luke Harding Date: Fri, 3 May 2024 13:10:48 -0400 Subject: [PATCH] Setup create_task endpoint --- server/src/api/v1.rs | 36 ++++++++++++++++++++++++++++++++++-- server/src/db/mod.rs | 26 ++++++++++++++++++++++++++ server/src/db/models.rs | 11 +++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/server/src/api/v1.rs b/server/src/api/v1.rs index b5c92d8..4d9d2fc 100644 --- a/server/src/api/v1.rs +++ b/server/src/api/v1.rs @@ -1,11 +1,16 @@ -use actix_web::{get, HttpResponse, Responder, web}; +use actix_web::{get, HttpResponse, post, Responder, web}; +use chrono::NaiveDateTime; +use serde::Deserialize; use uuid::Uuid; use crate::api::AppState; use crate::db; pub fn configure(cfg: &mut web::ServiceConfig) { - let scope = web::scope("/v1").service(get_task).service(get_tasks); + let scope = web::scope("/v1") + .service(get_task) + .service(get_tasks) + .service(create_task); cfg.service(scope); } @@ -31,3 +36,30 @@ pub async fn get_task(data: web::Data, path: web::Path) -> impl HttpResponse::Ok().json(task) } + +#[derive(Deserialize)] +struct JsonTask { + pub title: String, + pub description: String, + pub due_date: NaiveDateTime, +} + +#[post("/create_task")] +pub async fn create_task(data: web::Data, task: web::Json) -> impl Responder { + let uuid = Uuid::new_v4(); + + let new_task = match db::create_task( + data.database_url.clone(), + uuid, + &task.title, + &task.description, + task.due_date, + ) + .await + { + Ok(task) => task, + Err(e) => return HttpResponse::InternalServerError().body(e.to_string()), + }; + + HttpResponse::Ok().json(new_task) +} diff --git a/server/src/db/mod.rs b/server/src/db/mod.rs index fdf2bcb..8529bf8 100644 --- a/server/src/db/mod.rs +++ b/server/src/db/mod.rs @@ -3,6 +3,7 @@ use std::error; +use chrono::NaiveDateTime; use diesel::{ Connection, ExpressionMethods, PgConnection, QueryDsl, RunQueryDsl, SelectableHelper, }; @@ -12,6 +13,9 @@ use uuid::Uuid; use models::Task; +use crate::db::models::NewTask; +use crate::schema::tasks; + pub mod models; pub const MIGRATIONS: EmbeddedMigrations = embed_migrations!("./migrations"); @@ -43,3 +47,25 @@ pub async fn get_task(database_url: String, uuid: Uuid) -> Result Result> { + let conn = &mut establish_connection(&database_url)?; + + let new_task = NewTask { + id: uuid, + title, + description, + due_date, + }; + + Ok(diesel::insert_into(tasks::table) + .values(&new_task) + .returning(Task::as_returning()) + .get_result(conn)?) +} diff --git a/server/src/db/models.rs b/server/src/db/models.rs index 9bf8642..3f15750 100644 --- a/server/src/db/models.rs +++ b/server/src/db/models.rs @@ -6,6 +6,8 @@ use diesel::prelude::*; use serde::{Deserialize, Serialize}; use uuid::Uuid; +use crate::schema::tasks; + #[derive(Queryable, Selectable, Serialize, Deserialize)] #[diesel(table_name = crate::schema::tasks)] #[diesel(check_for_backend(diesel::pg::Pg))] @@ -16,3 +18,12 @@ pub struct Task { pub complete: bool, pub due_date: NaiveDateTime, } + +#[derive(Insertable, Deserialize, Serialize)] +#[diesel(table_name = tasks)] +pub struct NewTask<'a> { + pub id: Uuid, + pub title: &'a str, + pub description: &'a str, + pub due_date: NaiveDateTime, +}