111 lines
2.8 KiB
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
|
|
}
|