From add274be1b9f5ff30d1bcfcbc3bbb661440cc56d Mon Sep 17 00:00:00 2001 From: SquidSpirit Date: Wed, 15 Oct 2025 22:01:25 +0800 Subject: [PATCH] feat: implement update label functionality with associated stores and API integration --- frontend/src/lib/container.ts | 12 +++++ .../label/adapter/gateway/labelApiService.ts | 2 + .../adapter/gateway/labelRepositoryImpl.ts | 8 +++ .../adapter/gateway/updateLabelRequestDto.ts | 26 ++++++++++ .../adapter/presenter/labelUpdatedStore.ts | 47 ++++++++++++++++++ .../application/gateway/labelRepository.ts | 6 +++ .../application/useCase/updateLabelUseCase.ts | 13 +++++ .../framework/api/labelApiServiceImpl.ts | 18 +++++++ .../ui/LabelContentDashboardPage.svelte | 49 ++++++++++++++++--- .../routes/dashboard/label/[id]/+page.svelte | 8 ++- 10 files changed, 180 insertions(+), 9 deletions(-) create mode 100644 frontend/src/lib/label/adapter/gateway/updateLabelRequestDto.ts create mode 100644 frontend/src/lib/label/adapter/presenter/labelUpdatedStore.ts create mode 100644 frontend/src/lib/label/application/useCase/updateLabelUseCase.ts diff --git a/frontend/src/lib/container.ts b/frontend/src/lib/container.ts index 1d2822f..5b61dc4 100644 --- a/frontend/src/lib/container.ts +++ b/frontend/src/lib/container.ts @@ -7,11 +7,13 @@ import { AuthApiServiceImpl } from '$lib/auth/framework/api/authApiServiceImpl'; import type { LabelApiService } from '$lib/label/adapter/gateway/labelApiService'; import { LabelRepositoryImpl } from '$lib/label/adapter/gateway/labelRepositoryImpl'; import { LabelCreatedStore } from '$lib/label/adapter/presenter/labelCreatedStore'; +import { LabelUpdatedStore } from '$lib/label/adapter/presenter/labelUpdatedStore'; import type { LabelViewModel } from '$lib/label/adapter/presenter/labelViewModel'; import { LabelsListedStore } from '$lib/label/adapter/presenter/labelsListedStore'; import type { LabelRepository } from '$lib/label/application/gateway/labelRepository'; import { CreateLabelUseCase } from '$lib/label/application/useCase/createLabelUseCase'; import { GetAllLabelsUseCase } from '$lib/label/application/useCase/getAllLabelsUseCase'; +import { UpdateLabelUseCase } from '$lib/label/application/useCase/updateLabelUseCase'; import { LabelApiServiceImpl } from '$lib/label/framework/api/labelApiServiceImpl'; import type { ImageApiService } from '$lib/image/adapter/gateway/imageApiService'; import { ImageRepositoryImpl } from '$lib/image/adapter/gateway/imageRepositoryImpl'; @@ -74,6 +76,10 @@ export class Container { createLabelCreatedStore(): LabelCreatedStore { return new LabelCreatedStore(this.useCases.createLabelUseCase); } + + createLabelUpdatedStore(): LabelUpdatedStore { + return new LabelUpdatedStore(this.useCases.updateLabelUseCase); + } } class ApiServices { @@ -153,6 +159,7 @@ class UseCases { private _getAllLabelsUseCase?: GetAllLabelsUseCase; private _getLabelUseCase?: GetLabelUseCase; private _createLabelUseCase?: CreateLabelUseCase; + private _updateLabelUseCase?: UpdateLabelUseCase; constructor(repositories: Repositories) { this.repositories = repositories; @@ -197,4 +204,9 @@ class UseCases { this._createLabelUseCase ??= new CreateLabelUseCase(this.repositories.labelRepository); return this._createLabelUseCase; } + + get updateLabelUseCase(): UpdateLabelUseCase { + this._updateLabelUseCase ??= new UpdateLabelUseCase(this.repositories.labelRepository); + return this._updateLabelUseCase; + } } diff --git a/frontend/src/lib/label/adapter/gateway/labelApiService.ts b/frontend/src/lib/label/adapter/gateway/labelApiService.ts index 68d79e5..2ddc196 100644 --- a/frontend/src/lib/label/adapter/gateway/labelApiService.ts +++ b/frontend/src/lib/label/adapter/gateway/labelApiService.ts @@ -1,8 +1,10 @@ import type { CreateLabelRequestDto } from '$lib/label/adapter/gateway/createLabelRequestDto'; import type { LabelResponseDto } from '$lib/label/adapter/gateway/labelResponseDto'; +import type { UpdateLabelRequestDto } from '$lib/label/adapter/gateway/updateLabelRequestDto'; export interface LabelApiService { getAllLabels(): Promise; getLabelById(id: number): Promise; createLabel(payload: CreateLabelRequestDto): Promise; + updateLabel(id: number, payload: UpdateLabelRequestDto): Promise; } diff --git a/frontend/src/lib/label/adapter/gateway/labelRepositoryImpl.ts b/frontend/src/lib/label/adapter/gateway/labelRepositoryImpl.ts index 8ff3642..31c4447 100644 --- a/frontend/src/lib/label/adapter/gateway/labelRepositoryImpl.ts +++ b/frontend/src/lib/label/adapter/gateway/labelRepositoryImpl.ts @@ -1,8 +1,10 @@ import { CreateLabelRequestDto } from '$lib/label/adapter/gateway/createLabelRequestDto'; import type { LabelApiService } from '$lib/label/adapter/gateway/labelApiService'; +import { UpdateLabelRequestDto } from '$lib/label/adapter/gateway/updateLabelRequestDto'; import type { CreateLabelParams, LabelRepository, + UpdateLabelParams, } from '$lib/label/application/gateway/labelRepository'; import type { Label } from '$lib/label/domain/entity/label'; @@ -24,4 +26,10 @@ export class LabelRepositoryImpl implements LabelRepository { const responseDto = await this.labelApiService.createLabel(requestDto); return responseDto.toEntity(); } + + async updateLabel(id: number, params: UpdateLabelParams): Promise