MIF_E31222379_BE/internal/services/address_service.go

89 lines
2.4 KiB
Go

package services
import (
"fmt"
"github.com/pahmiudahgede/senggoldong/dto"
"github.com/pahmiudahgede/senggoldong/internal/repositories"
"github.com/pahmiudahgede/senggoldong/model"
"github.com/pahmiudahgede/senggoldong/utils"
)
type AddressService interface {
CreateAddress(userID string, request dto.CreateAddressDTO) (*dto.AddressResponseDTO, error)
}
type addressService struct {
AddressRepo repositories.AddressRepository
WilayahRepo repositories.WilayahIndonesiaRepository
}
func NewAddressService(addressRepo repositories.AddressRepository, wilayahRepo repositories.WilayahIndonesiaRepository) AddressService {
return &addressService{
AddressRepo: addressRepo,
WilayahRepo: wilayahRepo,
}
}
func (s *addressService) CreateAddress(userID string, request dto.CreateAddressDTO) (*dto.AddressResponseDTO, error) {
errors, valid := request.Validate()
if !valid {
return nil, fmt.Errorf("validation failed: %v", errors)
}
province, _, err := s.WilayahRepo.FindProvinceByID(request.Province, 0, 0)
if err != nil {
return nil, fmt.Errorf("invalid province_id")
}
regency, _, err := s.WilayahRepo.FindRegencyByID(request.Regency, 0, 0)
if err != nil {
return nil, fmt.Errorf("invalid regency_id")
}
district, _, err := s.WilayahRepo.FindDistrictByID(request.District, 0, 0)
if err != nil {
return nil, fmt.Errorf("invalid district_id")
}
village, err := s.WilayahRepo.FindVillageByID(request.Village)
if err != nil {
return nil, fmt.Errorf("invalid village_id")
}
newAddress := &model.Address{
UserID: userID,
Province: province.Name,
Regency: regency.Name,
District: district.Name,
Village: village.Name,
PostalCode: request.PostalCode,
Detail: request.Detail,
Geography: request.Geography,
}
err = s.AddressRepo.CreateAddress(newAddress)
if err != nil {
return nil, fmt.Errorf("failed to create user address: %v", err)
}
createdAt, _ := utils.FormatDateToIndonesianFormat(newAddress.CreatedAt)
addressResponse := &dto.AddressResponseDTO{
UserID: newAddress.UserID,
ID: newAddress.ID,
Province: newAddress.Province,
Regency: newAddress.Regency,
District: newAddress.District,
Village: newAddress.Village,
PostalCode: newAddress.PostalCode,
Detail: newAddress.Detail,
Geography: newAddress.Geography,
CreatedAt: createdAt,
UpdatedAt: createdAt,
}
return addressResponse, nil
}