From 41214d850107af36e16df9888fce61b4d2b628ee Mon Sep 17 00:00:00 2001 From: Alexander Ng Date: Thu, 12 Dec 2024 15:56:01 -0800 Subject: [PATCH] finalized exercise creation endpoint --- gen.ts | 2 ++ src/extractors/jwt.rs | 5 ---- src/v1/exercises/create.rs | 55 +++++++++++++++++++++++++++++++++++--- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/gen.ts b/gen.ts index b72bcea..87a5f4f 100644 --- a/gen.ts +++ b/gen.ts @@ -47,6 +47,7 @@ const data: MuscleGroup[] = [ muscles: [ { colloquial_name: "Biceps", scientific_name: "Biceps brachii" }, { colloquial_name: "Brachialis", scientific_name: "Brachialis" }, + // TODO: add all 3 tricep heads, since you can easily bias them { colloquial_name: "Triceps", scientific_name: "Triceps brachii" }, { colloquial_name: "Brachioradialis", scientific_name: "Brachioradialis" }, { colloquial_name: "Forearm Flexors/Extensors", scientific_name: "Flexor and extensor muscles of the forearm" } @@ -56,6 +57,7 @@ const data: MuscleGroup[] = [ major_group: "Core", group_name: "Abdominals", muscles: [ + // TODO: add upper and lower core muscles { colloquial_name: "Abs", scientific_name: "Rectus abdominis" }, { colloquial_name: "Transverse Abs", scientific_name: "Transversus abdominis" }, { colloquial_name: "External Obliques", scientific_name: "Obliquus externus abdominis" }, diff --git a/src/extractors/jwt.rs b/src/extractors/jwt.rs index 681423b..a7425ef 100644 --- a/src/extractors/jwt.rs +++ b/src/extractors/jwt.rs @@ -1,16 +1,11 @@ -use std::sync::Arc; - use crate::*; -use anyhow::bail; use axum::{ async_trait, extract::{FromRef, FromRequestParts}, http::{header, request::Parts}, }; -use chrono::{DateTime, Utc}; use jwt::VerifyWithKey; -use sqlx::types::Uuid; use util::auth::JWTClaims; pub struct JWT(JWTClaims); diff --git a/src/v1/exercises/create.rs b/src/v1/exercises/create.rs index 8cbb576..44dce33 100644 --- a/src/v1/exercises/create.rs +++ b/src/v1/exercises/create.rs @@ -28,6 +28,12 @@ pub struct Exercise { pub created_at: NaiveDateTime, } +#[derive(Debug, Deserialize, Serialize)] +pub struct Muscle { + pub id: Uuid, + pub is_primary: bool, +} + #[utoipa::path(post, path = "/create", responses((status = OK, body = String)), tag = super::EXERCISES_TAG)] pub async fn create( State(state): State, @@ -39,10 +45,37 @@ pub async fn create( .await? .is_admin; - query!( + let muscles: Vec = body + .primary_muscles + .iter() + .map(|id| -> anyhow::Result { + let uuid = Uuid::parse_str(id)?; + Ok(Muscle { + id: uuid, + is_primary: true, + }) + }) + .chain( + body.secondary_muscles + .iter() + .map(|id| -> anyhow::Result { + let uuid = Uuid::parse_str(id)?; + Ok(Muscle { + id: uuid, + is_primary: false, + }) + }), + ) + .collect::, _>>() + .context("Failed to parse muscle ids")?; + + let mut tx = state.db.begin().await?; + + let exercise = query!( r#" INSERT INTO exercises (name, exercise_type, official, author_id, description) VALUES ($1, $2, $3, $4, $5) + RETURNING id "#, body.name, body.exercise_type as ExerciseType, @@ -50,8 +83,24 @@ pub async fn create( user, body.description ) - .fetch_one(&*state.db) + .fetch_one(&mut *tx) + // .fetch_one(&*state.db) .await?; - todo!() + query!( + r#" + INSERT INTO exercise_muscle_relations (exercise_id, muscle_id, is_primary) + SELECT * FROM UNNEST($1::uuid[], $2::uuid[], $3::boolean[]) + "#, + &vec![exercise.id; muscles.len()], + &muscles.iter().map(|m| m.id).collect::>(), + &muscles.iter().map(|m| m.is_primary).collect::>() + ) + .execute(&mut *tx) + // .execute(&*state.db) + .await?; + + tx.commit().await?; + + Ok(exercise.id.to_string()) }