use axum::{ Json, extract::{Path, State}, http::StatusCode, }; use common::auth::Claims; use common::models::{SaveNotePayload, StudentNote}; use sqlx::PgPool; use uuid::Uuid; pub async fn get_note( claims: Claims, Path(lesson_id): Path, State(pool): State, ) -> Result>, (StatusCode, String)> { let note = sqlx::query_as::<_, StudentNote>( "SELECT * FROM student_notes WHERE user_id = $1 AND lesson_id = $2", ) .bind(claims.sub) .bind(lesson_id) .fetch_optional(&pool) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?; Ok(Json(note)) } pub async fn save_note( claims: Claims, Path(lesson_id): Path, State(pool): State, Json(payload): Json, ) -> Result, (StatusCode, String)> { let note = sqlx::query_as::<_, StudentNote>( r#" INSERT INTO student_notes (user_id, lesson_id, content) VALUES ($1, $2, $3) ON CONFLICT (user_id, lesson_id) DO UPDATE SET content = EXCLUDED.content, updated_at = NOW() RETURNING * "#, ) .bind(claims.sub) .bind(lesson_id) .bind(payload.content) .fetch_one(&pool) .await .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?; Ok(Json(note)) }