1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| use axum::{ extract::{Path, State}, http::StatusCode, Json, }; use serde::{Deserialize, Serialize}; use serde_json::{json, Value}; use sqlx_core::sqlite::SqlitePool; #[derive(Serialize, Deserialize)] pub struct NewPost { title: String, body: String, } #[derive(Serialize, Deserialize, sqlx::FromRow)] pub struct Post { id: i32, title: String, body: String, } pub async fn create_post( State(pool): State<SqlitePool>, Json(product): Json<NewPost>, ) -> Result<Json<Value>, (StatusCode, String)> { let resp = sqlx::query("INSERT INTO posts (title, body) values ($1, $2)") .bind(&product.title) .bind(&product.body) .execute(&pool) .await .map_err(|err| { ( StatusCode::INTERNAL_SERVER_ERROR, format!("エラー: {}", err), ) })?; Ok(Json(json!(product))) } pub async fn get_posts( State(pool): State<SqlitePool>, ) -> Result<Json<Vec<Post>>, (StatusCode, String)> { let result = sqlx::query_as("SELECT * from posts") .fetch_all(&pool) .await .map_err(|err| { ( StatusCode::INTERNAL_SERVER_ERROR, format!("エラー: {}", err), ) })?; Ok(Json(result)) } pub async fn get_one_post( State(pool): State<SqlitePool>, Path(id): Path<i32>, ) -> Result<Json<Post>, (StatusCode, String)> { let result = sqlx::query_as("SELECT * FROM posts WHERE id = $1") .bind(id) .fetch_one(&pool) .await .map_err(|err| match err { sqlx::Error::RowNotFound => (StatusCode::NOT_FOUND, format!("エラー: {}", err)), _ => ( StatusCode::INTERNAL_SERVER_ERROR, format!("エラー: {}", err), ), })?; Ok(Json(result)) } pub async fn delete_post( State(pool): State<SqlitePool>, Path(id): Path<i32>, ) -> Result<Json<Value>, (StatusCode, String)> { let result = sqlx::query("DELETE FROM posts WHERE id = $1") .bind(id) .execute(&pool) .await .map_err(|err| match err { sqlx::Error::RowNotFound => (StatusCode::NOT_FOUND, format!("エラー: {}", err)), _ => ( StatusCode::INTERNAL_SERVER_ERROR, format!("エラー: {}", err), ), })?; Ok(Json(json!({"msg": "投稿が正常に削除されました"}))) } pub async fn update_post( State(pool): State<SqlitePool>, Path(id): Path<i32>, Json(product): Json<Post>, ) -> Result<Json<Value>, (StatusCode, String)> { let result = sqlx::query("UPDATE posts SET title=$1, body=$2 WHERE id=$3") .bind(&product.title) .bind(&product.body) .bind(id) .execute(&pool) .await .map_err(|err| match err { sqlx::Error::RowNotFound => (StatusCode::NOT_FOUND, format!("エラー: {}", err)), _ => ( StatusCode::INTERNAL_SERVER_ERROR, format!("エラー: {}", err), ), })?; Ok(Json(json!({"msg": "投稿が正常に更新されました"}))) }
|