From 8af97c0150925b5a26891033f443c0c9b703252c Mon Sep 17 00:00:00 2001 From: Buravit Yenjit Date: Tue, 1 Apr 2025 14:52:47 +0700 Subject: [PATCH] feat: add CreateRelatedArticle --- backend/internal/api/knowledgeHub.go | 37 +++++++++++++++++++ backend/internal/domain/knowledgeHub.go | 1 + .../repository/postgres_knowledgeHub.go | 24 ++++++++++++ 3 files changed, 62 insertions(+) diff --git a/backend/internal/api/knowledgeHub.go b/backend/internal/api/knowledgeHub.go index cf17cde..f0eb603 100644 --- a/backend/internal/api/knowledgeHub.go +++ b/backend/internal/api/knowledgeHub.go @@ -58,6 +58,13 @@ func (a *api) registerKnowledgeHubRoutes(_ chi.Router, api huma.API) { Path: prefix + "/{uuid}/related", Tags: tags, }, a.getArticleRelatedArticlesHandler) + + huma.Register(api, huma.Operation{ + OperationID: "createRelatedArticle", + Method: http.MethodPost, + Path: prefix + "/{uuid}/related", + Tags: tags, + }, a.createRelatedArticleHandler) } type GetKnowledgeArticlesOutput struct { @@ -102,6 +109,14 @@ type GetRelatedArticlesOutput struct { } `json:"body"` } +type CreateRelatedArticleInput struct { + UUID string `path:"uuid"` + Body struct { + RelatedTitle string `json:"related_title"` + RelatedTag string `json:"related_tag"` + } `json:"body"` +} + func (a *api) getAllKnowledgeArticlesHandler(ctx context.Context, input *struct{}) (*GetKnowledgeArticlesOutput, error) { resp := &GetKnowledgeArticlesOutput{} @@ -251,3 +266,25 @@ func (a *api) getArticleRelatedArticlesHandler(ctx context.Context, input *struc resp.Body.RelatedArticles = related return resp, nil } + +func (a *api) createRelatedArticleHandler( + ctx context.Context, + input *CreateRelatedArticleInput, +) (*struct{}, error) { + // Validate main article exists + if _, err := a.knowledgeHubRepo.GetArticleByID(ctx, input.UUID); err != nil { + return nil, huma.Error404NotFound("main article not found") + } + + // Create related article + related := &domain.RelatedArticle{ + RelatedTitle: input.Body.RelatedTitle, + RelatedTag: input.Body.RelatedTag, + } + + if err := a.knowledgeHubRepo.CreateRelatedArticle(ctx, input.UUID, related); err != nil { + return nil, huma.Error500InternalServerError("failed to create related article") + } + + return nil, nil // HTTP 204 No Content +} diff --git a/backend/internal/domain/knowledgeHub.go b/backend/internal/domain/knowledgeHub.go index 3a8a39f..45b4b22 100644 --- a/backend/internal/domain/knowledgeHub.go +++ b/backend/internal/domain/knowledgeHub.go @@ -55,4 +55,5 @@ type KnowledgeHubRepository interface { GetTableOfContents(ctx context.Context, articleID string) ([]TableOfContent, error) GetRelatedArticles(ctx context.Context, articleID string) ([]RelatedArticle, error) + CreateRelatedArticle(ctx context.Context, articleID string, related *RelatedArticle) error } diff --git a/backend/internal/repository/postgres_knowledgeHub.go b/backend/internal/repository/postgres_knowledgeHub.go index 8e4acb9..8e5018c 100644 --- a/backend/internal/repository/postgres_knowledgeHub.go +++ b/backend/internal/repository/postgres_knowledgeHub.go @@ -182,3 +182,27 @@ func (p *postgresKnowledgeHubRepository) GetRelatedArticles(ctx context.Context, return p.fetchRelatedArticles(ctx, query, articleID) } + +func (p *postgresKnowledgeHubRepository) CreateRelatedArticle( + ctx context.Context, + articleID string, + related *domain.RelatedArticle, +) error { + related.UUID = uuid.New().String() // Generate UUID + related.ArticleID = articleID // Link to main article + + query := ` + INSERT INTO related_articles + (uuid, article_id, related_title, related_tag, created_at, updated_at) + VALUES ($1, $2, $3, $4, NOW(), NOW())` + + _, err := p.conn.Exec( + ctx, + query, + related.UUID, + related.ArticleID, + related.RelatedTitle, + related.RelatedTag, + ) + return err +}