153 lines
3.9 KiB
Go
153 lines
3.9 KiB
Go
package addressesService
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"git.ma-al.com/goc_daniel/b2b/app/model"
|
|
"git.ma-al.com/goc_daniel/b2b/app/repos/addressesRepo"
|
|
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
|
|
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
|
)
|
|
|
|
type AddressesService struct {
|
|
repo addressesRepo.UIAddressesRepo
|
|
}
|
|
|
|
func New() *AddressesService {
|
|
return &AddressesService{
|
|
repo: addressesRepo.New(),
|
|
}
|
|
}
|
|
|
|
func (s *AddressesService) GetTemplate(country_id uint) (model.AddressField, error) {
|
|
switch country_id {
|
|
|
|
case 1: // Poland
|
|
return model.AddressPL{}, nil
|
|
|
|
case 2: // Great Britain
|
|
return model.AddressGB{}, nil
|
|
|
|
case 3: // Czech Republic
|
|
return model.AddressCZ{}, nil
|
|
|
|
case 4: // Germany
|
|
return model.AddressDE{}, nil
|
|
|
|
default:
|
|
return nil, responseErrors.ErrInvalidCountryID
|
|
}
|
|
}
|
|
|
|
func (s *AddressesService) AddNewAddress(user_id uint, address_info string, country_id uint) error {
|
|
amt, err := s.repo.UserAddressesAmt(user_id)
|
|
if err != nil {
|
|
return err
|
|
} else if amt >= constdata.MAX_AMOUNT_OF_ADDRESSES_PER_USER {
|
|
return responseErrors.ErrMaxAmtOfAddressesReached
|
|
}
|
|
|
|
_, err = s.ValidateAddressJson(address_info, country_id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return s.repo.AddNewAddress(user_id, address_info, country_id)
|
|
}
|
|
|
|
// country_id = 0 means that country_id remains unchanged
|
|
func (s *AddressesService) ModifyAddress(user_id uint, address_id uint, address_info string, country_id uint) error {
|
|
amt, err := s.repo.UserHasAddress(user_id, address_id)
|
|
if err != nil {
|
|
return err
|
|
} else if amt != 1 {
|
|
return responseErrors.ErrUserHasNoSuchAddress
|
|
}
|
|
|
|
_, err = s.ValidateAddressJson(address_info, country_id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return s.repo.UpdateAddress(user_id, address_id, address_info, country_id)
|
|
}
|
|
|
|
func (s *AddressesService) RetrieveAddressesInfo(user_id uint) (*[]model.AddressUnparsed, error) {
|
|
parsed_addresses, err := s.repo.RetrieveAddresses(user_id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var unparsed_addresses []model.AddressUnparsed
|
|
|
|
for i := 0; i < len(*parsed_addresses); i++ {
|
|
var next_address model.AddressUnparsed
|
|
next_address.ID = (*parsed_addresses)[i].ID
|
|
next_address.CustomerID = (*parsed_addresses)[i].CustomerID
|
|
next_address.CountryID = (*parsed_addresses)[i].CountryID
|
|
|
|
next_address.AddressInfo, err = s.ValidateAddressJson((*parsed_addresses)[i].AddressInfo, next_address.CountryID)
|
|
// log such errors
|
|
if err != nil {
|
|
fmt.Printf("err: %v\n", err)
|
|
}
|
|
|
|
unparsed_addresses = append(unparsed_addresses, next_address)
|
|
}
|
|
|
|
return &unparsed_addresses, nil
|
|
}
|
|
|
|
func (s *AddressesService) DeleteAddress(user_id uint, address_id uint) error {
|
|
amt, err := s.repo.UserHasAddress(user_id, address_id)
|
|
if err != nil {
|
|
return err
|
|
} else if amt != 1 {
|
|
return responseErrors.ErrUserHasNoSuchAddress
|
|
}
|
|
|
|
return s.repo.DeleteAddress(user_id, address_id)
|
|
}
|
|
|
|
// validateAddressJson makes sure that the info string represents a valid json of address in given country
|
|
func (s *AddressesService) ValidateAddressJson(info string, country_id uint) (model.AddressField, error) {
|
|
dec := json.NewDecoder(strings.NewReader(info))
|
|
dec.DisallowUnknownFields()
|
|
|
|
switch country_id {
|
|
|
|
case 1: // Poland
|
|
var address model.AddressPL
|
|
if err := dec.Decode(&address); err != nil {
|
|
return address, responseErrors.ErrInvalidAddressJSON
|
|
}
|
|
return address, nil
|
|
|
|
case 2: // Great Britain
|
|
var address model.AddressGB
|
|
if err := dec.Decode(&address); err != nil {
|
|
return address, responseErrors.ErrInvalidAddressJSON
|
|
}
|
|
return address, nil
|
|
|
|
case 3: // Czech Republic
|
|
var address model.AddressCZ
|
|
if err := dec.Decode(&address); err != nil {
|
|
return address, responseErrors.ErrInvalidAddressJSON
|
|
}
|
|
return address, nil
|
|
|
|
case 4: // Germany
|
|
var address model.AddressDE
|
|
if err := dec.Decode(&address); err != nil {
|
|
return address, responseErrors.ErrInvalidAddressJSON
|
|
}
|
|
return address, nil
|
|
|
|
default:
|
|
return nil, responseErrors.ErrInvalidCountryID
|
|
}
|
|
}
|