81 lines
2.6 KiB
Rust
81 lines
2.6 KiB
Rust
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<Arc<AppState>>,
|
|
Path(id): Path<u32>,
|
|
) -> (StatusCode, Json<Option<book_instance::Model>>) {
|
|
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<Arc<AppState>>,
|
|
Json(instance_payload): Json<BookInstanceCreateParams>,
|
|
) -> (StatusCode, Json<Option<book_instance::Model>>) {
|
|
|
|
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"))))
|
|
}
|
|
}
|