basic orders are ready
This commit is contained in:
@@ -124,13 +124,13 @@ func (h *AddressesHandler) RetrieveAddressesInfo(c fiber.Ctx) error {
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
|
||||
}
|
||||
|
||||
addresses_info, err := h.addressesService.RetrieveAddressesInfo(userID)
|
||||
addresses, err := h.addressesService.RetrieveAddresses(userID)
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
return c.JSON(response.Make(&addresses_info, 0, i18n.T_(c, response.Message_OK)))
|
||||
return c.JSON(response.Make(addresses, 0, i18n.T_(c, response.Message_OK)))
|
||||
}
|
||||
|
||||
func (h *AddressesHandler) DeleteAddress(c fiber.Ctx) error {
|
||||
|
||||
@@ -29,7 +29,7 @@ func OrdersHandlerRoutes(r fiber.Router) fiber.Router {
|
||||
handler := NewOrdersHandler()
|
||||
|
||||
r.Get("/list", handler.ListOrders)
|
||||
r.Get("/place-new-order", handler.PlaceNewOrder)
|
||||
r.Post("/place-new-order", handler.PlaceNewOrder)
|
||||
r.Get("/change-order-address", handler.ChangeOrderAddress)
|
||||
r.Get("/change-order-status", handler.ChangeOrderStatus)
|
||||
|
||||
@@ -82,7 +82,6 @@ func (h *OrdersHandler) PlaceNewOrder(c fiber.Ctx) error {
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
||||
}
|
||||
|
||||
address_info := c.Query("address_info")
|
||||
country_id_attribute := c.Query("country_id")
|
||||
country_id, err := strconv.Atoi(country_id_attribute)
|
||||
if err != nil {
|
||||
@@ -90,6 +89,12 @@ func (h *OrdersHandler) PlaceNewOrder(c fiber.Ctx) error {
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
||||
}
|
||||
|
||||
address_info := string(c.Body())
|
||||
if address_info == "" {
|
||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
|
||||
}
|
||||
|
||||
name := c.Query("name")
|
||||
|
||||
err = h.ordersService.PlaceNewOrder(userID, uint(cart_id), name, uint(country_id), address_info)
|
||||
@@ -116,7 +121,6 @@ func (h *OrdersHandler) ChangeOrderAddress(c fiber.Ctx) error {
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
||||
}
|
||||
|
||||
address_info := c.Query("address_info")
|
||||
country_id_attribute := c.Query("country_id")
|
||||
country_id, err := strconv.Atoi(country_id_attribute)
|
||||
if err != nil {
|
||||
@@ -124,6 +128,12 @@ func (h *OrdersHandler) ChangeOrderAddress(c fiber.Ctx) error {
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
||||
}
|
||||
|
||||
address_info := string(c.Body())
|
||||
if address_info == "" {
|
||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
|
||||
}
|
||||
|
||||
err = h.ordersService.ChangeOrderAddress(user, uint(order_id), uint(country_id), address_info)
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
|
||||
@@ -1,25 +1,18 @@
|
||||
package model
|
||||
|
||||
type Address struct {
|
||||
ID uint `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
|
||||
CustomerID uint `gorm:"column:b2b_customer_id;not null;index" json:"customer_id"`
|
||||
AddressInfo string `gorm:"column:address_info;not null" json:"address_info"`
|
||||
CountryID uint `gorm:"column:b2b_country_id;not null" json:"country_id"`
|
||||
ID uint `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
|
||||
CustomerID uint `gorm:"column:b2b_customer_id;not null;index" json:"customer_id"`
|
||||
AddressString string `gorm:"column:address_string;not null" json:"address_string"`
|
||||
AddressUnparsed *AddressUnparsed `gorm:"-" json:"address_unparsed"`
|
||||
CountryID uint `gorm:"column:b2b_country_id;not null" json:"country_id"`
|
||||
}
|
||||
|
||||
func (Address) TableName() string {
|
||||
return "b2b_addresses"
|
||||
}
|
||||
|
||||
type AddressUnparsed struct {
|
||||
ID uint `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
|
||||
CustomerID uint `gorm:"column:b2b_customer_id;not null;index" json:"customer_id"`
|
||||
AddressInfo AddressField `gorm:"column:address_info;not null" json:"address_info"`
|
||||
CountryID uint `gorm:"column:b2b_country_id;not null" json:"country_id"`
|
||||
}
|
||||
|
||||
type AddressField interface {
|
||||
}
|
||||
type AddressUnparsed interface{}
|
||||
|
||||
// Address template in Poland
|
||||
type AddressPL struct {
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
package model
|
||||
|
||||
type CustomerOrder struct {
|
||||
OrderID uint `gorm:"column:order_id;primaryKey;autoIncrement" json:"order_id"`
|
||||
UserID uint `gorm:"column:user_id;not null;index" json:"user_id"`
|
||||
Name string `gorm:"column:name;not null" json:"name"`
|
||||
CountryID uint `gorm:"column:country_id;not null" json:"country_id"`
|
||||
AddressJSON string `gorm:"column:address_json;not null" json:"address_json"`
|
||||
Status string `gorm:"column:status;size:50;not null" json:"status"`
|
||||
Products []OrderProduct `gorm:"foreignKey:OrderID;references:ID" json:"products"`
|
||||
OrderID uint `gorm:"column:order_id;primaryKey;autoIncrement" json:"order_id"`
|
||||
UserID uint `gorm:"column:user_id;not null;index" json:"user_id"`
|
||||
Name string `gorm:"column:name;not null" json:"name"`
|
||||
CountryID uint `gorm:"column:country_id;not null" json:"country_id"`
|
||||
AddressString string `gorm:"column:address_string;not null" json:"address_string"`
|
||||
AddressUnparsed *AddressUnparsed `gorm:"-" json:"address_unparsed"`
|
||||
Status string `gorm:"column:status;size:50;not null" json:"status"`
|
||||
Products []OrderProduct `gorm:"foreignKey:OrderID;references:OrderID" json:"products"`
|
||||
}
|
||||
|
||||
func (CustomerOrder) TableName() string {
|
||||
|
||||
@@ -48,9 +48,9 @@ func (repo *AddressesRepo) UserAddressesAmt(user_id uint) (uint, error) {
|
||||
|
||||
func (repo *AddressesRepo) AddNewAddress(user_id uint, address_info string, country_id uint) error {
|
||||
address := model.Address{
|
||||
CustomerID: user_id,
|
||||
AddressInfo: address_info,
|
||||
CountryID: country_id,
|
||||
CustomerID: user_id,
|
||||
AddressString: address_info,
|
||||
CountryID: country_id,
|
||||
}
|
||||
|
||||
return db.DB.
|
||||
@@ -60,10 +60,10 @@ func (repo *AddressesRepo) AddNewAddress(user_id uint, address_info string, coun
|
||||
|
||||
func (repo *AddressesRepo) UpdateAddress(user_id uint, address_id uint, address_info string, country_id uint) error {
|
||||
address := model.Address{
|
||||
ID: address_id,
|
||||
CustomerID: user_id,
|
||||
AddressInfo: address_info,
|
||||
CountryID: country_id,
|
||||
ID: address_id,
|
||||
CustomerID: user_id,
|
||||
AddressString: address_info,
|
||||
CountryID: country_id,
|
||||
}
|
||||
|
||||
return db.DB.
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
|
||||
type UIOrdersRepo interface {
|
||||
UserHasOrder(user_id uint, order_id uint) (bool, error)
|
||||
Find(user_id uint, p find.Paging, filt *filters.FiltersList) (find.Found[model.CustomerOrder], error)
|
||||
Find(user_id uint, p find.Paging, filt *filters.FiltersList) (*find.Found[model.CustomerOrder], error)
|
||||
PlaceNewOrder(cart *model.CustomerCart, name string, country_id uint, address_info string) error
|
||||
ChangeOrderAddress(order_id uint, country_id uint, address_info string) error
|
||||
ChangeOrderStatus(order_id uint, status string) error
|
||||
@@ -35,14 +35,14 @@ func (repo *OrdersRepo) UserHasOrder(user_id uint, order_id uint) (bool, error)
|
||||
return amt >= 1, err
|
||||
}
|
||||
|
||||
func (repo *OrdersRepo) Find(user_id uint, p find.Paging, filt *filters.FiltersList) (find.Found[model.CustomerOrder], error) {
|
||||
func (repo *OrdersRepo) Find(user_id uint, p find.Paging, filt *filters.FiltersList) (*find.Found[model.CustomerOrder], error) {
|
||||
var list []model.CustomerOrder
|
||||
var total int64
|
||||
|
||||
query := db.Get().
|
||||
Model(&model.CustomerOrder{}).
|
||||
Preload("Products").
|
||||
Order("b2b_customer_orders.id DESC")
|
||||
Order("b2b_customer_orders.order_id DESC")
|
||||
|
||||
// Apply all filters
|
||||
if filt != nil {
|
||||
@@ -52,7 +52,7 @@ func (repo *OrdersRepo) Find(user_id uint, p find.Paging, filt *filters.FiltersL
|
||||
// run counter first as query is without limit and offset
|
||||
err := query.Count(&total).Error
|
||||
if err != nil {
|
||||
return find.Found[model.CustomerOrder]{}, err
|
||||
return &find.Found[model.CustomerOrder]{}, err
|
||||
}
|
||||
|
||||
err = query.
|
||||
@@ -60,10 +60,10 @@ func (repo *OrdersRepo) Find(user_id uint, p find.Paging, filt *filters.FiltersL
|
||||
Offset(p.Offset()).
|
||||
Find(&list).Error
|
||||
if err != nil {
|
||||
return find.Found[model.CustomerOrder]{}, err
|
||||
return &find.Found[model.CustomerOrder]{}, err
|
||||
}
|
||||
|
||||
return find.Found[model.CustomerOrder]{
|
||||
return &find.Found[model.CustomerOrder]{
|
||||
Items: list,
|
||||
Count: uint(total),
|
||||
}, nil
|
||||
@@ -71,12 +71,12 @@ func (repo *OrdersRepo) Find(user_id uint, p find.Paging, filt *filters.FiltersL
|
||||
|
||||
func (repo *OrdersRepo) PlaceNewOrder(cart *model.CustomerCart, name string, country_id uint, address_info string) error {
|
||||
order := model.CustomerOrder{
|
||||
UserID: cart.UserID,
|
||||
Name: name,
|
||||
CountryID: country_id,
|
||||
AddressJSON: address_info,
|
||||
Status: constdata.NEW_ORDER_STATUS,
|
||||
Products: make([]model.OrderProduct, 0, len(cart.Products)),
|
||||
UserID: cart.UserID,
|
||||
Name: name,
|
||||
CountryID: country_id,
|
||||
AddressString: address_info,
|
||||
Status: constdata.NEW_ORDER_STATUS,
|
||||
Products: make([]model.OrderProduct, 0, len(cart.Products)),
|
||||
}
|
||||
|
||||
for _, product := range cart.Products {
|
||||
@@ -95,8 +95,8 @@ func (repo *OrdersRepo) ChangeOrderAddress(order_id uint, country_id uint, addre
|
||||
Table("b2b_customer_orders").
|
||||
Where("order_id = ?", order_id).
|
||||
Updates(map[string]interface{}{
|
||||
"country_id": country_id,
|
||||
"address_info": address_info,
|
||||
"country_id": country_id,
|
||||
"address_string": address_info,
|
||||
}).
|
||||
Error
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ func New() *AddressesService {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *AddressesService) GetTemplate(country_id uint) (model.AddressField, error) {
|
||||
func (s *AddressesService) GetTemplate(country_id uint) (model.AddressUnparsed, error) {
|
||||
switch country_id {
|
||||
|
||||
case 1: // Poland
|
||||
@@ -74,30 +74,23 @@ func (s *AddressesService) ModifyAddress(user_id uint, address_id uint, address_
|
||||
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)
|
||||
func (s *AddressesService) RetrieveAddresses(user_id uint) (*[]model.Address, error) {
|
||||
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)
|
||||
for i := 0; i < len(*addresses); i++ {
|
||||
address_unparsed, err := s.ValidateAddressJson((*addresses)[i].AddressString, (*addresses)[i].CountryID)
|
||||
// log such errors
|
||||
if err != nil {
|
||||
fmt.Printf("err: %v\n", err)
|
||||
}
|
||||
|
||||
unparsed_addresses = append(unparsed_addresses, next_address)
|
||||
(*addresses)[i].AddressUnparsed = &address_unparsed
|
||||
}
|
||||
|
||||
return &unparsed_addresses, nil
|
||||
return addresses, nil
|
||||
}
|
||||
|
||||
func (s *AddressesService) DeleteAddress(user_id uint, address_id uint) error {
|
||||
@@ -112,7 +105,7 @@ func (s *AddressesService) DeleteAddress(user_id uint, address_id uint) error {
|
||||
}
|
||||
|
||||
// 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) {
|
||||
func (s *AddressesService) ValidateAddressJson(info string, country_id uint) (model.AddressUnparsed, error) {
|
||||
dec := json.NewDecoder(strings.NewReader(info))
|
||||
dec.DisallowUnknownFields()
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package orderService
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
||||
@@ -27,14 +28,29 @@ func New() *OrderService {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *OrderService) Find(user *model.Customer, p find.Paging, filt *filters.FiltersList) (find.Found[model.CustomerOrder], error) {
|
||||
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))
|
||||
}
|
||||
|
||||
return s.ordersRepo.Find(user.ID, p, filt)
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user