89 lines
2.4 KiB
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
|
|
}
|