use actix_web::{ web::{self, Data, Json}, Result, Scope, }; use database_entity::dto::{ CreateTemplateCategoryParams, CreateTemplateCreatorParams, GetTemplateCategoriesQueryParams, GetTemplateCreatorsQueryParams, TemplateCategories, TemplateCategory, TemplateCreator, TemplateCreators, UpdateTemplateCategoryParams, UpdateTemplateCreatorParams, }; use shared_entity::response::{AppResponse, JsonAppResponse}; use uuid::Uuid; use crate::{ biz::template::ops::{ create_new_template_category, create_new_template_creator, delete_template_category, delete_template_creator, get_template_categories, get_template_category, get_template_creator, get_template_creators, update_template_category, update_template_creator, }, state::AppState, }; pub fn template_scope() -> Scope { web::scope("/api/template-center") .service( web::resource("/category") .route(web::post().to(post_template_category_handler)) .route(web::get().to(list_template_categories_handler)), ) .service( web::resource("/category/{category_id}") .route(web::put().to(update_template_category_handler)) .route(web::get().to(get_template_category_handler)) .route(web::delete().to(delete_template_category_handler)), ) .service( web::resource("/creator") .route(web::post().to(post_template_creator_handler)) .route(web::get().to(list_template_creators_handler)), ) .service( web::resource("/creator/{creator_id}") .route(web::put().to(update_template_creator_handler)) .route(web::get().to(get_template_creator_handler)) .route(web::delete().to(delete_template_creator_handler)), ) } async fn post_template_category_handler( data: Json, state: Data, ) -> Result> { let new_template_category = create_new_template_category( &state.pg_pool, &data.name, &data.description, &data.icon, &data.bg_color, data.category_type, data.priority, ) .await?; Ok(Json(AppResponse::Ok().with_data(new_template_category))) } async fn list_template_categories_handler( query: web::Query, state: Data, ) -> Result> { let categories = get_template_categories( &state.pg_pool, query.name_contains.as_deref(), query.category_type, ) .await?; Ok(Json( AppResponse::Ok().with_data(TemplateCategories { categories }), )) } async fn update_template_category_handler( category_id: web::Path, data: Json, state: Data, ) -> Result> { let category_id = category_id.into_inner(); let updated_template_category = update_template_category( &state.pg_pool, category_id, &data.name, &data.description, &data.icon, &data.bg_color, data.category_type, data.priority, ) .await?; Ok(Json(AppResponse::Ok().with_data(updated_template_category))) } async fn get_template_category_handler( category_id: web::Path, state: Data, ) -> Result> { let category_id = category_id.into_inner(); let category = get_template_category(&state.pg_pool, category_id).await?; Ok(Json(AppResponse::Ok().with_data(category))) } async fn delete_template_category_handler( category_id: web::Path, state: Data, ) -> Result> { let category_id = category_id.into_inner(); delete_template_category(&state.pg_pool, category_id).await?; Ok(Json(AppResponse::Ok())) } async fn post_template_creator_handler( data: Json, state: Data, ) -> Result> { let new_template_creator = create_new_template_creator( &state.pg_pool, &data.name, &data.avatar_url, &data.account_links, ) .await?; Ok(Json(AppResponse::Ok().with_data(new_template_creator))) } async fn list_template_creators_handler( query: web::Query, state: Data, ) -> Result> { let creators = get_template_creators(&state.pg_pool, &query.name_contains).await?; Ok(Json( AppResponse::Ok().with_data(TemplateCreators { creators }), )) } async fn update_template_creator_handler( creator_id: web::Path, data: Json, state: Data, ) -> Result> { let creator_id = creator_id.into_inner(); let updated_creator = update_template_creator( &state.pg_pool, creator_id, &data.name, &data.avatar_url, &data.account_links, ) .await?; Ok(Json(AppResponse::Ok().with_data(updated_creator))) } async fn get_template_creator_handler( creator_id: web::Path, state: Data, ) -> Result> { let creator_id = creator_id.into_inner(); let template_creator = get_template_creator(&state.pg_pool, creator_id).await?; Ok(Json(AppResponse::Ok().with_data(template_creator))) } async fn delete_template_creator_handler( creator_id: web::Path, state: Data, ) -> Result> { let creator_id = creator_id.into_inner(); delete_template_creator(&state.pg_pool, creator_id).await?; Ok(Json(AppResponse::Ok())) }