package orderService import ( "fmt" "strconv" "git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms" "git.ma-al.com/goc_daniel/b2b/app/model" "git.ma-al.com/goc_daniel/b2b/app/repos/cartsRepo" "git.ma-al.com/goc_daniel/b2b/app/repos/ordersRepo" "git.ma-al.com/goc_daniel/b2b/app/service/addressesService" "git.ma-al.com/goc_daniel/b2b/app/utils/query/filters" "git.ma-al.com/goc_daniel/b2b/app/utils/query/find" "git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors" ) type OrderService struct { ordersRepo ordersRepo.UIOrdersRepo cartsRepo cartsRepo.UICartsRepo addressesService *addressesService.AddressesService } func New() *OrderService { return &OrderService{ ordersRepo: ordersRepo.New(), cartsRepo: cartsRepo.New(), addressesService: addressesService.New(), } } func (s *OrderService) Find(user *model.Customer, p find.Paging, filt *filters.FiltersList) (*find.Found[model.CustomerOrder], error) { if !user.HasPermission(perms.ViewAllOrders) { // append filter to view only this user's orders idStr := strconv.FormatUint(uint64(user.ID), 10) filt.Append(filters.Where("b2b_customer_orders.user_id = " + idStr)) } list, err := s.ordersRepo.Find(user.ID, p, filt) if err != nil { return nil, err } for i := 0; i < len(list.Items); i++ { address_unparsed, err := s.addressesService.ValidateAddressJson(list.Items[i].AddressString, list.Items[i].CountryID) // log such errors if err != nil { fmt.Printf("err: %v\n", err) } list.Items[i].AddressUnparsed = &address_unparsed } return list, nil } func (s *OrderService) PlaceNewOrder(user_id uint, cart_id uint, name string, country_id uint, address_info string) error { _, err := s.addressesService.ValidateAddressJson(address_info, country_id) if err != nil { return err } exists, err := s.cartsRepo.UserHasCart(user_id, cart_id) if err != nil { return err } if !exists { return responseErrors.ErrUserHasNoSuchCart } cart, err := s.cartsRepo.RetrieveCart(user_id, cart_id) if err != nil { return err } if len(cart.Products) == 0 { return responseErrors.ErrEmptyCart } if name == "" && cart.Name != nil { name = *cart.Name } // all checks passed return s.ordersRepo.PlaceNewOrder(cart, name, country_id, address_info) } func (s *OrderService) ChangeOrderAddress(user *model.Customer, order_id uint, country_id uint, address_info string) error { _, err := s.addressesService.ValidateAddressJson(address_info, country_id) if err != nil { return err } if !user.HasPermission(perms.ModifyAllOrders) { exists, err := s.ordersRepo.UserHasOrder(user.ID, order_id) if err != nil { return err } if !exists { return responseErrors.ErrUserHasNoSuchOrder } } return s.ordersRepo.ChangeOrderAddress(order_id, country_id, address_info) } func (s *OrderService) ChangeOrderStatus(user *model.Customer, order_id uint, status string) error { if !user.HasPermission(perms.ModifyAllOrders) { exists, err := s.ordersRepo.UserHasOrder(user.ID, order_id) if err != nil { return err } if !exists { return responseErrors.ErrUserHasNoSuchOrder } } return s.ordersRepo.ChangeOrderStatus(order_id, status) }