171 lines
4.4 KiB
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
|
|
}
|