use std::sync::Arc; use axum::{extract::{Path, State}, Json}; use reqwest::{StatusCode}; use sea_orm::{ActiveModelTrait, ActiveValue::Set, EntityTrait, TryIntoModel}; use serde::{Deserialize, Serialize}; use utoipa::IntoParams; use crate::{entities::{book_instance, prelude::BookInstance}, AppState}; #[derive(IntoParams)] #[into_params(names("id"), parameter_in = Path)] #[allow(dead_code)] struct BookInstanceByIdParams(u32); #[axum::debug_handler] #[utoipa::path( get, path = "/book_instance/id/{id}", params(BookInstanceByIdParams), responses( (status = OK, body = book_instance::Model, description = "Found book instance with corresponding ID in the database"), (status = NOT_FOUND, description = "No book instance with this id exists in the database") ), summary = "Get a book instance by its ID", description = "Get a book instance from its ID", tag = "book-instance-api", )] pub async fn get_book_instance_by_id( State(state): State>, Path(id): Path, ) -> (StatusCode, Json>) { if let Ok(Some(res)) = BookInstance::find_by_id(id).one(state.db_conn.as_ref()).await { (StatusCode::OK, Json(Some(res))) } else { (StatusCode::NOT_FOUND, Json(None)) } } #[derive(Deserialize, Serialize, utoipa::ToSchema)] pub struct BookInstanceCreateParams { book_id: u32, owner_id: u32, price: i32, } #[axum::debug_handler] #[utoipa::path( post, path = "/book_instance", request_body = BookInstanceCreateParams, responses( (status = OK, body = book_instance::Model, description = "Successfully created book instance"), ), summary = "Create a new book instance", description = "Create a new book instance", tag = "book-instance-api", )] pub async fn create_book_instance( State(state): State>, Json(instance_payload): Json, ) -> (StatusCode, Json>) { let book_instance = book_instance::ActiveModel { book_id: Set(instance_payload.book_id), owner_id: Set(instance_payload.owner_id), price: Set(instance_payload.price), status: Set(book_instance::BookStatus::Available), ..Default::default() }; let b = book_instance.save(state.db_conn.as_ref()).await; match b { Err(e) => { println!("Error while inserting new book instance: {:#?}", e); (StatusCode::BAD_REQUEST, Json(None)) }, Ok(res) => (StatusCode::OK, Json(Some(res.try_into_model().expect("All fields should be set once the book instance is saved")))) } }