diff --git a/internal/handler/article_handler.go b/internal/handler/article_handler.go index bc33c7f..976a3be 100644 --- a/internal/handler/article_handler.go +++ b/internal/handler/article_handler.go @@ -113,3 +113,17 @@ func (h *ArticleHandler) UpdateArticle(c *fiber.Ctx) error { return utils.SuccessResponse(c, articleResponse, "Article updated successfully") } + +func (h *ArticleHandler) DeleteArticle(c *fiber.Ctx) error { + id := c.Params("article_id") + if id == "" { + return utils.GenericResponse(c, fiber.StatusBadRequest, "Article ID is required") + } + + err := h.ArticleService.DeleteArticle(id) + if err != nil { + return utils.GenericResponse(c, fiber.StatusInternalServerError, err.Error()) + } + + return utils.GenericResponse(c, fiber.StatusOK, "Article deleted successfully") +} diff --git a/internal/repositories/article_repo.go b/internal/repositories/article_repo.go index 3f22c6e..79f2fcb 100644 --- a/internal/repositories/article_repo.go +++ b/internal/repositories/article_repo.go @@ -12,6 +12,7 @@ type ArticleRepository interface { FindArticleByID(id string) (*model.Article, error) FindAllArticles(page, limit int) ([]model.Article, int, error) UpdateArticle(id string, article *model.Article) error + DeleteArticle(id string) error } type articleRepository struct { @@ -66,3 +67,8 @@ func (r *articleRepository) FindAllArticles(page, limit int) ([]model.Article, i func (r *articleRepository) UpdateArticle(id string, article *model.Article) error { return r.DB.Model(&model.Article{}).Where("id = ?", id).Updates(article).Error } + +func (r *articleRepository) DeleteArticle(id string) error { + result := r.DB.Delete(&model.Article{}, "id = ?", id) + return result.Error +} \ No newline at end of file diff --git a/internal/services/article_service.go b/internal/services/article_service.go index a50df96..0515247 100644 --- a/internal/services/article_service.go +++ b/internal/services/article_service.go @@ -20,6 +20,7 @@ type ArticleService interface { GetAllArticles(page, limit int) ([]dto.ArticleResponseDTO, int, error) GetArticleByID(id string) (*dto.ArticleResponseDTO, error) UpdateArticle(id string, request dto.RequestArticleDTO, coverImage *multipart.FileHeader) (*dto.ArticleResponseDTO, error) + DeleteArticle(id string) error } type articleService struct { @@ -371,3 +372,25 @@ func (s *articleService) saveCoverImage(coverImage *multipart.FileHeader) (strin return coverImagePath, nil } + +func (s *articleService) DeleteArticle(id string) error { + + err := s.ArticleRepo.DeleteArticle(id) + if err != nil { + return fmt.Errorf("failed to delete article: %v", err) + } + + articleCacheKey := fmt.Sprintf("article:%s", id) + err = utils.DeleteData(articleCacheKey) + if err != nil { + fmt.Printf("Error deleting cache for article: %v\n", err) + } + + articlesCacheKey := "articles:all" + err = utils.DeleteData(articlesCacheKey) + if err != nil { + fmt.Printf("Error deleting cache for all articles: %v\n", err) + } + + return nil +} diff --git a/presentation/article_route.go b/presentation/article_route.go index f315f34..3d51dd0 100644 --- a/presentation/article_route.go +++ b/presentation/article_route.go @@ -21,4 +21,5 @@ func ArticleRouter(api fiber.Router) { articleAPI.Get("/view-article", articleHandler.GetAllArticles) articleAPI.Get("/view-article/:article_id", articleHandler.GetArticleByID) articleAPI.Put("/update-article/:article_id", middleware.AuthMiddleware, middleware.RoleMiddleware(utils.RoleAdministrator), articleHandler.UpdateArticle) + articleAPI.Delete("/delete-article/:article_id", middleware.AuthMiddleware, middleware.RoleMiddleware(utils.RoleAdministrator), articleHandler.DeleteArticle) }