diff --git a/config/connection.go b/config/connection.go index 027aedb..aaf5522 100644 --- a/config/connection.go +++ b/config/connection.go @@ -31,6 +31,10 @@ var ( RedisDB int ) +func Context() context.Context { + return context.Background() +} + func InitConfig() { ServerHost = os.Getenv("SERVER_HOST") ServerPort = os.Getenv("SERVER_PORT") diff --git a/internal/repositories/banner.go b/internal/repositories/banner.go index c95c314..3a02432 100644 --- a/internal/repositories/banner.go +++ b/internal/repositories/banner.go @@ -1,6 +1,9 @@ package repositories import ( + "encoding/json" + "time" + "github.com/pahmiudahgede/senggoldong/config" "github.com/pahmiudahgede/senggoldong/domain" ) @@ -8,18 +11,52 @@ import ( func GetBanners() ([]domain.Banner, error) { var banners []domain.Banner + ctx := config.Context() + cachedBanners, err := config.RedisClient.Get(ctx, "banners").Result() + if err == nil && cachedBanners != "" { + + if err := json.Unmarshal([]byte(cachedBanners), &banners); err != nil { + return nil, err + } + return banners, nil + } + if err := config.DB.Find(&banners).Error; err != nil { return nil, err } + + bannersJSON, err := json.Marshal(banners) + if err != nil { + return nil, err + } + config.RedisClient.Set(ctx, "banners", bannersJSON, time.Hour).Err() + return banners, nil } func GetBannerByID(id string) (domain.Banner, error) { var banner domain.Banner + ctx := config.Context() + cachedBanner, err := config.RedisClient.Get(ctx, "banner:"+id).Result() + if err == nil && cachedBanner != "" { + + if err := json.Unmarshal([]byte(cachedBanner), &banner); err != nil { + return banner, err + } + return banner, nil + } + if err := config.DB.Where("id = ?", id).First(&banner).Error; err != nil { return banner, err } + + bannerJSON, err := json.Marshal(banner) + if err != nil { + return banner, err + } + config.RedisClient.Set(ctx, "banner:"+id, bannerJSON, time.Hour*24).Err() + return banner, nil } @@ -27,6 +64,8 @@ func CreateBanner(banner *domain.Banner) error { if err := config.DB.Create(banner).Error; err != nil { return err } + + config.RedisClient.Del(config.Context(), "banners") return nil } @@ -34,6 +73,9 @@ func UpdateBanner(banner *domain.Banner) error { if err := config.DB.Save(banner).Error; err != nil { return err } + + config.RedisClient.Del(config.Context(), "banners") + config.RedisClient.Del(config.Context(), "banner:"+banner.ID) return nil } @@ -41,5 +83,8 @@ func DeleteBanner(id string) error { if err := config.DB.Where("id = ?", id).Delete(&domain.Banner{}).Error; err != nil { return err } + + config.RedisClient.Del(config.Context(), "banners") + config.RedisClient.Del(config.Context(), "banner:"+id) return nil -} \ No newline at end of file +} diff --git a/internal/services/banner.go b/internal/services/banner.go index a6709b1..26d1bba 100644 --- a/internal/services/banner.go +++ b/internal/services/banner.go @@ -2,7 +2,6 @@ package services import ( "errors" - "github.com/pahmiudahgede/senggoldong/domain" "github.com/pahmiudahgede/senggoldong/internal/repositories" ) @@ -14,7 +13,6 @@ func GetBanners() ([]domain.Banner, error) { func GetBannerByID(id string) (domain.Banner, error) { banner, err := repositories.GetBannerByID(id) if err != nil { - return domain.Banner{}, errors.New("banner not found") } return banner, nil @@ -34,7 +32,6 @@ func CreateBanner(bannerName, bannerImage string) (domain.Banner, error) { } func UpdateBanner(id, bannerName, bannerImage string) (domain.Banner, error) { - banner, err := repositories.GetBannerByID(id) if err != nil { return domain.Banner{}, err @@ -51,7 +48,6 @@ func UpdateBanner(id, bannerName, bannerImage string) (domain.Banner, error) { } func DeleteBanner(id string) error { - _, err := repositories.GetBannerByID(id) if err != nil { return errors.New("banner not found")