Files
openccb/services/lms-service/src/handlers_notes.rs
T

54 lines
1.4 KiB
Rust

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<Uuid>,
State(pool): State<PgPool>,
) -> Result<Json<Option<StudentNote>>, (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<Uuid>,
State(pool): State<PgPool>,
Json(payload): Json<SaveNotePayload>,
) -> Result<Json<StudentNote>, (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))
}