MIF_E31222379_BE/internal/services/banner.go

171 lines
4.4 KiB
Go

package services
import (
"encoding/json"
"errors"
"time"
"github.com/pahmiudahgede/senggoldong/config"
"github.com/pahmiudahgede/senggoldong/domain"
"github.com/pahmiudahgede/senggoldong/dto"
"github.com/pahmiudahgede/senggoldong/internal/repositories"
"github.com/pahmiudahgede/senggoldong/utils"
)
type BannerService struct {
repo *repositories.BannerRepository
}
func NewBannerService(repo *repositories.BannerRepository) *BannerService {
return &BannerService{repo: repo}
}
func (s *BannerService) GetAllBanners() ([]dto.BannerResponse, error) {
ctx := config.Context()
cacheKey := "banners:all"
cachedData, err := config.RedisClient.Get(ctx, cacheKey).Result()
if err == nil && cachedData != "" {
var cachedBanners []dto.BannerResponse
if err := json.Unmarshal([]byte(cachedData), &cachedBanners); err == nil {
return cachedBanners, nil
}
}
banners, err := s.repo.GetAll()
if err != nil {
return nil, err
}
var result []dto.BannerResponse
for _, banner := range banners {
result = append(result, dto.BannerResponse{
ID: banner.ID,
BannerName: banner.BannerName,
BannerImage: banner.BannerImage,
CreatedAt: utils.FormatDateToIndonesianFormat(banner.CreatedAt),
UpdatedAt: utils.FormatDateToIndonesianFormat(banner.UpdatedAt),
})
}
cacheData, _ := json.Marshal(result)
config.RedisClient.Set(ctx, cacheKey, cacheData, time.Minute*5)
return result, nil
}
func (s *BannerService) GetBannerByID(id string) (*dto.BannerResponse, error) {
ctx := config.Context()
cacheKey := "banners:" + id
cachedData, err := config.RedisClient.Get(ctx, cacheKey).Result()
if err == nil && cachedData != "" {
var cachedBanner dto.BannerResponse
if err := json.Unmarshal([]byte(cachedData), &cachedBanner); err == nil {
return &cachedBanner, nil
}
}
banner, err := s.repo.GetByID(id)
if err != nil {
return nil, err
}
result := &dto.BannerResponse{
ID: banner.ID,
BannerName: banner.BannerName,
BannerImage: banner.BannerImage,
CreatedAt: utils.FormatDateToIndonesianFormat(banner.CreatedAt),
UpdatedAt: utils.FormatDateToIndonesianFormat(banner.UpdatedAt),
}
cacheData, _ := json.Marshal(result)
config.RedisClient.Set(ctx, cacheKey, cacheData, time.Minute*5)
return result, nil
}
func (s *BannerService) CreateBanner(request *dto.BannerCreateRequest) (*dto.BannerResponse, error) {
if request.BannerName == "" || request.BannerImage == "" {
return nil, errors.New("invalid input data")
}
newBanner := &domain.Banner{
BannerName: request.BannerName,
BannerImage: request.BannerImage,
}
err := s.repo.Create(newBanner)
if err != nil {
return nil, errors.New("failed to create banner")
}
ctx := config.Context()
config.RedisClient.Del(ctx, "banners:all")
response := &dto.BannerResponse{
ID: newBanner.ID,
BannerName: newBanner.BannerName,
BannerImage: newBanner.BannerImage,
CreatedAt: utils.FormatDateToIndonesianFormat(newBanner.CreatedAt),
UpdatedAt: utils.FormatDateToIndonesianFormat(newBanner.UpdatedAt),
}
return response, nil
}
func (s *BannerService) UpdateBanner(id string, request *dto.BannerUpdateRequest) (*dto.BannerResponse, error) {
banner, err := s.repo.GetByID(id)
if err != nil {
return nil, errors.New("banner not found")
}
if request.BannerName != nil && *request.BannerName != "" {
banner.BannerName = *request.BannerName
}
if request.BannerImage != nil && *request.BannerImage != "" {
banner.BannerImage = *request.BannerImage
}
banner.UpdatedAt = time.Now()
err = s.repo.Update(banner)
if err != nil {
return nil, errors.New("failed to update banner")
}
ctx := config.Context()
config.RedisClient.Del(ctx, "banners:all")
config.RedisClient.Del(ctx, "banners:"+id)
response := &dto.BannerResponse{
ID: banner.ID,
BannerName: banner.BannerName,
BannerImage: banner.BannerImage,
CreatedAt: utils.FormatDateToIndonesianFormat(banner.CreatedAt),
UpdatedAt: utils.FormatDateToIndonesianFormat(banner.UpdatedAt),
}
return response, nil
}
func (s *BannerService) DeleteBanner(id string) error {
banner, err := s.repo.GetByID(id)
if err != nil {
return errors.New("banner not found")
}
err = s.repo.Delete(banner)
if err != nil {
return errors.New("failed to delete banner")
}
ctx := config.Context()
config.RedisClient.Del(ctx, "banners:all")
config.RedisClient.Del(ctx, "banners:"+id)
return nil
}