MIF_E31222379_BE/internal/services/address.go

111 lines
2.8 KiB
Go

package services
import (
"context"
"encoding/json"
"errors"
"fmt"
"time"
"github.com/pahmiudahgede/senggoldong/config"
"github.com/pahmiudahgede/senggoldong/domain"
"github.com/pahmiudahgede/senggoldong/dto"
"github.com/pahmiudahgede/senggoldong/internal/repositories"
)
func CreateAddress(userID string, input dto.AddressInput) (domain.Address, error) {
address := domain.Address{
UserID: userID,
Province: input.Province,
District: input.District,
Subdistrict: input.Subdistrict,
PostalCode: input.PostalCode,
Village: input.Village,
Detail: input.Detail,
Geography: input.Geography,
}
err := repositories.CreateAddress(&address)
if err != nil {
return domain.Address{}, err
}
cacheKey := fmt.Sprintf("address:user:%s", userID)
config.RedisClient.Del(context.Background(), cacheKey)
return address, nil
}
func GetAllAddressesByUserID(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
}
}
addresses, err := repositories.GetAddressesByUserID(userID)
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) {
address, err := repositories.GetAddressByID(addressID)
if err != nil {
return address, errors.New("address not found")
}
return address, nil
}
func UpdateAddress(addressID string, input dto.AddressInput) (domain.Address, error) {
address, err := repositories.GetAddressByID(addressID)
if err != nil {
return address, errors.New("address not found")
}
address.Province = input.Province
address.District = input.District
address.Subdistrict = input.Subdistrict
address.PostalCode = input.PostalCode
address.Village = input.Village
address.Detail = input.Detail
address.Geography = input.Geography
updatedAddress, err := repositories.UpdateAddress(address)
if err != nil {
return updatedAddress, errors.New("failed to update address")
}
cacheKey := fmt.Sprintf("address:user:%s", address.UserID)
config.RedisClient.Del(context.Background(), cacheKey)
return updatedAddress, nil
}
func DeleteAddress(addressID string) error {
address, err := repositories.GetAddressByID(addressID)
if err != nil {
return errors.New("address not found")
}
err = repositories.DeleteAddress(addressID)
if err != nil {
return errors.New("failed to delete address")
}
cacheKey := fmt.Sprintf("address:user:%s", address.UserID)
config.RedisClient.Del(context.Background(), cacheKey)
return nil
}