From 24a98f8f7060f1c214b0599ce7c85f084e4efcd1 Mon Sep 17 00:00:00 2001 From: SquidSpirit Date: Wed, 15 Oct 2025 04:21:13 +0800 Subject: [PATCH] BLOG-126 Post management (list and create) (#139) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Description - As the title ### Package Changes _No response_ ### Screenshots |Scenario|Screenshot| |-|-| |Posts list|![截圖 2025-10-15 凌晨4.09.28.png](/attachments/c8ad41e8-1065-4249-90e3-977bd36031e8)| |Empty input|![截圖 2025-10-15 凌晨4.10.12.png](/attachments/c902fdc0-4287-4b5d-9b9e-63dd6a5604a6)| |Pattern not matched|![截圖 2025-10-15 凌晨4.11.05.png](/attachments/88e4fb1d-6a69-4305-a94c-bd48982bb8a5)| ### Reference Resolve #126. ### Checklist - [x] A milestone is set - [x] The related issuse has been linked to this branch Reviewed-on: https://git.squidspirit.com/squid/blog/pulls/139 Co-authored-by: SquidSpirit Co-committed-by: SquidSpirit --- .../delivery/create_post_request_dto.rs | 4 +- .../delivery/post_info_response_dto.rs | 2 +- .../delivery/update_post_request_dto.rs | 4 +- .../adapter/gateway/post_info_db_mapper.rs | 2 +- .../post/src/domain/entity/post_info.rs | 2 +- .../db/post_info_with_label_record.rs | 2 +- .../framework/db/post_with_label_record.rs | 2 +- ...9_make_preview_image_url_nullable.down.sql | 2 + ...133149_make_preview_image_url_nullable.sql | 2 + frontend/src/app.d.ts | 4 +- frontend/src/hooks.server.ts | 28 +--- .../lib/auth/adapter/presenter/authBloc.ts | 59 ------- .../auth/adapter/presenter/authLoadedStore.ts | 41 +++++ .../auth/framework/api/authApiServiceImpl.ts | 8 +- .../common/adapter/presenter/asyncState.ts | 119 +++++++++++--- .../lib/common/adapter/presenter/baseStore.ts | 7 + .../framework/components/ui/table/index.ts | 28 ++++ .../components/ui/table/table-body.svelte | 20 +++ .../components/ui/table/table-caption.svelte | 20 +++ .../components/ui/table/table-cell.svelte | 23 +++ .../components/ui/table/table-footer.svelte | 20 +++ .../components/ui/table/table-head.svelte | 23 +++ .../components/ui/table/table-header.svelte | 20 +++ .../components/ui/table/table-row.svelte | 23 +++ .../components/ui/table/table.svelte | 22 +++ .../src/lib/common/framework/web/httpError.ts | 8 + .../common/framework/web/httpStatusCode.ts | 4 + frontend/src/lib/container.ts | 147 ++++++++++++++++++ .../src/lib/home/framework/ui/Motto.svelte | 2 +- .../lib/image/adapter/presenter/imageBloc.ts | 50 ------ .../adapter/presenter/imageUploadedStore.ts | 39 +++++ .../framework/api/imageApiServiceImpl.ts | 4 +- .../framework/ui/ImageManagementPage.svelte | 20 ++- .../framework/ui/UploadImageDialoag.svelte | 12 +- .../adapter/gateway/creatPostRequestDto.ts | 52 +++++++ .../post/adapter/gateway/postApiService.ts | 5 +- .../adapter/gateway/postInfoResponseDto.ts | 13 +- .../post/adapter/gateway/postListQueryDto.ts | 13 ++ .../adapter/gateway/postRepositoryImpl.ts | 20 ++- .../lib/post/adapter/presenter/postBloc.ts | 62 -------- .../adapter/presenter/postCreatedStore.ts | 47 ++++++ .../adapter/presenter/postInfoViewModel.ts | 15 +- .../post/adapter/presenter/postListBloc.ts | 55 ------- .../post/adapter/presenter/postLoadedStore.ts | 51 ++++++ .../adapter/presenter/postsListedStore.ts | 46 ++++++ .../application/gateway/postRepository.ts | 8 +- .../application/useCase/createPostUseCase.ts | 13 ++ .../application/useCase/getAllPostsUseCase.ts | 4 +- .../src/lib/post/domain/entity/postInfo.ts | 4 +- .../post/framework/api/postApiServiceImpl.ts | 40 ++++- .../post/framework/ui/CreatePostDialog.svelte | 107 +++++++++++++ .../post/framework/ui/PostContentPage.svelte | 30 ++-- .../framework/ui/PostManagementPage.svelte | 71 +++++++++ .../post/framework/ui/PostOverallPage.svelte | 9 +- .../lib/post/framework/ui/PostPreview.svelte | 10 +- .../post/framework/ui/StructuredData.svelte | 4 +- frontend/src/routes/+error.svelte | 2 +- frontend/src/routes/+layout.svelte | 5 + frontend/src/routes/+page.svelte | 2 +- frontend/src/routes/dashboard/+layout.svelte | 44 ++---- .../src/routes/dashboard/image/+page.svelte | 19 +-- .../src/routes/dashboard/post/+page.server.ts | 13 ++ .../src/routes/dashboard/post/+page.svelte | 22 ++- frontend/src/routes/post/+page.server.ts | 7 +- frontend/src/routes/post/+page.svelte | 22 +-- frontend/src/routes/post/[id]/+page.server.ts | 10 +- frontend/src/routes/post/[id]/+page.svelte | 20 +-- 67 files changed, 1177 insertions(+), 441 deletions(-) create mode 100644 backend/migrations/20251014133149_make_preview_image_url_nullable.down.sql create mode 100644 backend/migrations/20251014133149_make_preview_image_url_nullable.sql delete mode 100644 frontend/src/lib/auth/adapter/presenter/authBloc.ts create mode 100644 frontend/src/lib/auth/adapter/presenter/authLoadedStore.ts create mode 100644 frontend/src/lib/common/adapter/presenter/baseStore.ts create mode 100644 frontend/src/lib/common/framework/components/ui/table/index.ts create mode 100644 frontend/src/lib/common/framework/components/ui/table/table-body.svelte create mode 100644 frontend/src/lib/common/framework/components/ui/table/table-caption.svelte create mode 100644 frontend/src/lib/common/framework/components/ui/table/table-cell.svelte create mode 100644 frontend/src/lib/common/framework/components/ui/table/table-footer.svelte create mode 100644 frontend/src/lib/common/framework/components/ui/table/table-head.svelte create mode 100644 frontend/src/lib/common/framework/components/ui/table/table-header.svelte create mode 100644 frontend/src/lib/common/framework/components/ui/table/table-row.svelte create mode 100644 frontend/src/lib/common/framework/components/ui/table/table.svelte create mode 100644 frontend/src/lib/common/framework/web/httpError.ts create mode 100644 frontend/src/lib/common/framework/web/httpStatusCode.ts create mode 100644 frontend/src/lib/container.ts delete mode 100644 frontend/src/lib/image/adapter/presenter/imageBloc.ts create mode 100644 frontend/src/lib/image/adapter/presenter/imageUploadedStore.ts create mode 100644 frontend/src/lib/post/adapter/gateway/creatPostRequestDto.ts create mode 100644 frontend/src/lib/post/adapter/gateway/postListQueryDto.ts delete mode 100644 frontend/src/lib/post/adapter/presenter/postBloc.ts create mode 100644 frontend/src/lib/post/adapter/presenter/postCreatedStore.ts delete mode 100644 frontend/src/lib/post/adapter/presenter/postListBloc.ts create mode 100644 frontend/src/lib/post/adapter/presenter/postLoadedStore.ts create mode 100644 frontend/src/lib/post/adapter/presenter/postsListedStore.ts create mode 100644 frontend/src/lib/post/application/useCase/createPostUseCase.ts create mode 100644 frontend/src/lib/post/framework/ui/CreatePostDialog.svelte create mode 100644 frontend/src/lib/post/framework/ui/PostManagementPage.svelte create mode 100644 frontend/src/routes/dashboard/post/+page.server.ts diff --git a/backend/feature/post/src/adapter/delivery/create_post_request_dto.rs b/backend/feature/post/src/adapter/delivery/create_post_request_dto.rs index 874c059..3a2856b 100644 --- a/backend/feature/post/src/adapter/delivery/create_post_request_dto.rs +++ b/backend/feature/post/src/adapter/delivery/create_post_request_dto.rs @@ -12,8 +12,8 @@ pub struct CreatePostRequestDto { pub content: String, pub label_ids: Vec, - #[schema(format = Uri)] - pub preview_image_url: String, + #[schema(required, format = Uri)] + pub preview_image_url: Option, #[schema(required, format = DateTime)] pub published_time: Option, diff --git a/backend/feature/post/src/adapter/delivery/post_info_response_dto.rs b/backend/feature/post/src/adapter/delivery/post_info_response_dto.rs index bb83498..7553423 100644 --- a/backend/feature/post/src/adapter/delivery/post_info_response_dto.rs +++ b/backend/feature/post/src/adapter/delivery/post_info_response_dto.rs @@ -14,7 +14,7 @@ pub struct PostInfoResponseDto { pub labels: Vec, #[schema(format = Uri)] - pub preview_image_url: String, + pub preview_image_url: Option, #[schema(format = DateTime)] pub published_time: Option, diff --git a/backend/feature/post/src/adapter/delivery/update_post_request_dto.rs b/backend/feature/post/src/adapter/delivery/update_post_request_dto.rs index 5f93c5f..b5e839b 100644 --- a/backend/feature/post/src/adapter/delivery/update_post_request_dto.rs +++ b/backend/feature/post/src/adapter/delivery/update_post_request_dto.rs @@ -12,8 +12,8 @@ pub struct UpdatePostRequestDto { pub content: String, pub label_ids: Vec, - #[schema(format = Uri)] - pub preview_image_url: String, + #[schema(required, format = Uri)] + pub preview_image_url: Option, #[schema(required, format = DateTime)] pub published_time: Option, diff --git a/backend/feature/post/src/adapter/gateway/post_info_db_mapper.rs b/backend/feature/post/src/adapter/gateway/post_info_db_mapper.rs index 6663175..9478738 100644 --- a/backend/feature/post/src/adapter/gateway/post_info_db_mapper.rs +++ b/backend/feature/post/src/adapter/gateway/post_info_db_mapper.rs @@ -7,7 +7,7 @@ pub struct PostInfoMapper { pub semantic_id: String, pub title: String, pub description: String, - pub preview_image_url: String, + pub preview_image_url: Option, pub published_time: Option, pub labels: Vec, } diff --git a/backend/feature/post/src/domain/entity/post_info.rs b/backend/feature/post/src/domain/entity/post_info.rs index 922be11..3aebd5a 100644 --- a/backend/feature/post/src/domain/entity/post_info.rs +++ b/backend/feature/post/src/domain/entity/post_info.rs @@ -10,7 +10,7 @@ pub struct PostInfo { pub semantic_id: String, pub title: String, pub description: String, - pub preview_image_url: String, + pub preview_image_url: Option, pub labels: Vec