MIF_E31222379_BE/internal/repositories/address.go

84 lines
2.0 KiB
Go

package repositories
import (
"context"
"encoding/json"
"errors"
"fmt"
"time"
"github.com/pahmiudahgede/senggoldong/config"
"github.com/pahmiudahgede/senggoldong/domain"
)
func CreateAddress(address *domain.Address) error {
result := config.DB.Create(address)
if result.Error != nil {
return result.Error
}
cacheKey := fmt.Sprintf("address:user:%s", address.UserID)
config.RedisClient.Del(context.Background(), cacheKey)
return nil
}
func GetAddressesByUserID(userID string) ([]domain.Address, error) {
ctx := context.Background()
cacheKey := fmt.Sprintf("address:user:%s", userID)
cachedAddresses, err := config.RedisClient.Get(ctx, cacheKey).Result()
if err == nil {
var addresses []domain.Address
if json.Unmarshal([]byte(cachedAddresses), &addresses) == nil {
return addresses, nil
}
}
var addresses []domain.Address
err = config.DB.Where("user_id = ?", userID).Find(&addresses).Error
if err != nil {
return nil, err
}
addressesJSON, _ := json.Marshal(addresses)
config.RedisClient.Set(ctx, cacheKey, addressesJSON, time.Hour).Err()
return addresses, nil
}
func GetAddressByID(addressID string) (domain.Address, error) {
var address domain.Address
if err := config.DB.Where("id = ?", addressID).First(&address).Error; err != nil {
return address, errors.New("address not found")
}
return address, nil
}
func UpdateAddress(address domain.Address) (domain.Address, error) {
if err := config.DB.Save(&address).Error; err != nil {
return address, err
}
cacheKey := fmt.Sprintf("address:user:%s", address.UserID)
config.RedisClient.Del(context.Background(), cacheKey)
return address, nil
}
func DeleteAddress(addressID string) error {
var address domain.Address
if err := config.DB.Where("id = ?", addressID).First(&address).Error; err != nil {
return err
}
if err := config.DB.Delete(&address).Error; err != nil {
return err
}
cacheKey := fmt.Sprintf("address:user:%s", address.UserID)
config.RedisClient.Del(context.Background(), cacheKey)
return nil
}