feat: add publish info to template

This commit is contained in:
khorshuheng 2024-10-22 17:29:20 +08:00
parent b7076d4f7e
commit ee9e335152
5 changed files with 69 additions and 18 deletions

View File

@ -2,8 +2,8 @@ use client_api_entity::{
AccountLink, CreateTemplateCategoryParams, CreateTemplateCreatorParams, CreateTemplateParams, AccountLink, CreateTemplateCategoryParams, CreateTemplateCreatorParams, CreateTemplateParams,
GetTemplateCategoriesQueryParams, GetTemplateCreatorsQueryParams, GetTemplatesQueryParams, GetTemplateCategoriesQueryParams, GetTemplateCreatorsQueryParams, GetTemplatesQueryParams,
Template, TemplateCategories, TemplateCategory, TemplateCategoryType, TemplateCreator, Template, TemplateCategories, TemplateCategory, TemplateCategoryType, TemplateCreator,
TemplateCreators, Templates, UpdateTemplateCategoryParams, UpdateTemplateCreatorParams, TemplateCreators, TemplateWithPublishInfo, Templates, UpdateTemplateCategoryParams,
UpdateTemplateParams, UpdateTemplateCreatorParams, UpdateTemplateParams,
}; };
use reqwest::Method; use reqwest::Method;
use shared_entity::response::{AppResponse, AppResponseError}; use shared_entity::response::{AppResponse, AppResponseError};
@ -231,7 +231,10 @@ impl Client {
.into_data() .into_data()
} }
pub async fn get_template(&self, view_id: Uuid) -> Result<Template, AppResponseError> { pub async fn get_template(
&self,
view_id: Uuid,
) -> Result<TemplateWithPublishInfo, AppResponseError> {
let url = template_resource_url(&self.base_url, view_id); let url = template_resource_url(&self.base_url, view_id);
let resp = self let resp = self
.http_client_without_auth(Method::GET, &url) .http_client_without_auth(Method::GET, &url)
@ -239,7 +242,7 @@ impl Client {
.send() .send()
.await?; .await?;
AppResponse::<Template>::from_response(resp) AppResponse::<TemplateWithPublishInfo>::from_response(resp)
.await? .await?
.into_data() .into_data()
} }

View File

@ -408,7 +408,7 @@ pub struct AFCollabMember {
pub permission: AFPermission, pub permission: AFPermission,
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct PublishInfo { pub struct PublishInfo {
pub namespace: Option<String>, pub namespace: Option<String>,
pub publish_name: String, pub publish_name: String,
@ -1220,7 +1220,7 @@ pub enum TemplateCategoryType {
Feature = 1, Feature = 1,
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TemplateCategory { pub struct TemplateCategory {
pub id: Uuid, pub id: Uuid,
pub name: String, pub name: String,
@ -1231,7 +1231,7 @@ pub struct TemplateCategory {
pub priority: i32, pub priority: i32,
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TemplateCategoryMinimal { pub struct TemplateCategoryMinimal {
pub id: Uuid, pub id: Uuid,
pub name: String, pub name: String,
@ -1270,13 +1270,13 @@ pub struct TemplateCreators {
pub creators: Vec<TemplateCreator>, pub creators: Vec<TemplateCreator>,
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug, Clone)]
pub struct AccountLink { pub struct AccountLink {
pub link_type: String, pub link_type: String,
pub url: String, pub url: String,
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TemplateCreator { pub struct TemplateCreator {
pub id: Uuid, pub id: Uuid,
pub name: String, pub name: String,
@ -1285,7 +1285,7 @@ pub struct TemplateCreator {
pub number_of_templates: i32, pub number_of_templates: i32,
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TemplateCreatorMinimal { pub struct TemplateCreatorMinimal {
pub id: Uuid, pub id: Uuid,
pub name: String, pub name: String,
@ -1328,6 +1328,43 @@ pub struct Template {
} }
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
pub struct TemplateWithPublishInfo {
pub view_id: Uuid,
pub created_at: DateTime<Utc>,
pub last_updated_at: DateTime<Utc>,
pub name: String,
pub description: String,
pub about: String,
pub view_url: String,
pub categories: Vec<TemplateCategory>,
pub creator: TemplateCreator,
pub is_new_template: bool,
pub is_featured: bool,
pub related_templates: Vec<TemplateMinimal>,
pub publish_info: PublishInfo,
}
impl TemplateWithPublishInfo {
pub fn from_template_and_publish_info(template: &Template, publish_info: &PublishInfo) -> Self {
Self {
view_id: template.view_id,
created_at: template.created_at,
last_updated_at: template.last_updated_at,
name: template.name.clone(),
description: template.description.clone(),
about: template.about.clone(),
view_url: template.view_url.clone(),
categories: template.categories.clone(),
creator: template.creator.clone(),
is_new_template: template.is_new_template,
is_featured: template.is_featured,
related_templates: template.related_templates.clone(),
publish_info: publish_info.clone(),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TemplateMinimal { pub struct TemplateMinimal {
pub view_id: Uuid, pub view_id: Uuid,
pub created_at: DateTime<Utc>, pub created_at: DateTime<Utc>,

View File

@ -8,8 +8,8 @@ use database_entity::dto::{
AvatarImageSource, CreateTemplateCategoryParams, CreateTemplateCreatorParams, AvatarImageSource, CreateTemplateCategoryParams, CreateTemplateCreatorParams,
CreateTemplateParams, GetTemplateCategoriesQueryParams, GetTemplateCreatorsQueryParams, CreateTemplateParams, GetTemplateCategoriesQueryParams, GetTemplateCreatorsQueryParams,
GetTemplatesQueryParams, Template, TemplateCategories, TemplateCategory, TemplateCreator, GetTemplatesQueryParams, Template, TemplateCategories, TemplateCategory, TemplateCreator,
TemplateCreators, TemplateHomePage, TemplateHomePageQueryParams, Templates, TemplateCreators, TemplateHomePage, TemplateHomePageQueryParams, TemplateWithPublishInfo,
UpdateTemplateCategoryParams, UpdateTemplateCreatorParams, UpdateTemplateParams, Templates, UpdateTemplateCategoryParams, UpdateTemplateCreatorParams, UpdateTemplateParams,
}; };
use reqwest::StatusCode; use reqwest::StatusCode;
use shared_entity::response::{AppResponse, JsonAppResponse}; use shared_entity::response::{AppResponse, JsonAppResponse};
@ -235,10 +235,10 @@ async fn list_templates_handler(
async fn get_template_handler( async fn get_template_handler(
view_id: web::Path<Uuid>, view_id: web::Path<Uuid>,
state: Data<AppState>, state: Data<AppState>,
) -> Result<JsonAppResponse<Template>> { ) -> Result<JsonAppResponse<TemplateWithPublishInfo>> {
let view_id = view_id.into_inner(); let view_id = view_id.into_inner();
let template = get_template(&state.pg_pool, view_id).await?; let template_with_pub_info = get_template_with_publish_info(&state.pg_pool, view_id).await?;
Ok(Json(AppResponse::Ok().with_data(template))) Ok(Json(AppResponse::Ok().with_data(template_with_pub_info)))
} }
async fn update_template_handler( async fn update_template_handler(

View File

@ -6,11 +6,12 @@ use app_error::ErrorCode;
use aws_sdk_s3::primitives::ByteStream; use aws_sdk_s3::primitives::ByteStream;
use database::{ use database::{
file::{s3_client_impl::AwsS3BucketClientImpl, BucketClient, ResponseBlob}, file::{s3_client_impl::AwsS3BucketClientImpl, BucketClient, ResponseBlob},
publish::select_published_collab_info,
template::*, template::*,
}; };
use database_entity::dto::{ use database_entity::dto::{
AccountLink, Template, TemplateCategory, TemplateCategoryType, TemplateCreator, TemplateHomePage, AccountLink, Template, TemplateCategory, TemplateCategoryType, TemplateCreator, TemplateHomePage,
TemplateMinimal, TemplateMinimal, TemplateWithPublishInfo,
}; };
use shared_entity::response::AppResponseError; use shared_entity::response::AppResponseError;
use sqlx::PgPool; use sqlx::PgPool;
@ -247,9 +248,15 @@ pub async fn get_templates(
Ok(templates) Ok(templates)
} }
pub async fn get_template(pg_pool: &PgPool, view_id: Uuid) -> Result<Template, AppResponseError> { pub async fn get_template_with_publish_info(
pg_pool: &PgPool,
view_id: Uuid,
) -> Result<TemplateWithPublishInfo, AppResponseError> {
let template = select_template_view_by_id(pg_pool, view_id).await?; let template = select_template_view_by_id(pg_pool, view_id).await?;
Ok(template) let pub_info = select_published_collab_info(pg_pool, &view_id).await?;
let template_with_pub_info =
TemplateWithPublishInfo::from_template_and_publish_info(&template, &pub_info);
Ok(template_with_pub_info)
} }
pub async fn delete_template(pg_pool: &PgPool, view_id: Uuid) -> Result<(), AppResponseError> { pub async fn delete_template(pg_pool: &PgPool, view_id: Uuid) -> Result<(), AppResponseError> {

View File

@ -392,6 +392,10 @@ async fn test_template_crud() {
assert_eq!(template.categories[0].id, category_2.id); assert_eq!(template.categories[0].id, category_2.id);
assert_eq!(template.related_templates.len(), 1); assert_eq!(template.related_templates.len(), 1);
assert_eq!(template.related_templates[0].view_id, published_view_ids[0]); assert_eq!(template.related_templates[0].view_id, published_view_ids[0]);
assert_eq!(
template.publish_info.namespace.unwrap(),
published_view_namespace.clone()
);
let params = UpdateTemplateParams { let params = UpdateTemplateParams {
name: format!("{}-{}", template_name_prefix, published_view_ids[3]), name: format!("{}-{}", template_name_prefix, published_view_ids[3]),