123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- package admin
- import (
- "context"
- "git.dmitriygnatenko.ru/dima/go-common/db"
- "git.dmitriygnatenko.ru/dima/go-common/logger"
- "github.com/gofiber/fiber/v2"
- customErrors "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/helper/errors"
- "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/helper/request"
- "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/model"
- "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/service/handler"
- "git.dmitriygnatenko.ru/dima/dmitriygnatenko-v2/internal/service/i18n"
- )
- type deleteArticlePage struct {
- tm TransactionManager
- articleRepository ArticleRepository
- articleTagRepository ArticleTagRepository
- cacheService CacheService
- }
- func NewDeleteArticlePageHandler(
- tm TransactionManager,
- articleRepository ArticleRepository,
- articleTagRepository ArticleTagRepository,
- cacheService CacheService,
- ) fiber.Handler {
- h := deleteArticlePage{
- tm: tm,
- articleRepository: articleRepository,
- articleTagRepository: articleTagRepository,
- cacheService: cacheService,
- }
- return h.handler()
- }
- func (h deleteArticlePage) handler() fiber.Handler {
- return func(fctx *fiber.Ctx) error {
- ctx := fctx.Context()
- lang := i18n.LanguageFromContext(fctx)
- articleID, err := request.ConvertToUint64(fctx, "id")
- if err != nil {
- logger.Error(ctx, customErrors.Wrap(err, "delete article page: can't get id from request").Error())
- return err
- }
- article, err := h.getArticle(ctx, articleID)
- if err != nil {
- return err // logging in the getArticle method
- }
- if fctx.Method() == fiber.MethodPost {
- err = h.tm.ReadCommitted(ctx, func(ctx context.Context) error {
- txErr := h.articleTagRepository.DeleteByArticleID(ctx, articleID)
- if txErr != nil {
- return customErrors.Wrap(txErr, "can't delete tags")
- }
- txErr = h.articleRepository.Delete(ctx, articleID)
- if txErr != nil {
- return customErrors.Wrap(txErr, "can't delete article")
- }
- return nil
- })
- if err != nil {
- logger.Error(ctx, customErrors.Wrap(err, "delete article page").Error())
- return err
- }
- articleLang := string(i18n.LanguageFromID(article.Language))
- h.cacheService.Delete(handler.ArticleCacheKey + article.URL + articleLang)
- h.cacheService.Delete(handler.RecentArticlesCacheKey + articleLang)
- h.cacheService.Delete(handler.UsedTagsCacheKey + articleLang)
- h.cacheService.Delete(handler.AllPreviewArticlesCacheKey + articleLang)
- return fctx.Redirect("/admin")
- }
- return fctx.Render("admin/article_delete", fiber.Map{
- "lang": lang,
- "section": "article",
- "article": article.Title,
- }, "admin/_layout")
- }
- }
- func (h deleteArticlePage) getArticle(ctx context.Context, id uint64) (*model.Article, error) {
- article, err := h.articleRepository.GetByID(ctx, id)
- if err != nil {
- if db.IsNotFoundError(err) {
- return nil, fiber.ErrNotFound
- }
- logger.Error(ctx, customErrors.Wrap(err, "delete article page: can't get article").Error())
- return nil, err
- }
- return article, nil
- }
|