Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into translate
This commit is contained in:
@@ -76,7 +76,7 @@ func AuthMiddleware() fiber.Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// We now populate the target user
|
// We now populate the target user
|
||||||
if user.Role != model.RoleAdmin {
|
if model.CustomerRole(user.Role.Name) != model.RoleAdmin {
|
||||||
return c.Status(fiber.StatusForbidden).JSON(fiber.Map{
|
return c.Status(fiber.StatusForbidden).JSON(fiber.Map{
|
||||||
"error": "admin access required",
|
"error": "admin access required",
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -3,9 +3,8 @@ package perms
|
|||||||
type Permission string
|
type Permission string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
UserRead Permission = "user.read"
|
|
||||||
UserWrite Permission = "user.write"
|
|
||||||
UserReadAny Permission = "user.read.any"
|
UserReadAny Permission = "user.read.any"
|
||||||
UserWriteAny Permission = "user.write.any"
|
UserWriteAny Permission = "user.write.any"
|
||||||
UserDeleteAny Permission = "user.delete.any"
|
UserDeleteAny Permission = "user.delete.any"
|
||||||
|
CurrencyWrite Permission = "currency.write"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/config"
|
"git.ma-al.com/goc_daniel/b2b/app/config"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware"
|
||||||
|
"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/model"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/currencyService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/currencyService"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
||||||
@@ -30,7 +32,7 @@ func NewCurrencyHandler() *CurrencyHandler {
|
|||||||
func CurrencyHandlerRoutes(r fiber.Router) fiber.Router {
|
func CurrencyHandlerRoutes(r fiber.Router) fiber.Router {
|
||||||
handler := NewCurrencyHandler()
|
handler := NewCurrencyHandler()
|
||||||
|
|
||||||
r.Post("/currency-rate", handler.PostCurrencyRate)
|
r.Post("/currency-rate", middleware.Require(perms.CurrencyWrite), handler.PostCurrencyRate)
|
||||||
r.Get("/currency-rate/:id", handler.GetCurrencyRate)
|
r.Get("/currency-rate/:id", handler.GetCurrencyRate)
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ import (
|
|||||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/customerService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/customerService"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/utils/query/query_params"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
||||||
"github.com/gofiber/fiber/v3"
|
"github.com/gofiber/fiber/v3"
|
||||||
@@ -28,36 +30,34 @@ func CustomerHandlerRoutes(r fiber.Router) fiber.Router {
|
|||||||
handler := NewCustomerHandler()
|
handler := NewCustomerHandler()
|
||||||
|
|
||||||
r.Get("", handler.customerData)
|
r.Get("", handler.customerData)
|
||||||
|
r.Get("/list", handler.listCustomers)
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *customerHandler) customerData(fc fiber.Ctx) error {
|
func (h *customerHandler) customerData(fc fiber.Ctx) error {
|
||||||
var customerId uint
|
var customerId uint
|
||||||
|
|
||||||
|
user, ok := localeExtractor.GetCustomer(fc)
|
||||||
|
if !ok || user == nil {
|
||||||
|
return fc.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
||||||
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrBadAttribute)))
|
||||||
|
}
|
||||||
|
|
||||||
customerIdStr := fc.Query("id")
|
customerIdStr := fc.Query("id")
|
||||||
if customerIdStr != "" {
|
if customerIdStr != "" {
|
||||||
user, ok := fc.Locals("user").(*model.UserSession)
|
|
||||||
if !ok {
|
|
||||||
return fc.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrBadAttribute)))
|
|
||||||
}
|
|
||||||
id, err := strconv.ParseUint(customerIdStr, 10, 64)
|
id, err := strconv.ParseUint(customerIdStr, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fiber.ErrBadRequest
|
return fiber.ErrBadRequest
|
||||||
}
|
}
|
||||||
|
|
||||||
if user.UserID != uint(id) && !user.HasPermission(perms.UserReadAny) {
|
if user.ID != uint(id) && !user.HasPermission(perms.UserReadAny) {
|
||||||
return fc.Status(fiber.StatusForbidden).
|
return fc.Status(fiber.StatusForbidden).
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrForbidden)))
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrForbidden)))
|
||||||
}
|
}
|
||||||
|
|
||||||
customerId = uint(id)
|
customerId = uint(id)
|
||||||
} else {
|
} else {
|
||||||
id, ok := fc.Locals("userID").(uint)
|
customerId = user.ID
|
||||||
if !ok {
|
|
||||||
return fc.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrBadAttribute)))
|
|
||||||
}
|
|
||||||
customerId = id
|
|
||||||
}
|
}
|
||||||
|
|
||||||
customer, err := h.service.GetById(customerId)
|
customer, err := h.service.GetById(customerId)
|
||||||
@@ -68,3 +68,36 @@ func (h *customerHandler) customerData(fc fiber.Ctx) error {
|
|||||||
|
|
||||||
return fc.JSON(response.Make(&customer, 0, i18n.T_(fc, response.Message_OK)))
|
return fc.JSON(response.Make(&customer, 0, i18n.T_(fc, response.Message_OK)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *customerHandler) listCustomers(fc fiber.Ctx) error {
|
||||||
|
p, filt, err := query_params.ParseFilters[model.Customer](fc, columnMappingListUsers)
|
||||||
|
if err != nil {
|
||||||
|
return fc.Status(responseErrors.GetErrorStatus(err)).
|
||||||
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, err)))
|
||||||
|
}
|
||||||
|
|
||||||
|
user, ok := localeExtractor.GetCustomer(fc)
|
||||||
|
if !ok || user == nil {
|
||||||
|
return fc.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
||||||
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrBadAttribute)))
|
||||||
|
}
|
||||||
|
if !user.HasPermission(perms.UserReadAny) {
|
||||||
|
return fc.Status(fiber.StatusForbidden).
|
||||||
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrForbidden)))
|
||||||
|
}
|
||||||
|
|
||||||
|
customer, err := h.service.Find(user.LangID, p, filt)
|
||||||
|
if err != nil {
|
||||||
|
return fc.Status(responseErrors.GetErrorStatus(err)).
|
||||||
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, err)))
|
||||||
|
}
|
||||||
|
|
||||||
|
return fc.JSON(response.Make(&customer, 0, i18n.T_(fc, response.Message_OK)))
|
||||||
|
}
|
||||||
|
|
||||||
|
var columnMappingListUsers map[string]string = map[string]string{
|
||||||
|
"user_id": "users.id",
|
||||||
|
"email": "users.email",
|
||||||
|
"first_name": "users.first_name",
|
||||||
|
"second_name": "users.second_name",
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
package restricted
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/config"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/listService"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/query/query_params"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
|
||||||
"github.com/gofiber/fiber/v3"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ListHandler handles endpoints that list various things (e.g. products or users)
|
|
||||||
type ListHandler struct {
|
|
||||||
listService *listService.ListService
|
|
||||||
config *config.Config
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewListHandler creates a new ListHandler instance
|
|
||||||
func NewListHandler() *ListHandler {
|
|
||||||
listService := listService.New()
|
|
||||||
return &ListHandler{
|
|
||||||
listService: listService,
|
|
||||||
config: config.Get(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ListHandlerRoutes(r fiber.Router) fiber.Router {
|
|
||||||
handler := NewListHandler()
|
|
||||||
|
|
||||||
r.Get("/list-products", handler.ListProducts)
|
|
||||||
r.Get("/list-users", handler.ListUsers)
|
|
||||||
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *ListHandler) ListProducts(c fiber.Ctx) error {
|
|
||||||
paging, filters, err := query_params.ParseFilters[model.Product](c, columnMappingListProducts)
|
|
||||||
if err != nil {
|
|
||||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
|
||||||
}
|
|
||||||
|
|
||||||
id_lang, ok := localeExtractor.GetLangID(c)
|
|
||||||
if !ok {
|
|
||||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
|
||||||
}
|
|
||||||
|
|
||||||
list, err := h.listService.ListProducts(id_lang, paging, filters)
|
|
||||||
if err != nil {
|
|
||||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
|
||||||
}
|
|
||||||
|
|
||||||
return c.JSON(response.Make(&list.Items, int(list.Count), i18n.T_(c, response.Message_OK)))
|
|
||||||
}
|
|
||||||
|
|
||||||
var columnMappingListProducts map[string]string = map[string]string{
|
|
||||||
"product_id": "ps.id_product",
|
|
||||||
"name": "pl.name",
|
|
||||||
"reference": "p.reference",
|
|
||||||
"category_name": "cl.name",
|
|
||||||
"category_id": "cp.id_category",
|
|
||||||
"quantity": "sa.quantity",
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *ListHandler) ListUsers(c fiber.Ctx) error {
|
|
||||||
paging, filters, err := query_params.ParseFilters[model.Customer](c, columnMappingListUsers)
|
|
||||||
if err != nil {
|
|
||||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
|
||||||
}
|
|
||||||
|
|
||||||
id_lang, ok := localeExtractor.GetLangID(c)
|
|
||||||
if !ok {
|
|
||||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
|
||||||
}
|
|
||||||
|
|
||||||
list, err := h.listService.ListUsers(id_lang, paging, filters)
|
|
||||||
if err != nil {
|
|
||||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
|
||||||
}
|
|
||||||
|
|
||||||
return c.JSON(response.Make(&list.Items, int(list.Count), i18n.T_(c, response.Message_OK)))
|
|
||||||
}
|
|
||||||
|
|
||||||
var columnMappingListUsers map[string]string = map[string]string{
|
|
||||||
"user_id": "users.id",
|
|
||||||
"email": "users.email",
|
|
||||||
"first_name": "users.first_name",
|
|
||||||
"second_name": "users.second_name",
|
|
||||||
"role": "users.role",
|
|
||||||
}
|
|
||||||
@@ -3,8 +3,6 @@ package restricted
|
|||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
|
||||||
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/menuService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/menuService"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
|
||||||
@@ -89,12 +87,12 @@ func (h *MenuHandler) GetBreadcrumb(c fiber.Ctx) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (h *MenuHandler) GetTopMenu(c fiber.Ctx) error {
|
func (h *MenuHandler) GetTopMenu(c fiber.Ctx) error {
|
||||||
lang_id, ok := localeExtractor.GetLangID(c)
|
customer, ok := localeExtractor.GetCustomer(c)
|
||||||
if !ok {
|
if !ok || customer == nil {
|
||||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
||||||
}
|
}
|
||||||
menu, err := h.menuService.GetTopMenu(session.LangID, session.RoleID)
|
menu, err := h.menuService.GetTopMenu(customer.LangID, customer.RoleID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
package restricted
|
package restricted
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/config"
|
"git.ma-al.com/goc_daniel/b2b/app/config"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/productService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/productService"
|
||||||
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/utils/query/query_params"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
||||||
"github.com/gofiber/fiber/v3"
|
"github.com/gofiber/fiber/v3"
|
||||||
@@ -32,6 +33,7 @@ func ProductsHandlerRoutes(r fiber.Router) fiber.Router {
|
|||||||
handler := NewProductsHandler()
|
handler := NewProductsHandler()
|
||||||
|
|
||||||
r.Get("/:id/:country_id/:quantity", handler.GetProductJson)
|
r.Get("/:id/:country_id/:quantity", handler.GetProductJson)
|
||||||
|
r.Get("/list", handler.ListProducts)
|
||||||
|
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
@@ -61,18 +63,12 @@ func (h *ProductsHandler) GetProductJson(c fiber.Ctx) error {
|
|||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||||
}
|
}
|
||||||
|
|
||||||
p_id_customer, ok := c.Locals(constdata.USER_LOCALES_ID).(uint)
|
customer, ok := localeExtractor.GetCustomer(c)
|
||||||
if !ok {
|
if !ok || customer == nil {
|
||||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
||||||
}
|
}
|
||||||
fmt.Printf("p_id_customer: %v\n", p_id_customer)
|
productJson, err := h.productService.GetJSON(p_id_product, int(customer.LangID), int(customer.ID), b2b_id_country, p_quantity)
|
||||||
id_lang, ok := c.Locals(constdata.LANG_LOCALES_ID).(uint)
|
|
||||||
if !ok {
|
|
||||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
|
||||||
}
|
|
||||||
productJson, err := h.productService.GetJSON(p_id_product, int(id_lang), int(p_id_customer), b2b_id_country, p_quantity)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||||
@@ -80,3 +76,34 @@ func (h *ProductsHandler) GetProductJson(c fiber.Ctx) error {
|
|||||||
|
|
||||||
return c.JSON(response.Make(&productJson, 1, i18n.T_(c, response.Message_OK)))
|
return c.JSON(response.Make(&productJson, 1, i18n.T_(c, response.Message_OK)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *ProductsHandler) ListProducts(c fiber.Ctx) error {
|
||||||
|
paging, filters, err := query_params.ParseFilters[model.Product](c, columnMappingListProducts)
|
||||||
|
if err != nil {
|
||||||
|
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||||
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||||
|
}
|
||||||
|
|
||||||
|
id_lang, ok := localeExtractor.GetLangID(c)
|
||||||
|
if !ok {
|
||||||
|
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
|
||||||
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
|
||||||
|
}
|
||||||
|
|
||||||
|
list, err := h.productService.Find(id_lang, paging, filters)
|
||||||
|
if err != nil {
|
||||||
|
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||||
|
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.JSON(response.Make(&list.Items, int(list.Count), i18n.T_(c, response.Message_OK)))
|
||||||
|
}
|
||||||
|
|
||||||
|
var columnMappingListProducts map[string]string = map[string]string{
|
||||||
|
"product_id": "ps.id_product",
|
||||||
|
"name": "pl.name",
|
||||||
|
"reference": "p.reference",
|
||||||
|
"category_name": "cl.name",
|
||||||
|
"category_id": "cp.id_category",
|
||||||
|
"quantity": "sa.quantity",
|
||||||
|
}
|
||||||
|
|||||||
@@ -97,10 +97,6 @@ func (s *Server) Setup() error {
|
|||||||
productTranslation := s.restricted.Group("/product-translation")
|
productTranslation := s.restricted.Group("/product-translation")
|
||||||
restricted.ProductTranslationHandlerRoutes(productTranslation)
|
restricted.ProductTranslationHandlerRoutes(productTranslation)
|
||||||
|
|
||||||
// lists of things routes (restricted)
|
|
||||||
list := s.restricted.Group("/list")
|
|
||||||
restricted.ListHandlerRoutes(list)
|
|
||||||
|
|
||||||
product := s.restricted.Group("/product")
|
product := s.restricted.Group("/product")
|
||||||
restricted.ProductsHandlerRoutes(product)
|
restricted.ProductsHandlerRoutes(product)
|
||||||
|
|
||||||
@@ -121,12 +117,11 @@ func (s *Server) Setup() error {
|
|||||||
carts := s.restricted.Group("/carts")
|
carts := s.restricted.Group("/carts")
|
||||||
restricted.CartsHandlerRoutes(carts)
|
restricted.CartsHandlerRoutes(carts)
|
||||||
|
|
||||||
|
restricted.CurrencyHandlerRoutes(s.restricted)
|
||||||
s.api.All("*", func(c fiber.Ctx) error {
|
s.api.All("*", func(c fiber.Ctx) error {
|
||||||
return c.SendStatus(fiber.StatusNotFound)
|
return c.SendStatus(fiber.StatusNotFound)
|
||||||
})
|
})
|
||||||
|
|
||||||
restricted.CurrencyHandlerRoutes(s.restricted)
|
|
||||||
|
|
||||||
// // Restricted routes example
|
// // Restricted routes example
|
||||||
// restricted := s.api.Group("/restricted")
|
// restricted := s.api.Group("/restricted")
|
||||||
// restricted.Use(middleware.AuthMiddleware())
|
// restricted.Use(middleware.AuthMiddleware())
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ type Customer struct {
|
|||||||
FirstName string `gorm:"size:100" json:"first_name"`
|
FirstName string `gorm:"size:100" json:"first_name"`
|
||||||
LastName string `gorm:"size:100" json:"last_name"`
|
LastName string `gorm:"size:100" json:"last_name"`
|
||||||
RoleID uint `gorm:"column:role_id;not null;default:1" json:"-"`
|
RoleID uint `gorm:"column:role_id;not null;default:1" json:"-"`
|
||||||
Role Role `gorm:"foreignKey:RoleID" json:"role"`
|
Role *Role `gorm:"foreignKey:RoleID" json:"role,omitempty"`
|
||||||
Provider AuthProvider `gorm:"type:varchar(20);default:'local'" json:"provider"`
|
Provider AuthProvider `gorm:"type:varchar(20);default:'local'" json:"provider"`
|
||||||
ProviderID string `gorm:"size:255" json:"provider_id,omitempty"` // ID from OAuth provider
|
ProviderID string `gorm:"size:255" json:"provider_id,omitempty"` // ID from OAuth provider
|
||||||
AvatarURL string `gorm:"size:500" json:"avatar_url,omitempty"`
|
AvatarURL string `gorm:"size:500" json:"avatar_url,omitempty"`
|
||||||
@@ -34,6 +34,15 @@ type Customer struct {
|
|||||||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *Customer) HasPermission(permission perms.Permission) bool {
|
||||||
|
for _, p := range u.Role.Permissions {
|
||||||
|
if p.Name == permission {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// AuthProvider represents the authentication provider
|
// AuthProvider represents the authentication provider
|
||||||
type AuthProvider string
|
type AuthProvider string
|
||||||
|
|
||||||
@@ -168,5 +177,4 @@ type UserInList struct {
|
|||||||
Email string `gorm:"column:email" json:"email"`
|
Email string `gorm:"column:email" json:"email"`
|
||||||
FirstName string `gorm:"column:first_name" json:"first_name"`
|
FirstName string `gorm:"column:first_name" json:"first_name"`
|
||||||
LastName string `gorm:"column:last_name" json:"last_name"`
|
LastName string `gorm:"column:last_name" json:"last_name"`
|
||||||
Role string `gorm:"column:role" json:"role"`
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package model
|
|||||||
type Role struct {
|
type Role struct {
|
||||||
ID uint `gorm:"primaryKey" json:"id"`
|
ID uint `gorm:"primaryKey" json:"id"`
|
||||||
Name string `gorm:"size:64" json:"name"`
|
Name string `gorm:"size:64" json:"name"`
|
||||||
Permissions []Permission `gorm:"many2many:b2b_role_permissions;" json:"-"`
|
Permissions []Permission `gorm:"many2many:b2b_role_permissions;" json:"permissions"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (Role) TableName() string {
|
func (Role) TableName() string {
|
||||||
|
|||||||
@@ -3,10 +3,13 @@ package customerRepo
|
|||||||
import (
|
import (
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/db"
|
"git.ma-al.com/goc_daniel/b2b/app/db"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/utils/query/filters"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/utils/query/find"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UICustomerRepo interface {
|
type UICustomerRepo interface {
|
||||||
Get(id uint) (*model.Customer, error)
|
Get(id uint) (*model.Customer, error)
|
||||||
|
Find(langId uint, p find.Paging, filt *filters.FiltersList) (*find.Found[model.UserInList], error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type CustomerRepo struct{}
|
type CustomerRepo struct{}
|
||||||
@@ -19,9 +22,64 @@ func (repo *CustomerRepo) Get(id uint) (*model.Customer, error) {
|
|||||||
var customer model.Customer
|
var customer model.Customer
|
||||||
|
|
||||||
err := db.DB.
|
err := db.DB.
|
||||||
Preload("Role").
|
Preload("Role.Permissions").
|
||||||
First(&customer, id).
|
First(&customer, id).
|
||||||
Error
|
Error
|
||||||
|
|
||||||
return &customer, err
|
return &customer, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (repo *CustomerRepo) Find(langId uint, p find.Paging, filt *filters.FiltersList) (*find.Found[model.UserInList], error) {
|
||||||
|
found, err := find.Paginate[model.UserInList](langId, p, db.DB.
|
||||||
|
Table("b2b_customers AS users").
|
||||||
|
Select(`
|
||||||
|
users.id AS id,
|
||||||
|
users.email AS email,
|
||||||
|
users.first_name AS first_name,
|
||||||
|
users.last_name AS last_name
|
||||||
|
`).
|
||||||
|
Scopes(filt.All()...),
|
||||||
|
)
|
||||||
|
|
||||||
|
return &found, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// func (repo *ListRepo) ListUsers(id_lang uint, p find.Paging, filt *filters.FiltersList) (find.Found[model.UserInList], error) {
|
||||||
|
// var list []model.UserInList
|
||||||
|
// var total int64
|
||||||
|
|
||||||
|
// query := db.Get().
|
||||||
|
// Table("b2b_customers AS users").
|
||||||
|
// Select(`
|
||||||
|
// users.id AS id,
|
||||||
|
// users.email AS email,
|
||||||
|
// users.first_name AS first_name,
|
||||||
|
// users.last_name AS last_name,
|
||||||
|
// users.role AS role
|
||||||
|
// `)
|
||||||
|
|
||||||
|
// // Apply all filters
|
||||||
|
// if filt != nil {
|
||||||
|
// filt.ApplyAll(query)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // run counter first as query is without limit and offset
|
||||||
|
// err := query.Count(&total).Error
|
||||||
|
// if err != nil {
|
||||||
|
// return find.Found[model.UserInList]{}, err
|
||||||
|
// }
|
||||||
|
|
||||||
|
// err = query.
|
||||||
|
// Order("users.id DESC").
|
||||||
|
// Limit(p.Limit()).
|
||||||
|
// Offset(p.Offset()).
|
||||||
|
// Find(&list).Error
|
||||||
|
// if err != nil {
|
||||||
|
// return find.Found[model.UserInList]{}, err
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return find.Found[model.UserInList]{
|
||||||
|
// Items: list,
|
||||||
|
// Count: uint(total),
|
||||||
|
// }, nil
|
||||||
|
// }
|
||||||
|
|||||||
@@ -1,121 +0,0 @@
|
|||||||
package listRepo
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/config"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/db"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/model/dbmodel"
|
|
||||||
"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_marek/gormcol"
|
|
||||||
"github.com/WinterYukky/gorm-extra-clause-plugin/exclause"
|
|
||||||
)
|
|
||||||
|
|
||||||
type UIListRepo interface {
|
|
||||||
ListProducts(id_lang uint, p find.Paging, filt *filters.FiltersList) (find.Found[model.ProductInList], error)
|
|
||||||
ListUsers(id_lang uint, p find.Paging, filt *filters.FiltersList) (find.Found[model.UserInList], error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type ListRepo struct{}
|
|
||||||
|
|
||||||
func New() UIListRepo {
|
|
||||||
return &ListRepo{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *ListRepo) ListProducts(id_lang uint, p find.Paging, filt *filters.FiltersList) (find.Found[model.ProductInList], error) {
|
|
||||||
var list []model.ProductInList
|
|
||||||
var total int64
|
|
||||||
|
|
||||||
query := db.Get().
|
|
||||||
Table(gormcol.Field.Tab(dbmodel.PsProductShopCols.Active)+" AS ps").
|
|
||||||
Select(`
|
|
||||||
ps.id_product AS product_id,
|
|
||||||
pl.name AS name,
|
|
||||||
pl.link_rewrite AS link_rewrite,
|
|
||||||
CONCAT(?, '/', ims.id_image, '-small_default/', pl.link_rewrite, '.webp') AS image_link,
|
|
||||||
cl.name AS category_name,
|
|
||||||
p.reference AS reference,
|
|
||||||
COALESCE(v.variants_number, 0) AS variants_number,
|
|
||||||
sa.quantity AS quantity
|
|
||||||
`, config.Get().Image.ImagePrefix).
|
|
||||||
Joins("JOIN "+dbmodel.PsProductCols.IDProduct.Tab()+" p ON p.id_product = ps.id_product").
|
|
||||||
Joins("JOIN ps_product_lang pl ON pl.id_product = ps.id_product AND pl.id_lang = ?", id_lang).
|
|
||||||
Joins("JOIN ps_image_shop ims ON ims.id_product = ps.id_product AND ims.cover = 1").
|
|
||||||
Joins("JOIN ps_category_lang cl ON cl.id_category = ps.id_category_default AND cl.id_lang = ?", id_lang).
|
|
||||||
Joins("JOIN ps_category_product cp ON cp.id_product = ps.id_product").
|
|
||||||
Joins("LEFT JOIN variants v ON v.id_product = ps.id_product").
|
|
||||||
Joins("LEFT JOIN ps_stock_available sa ON sa.id_product = ps.id_product AND sa.id_product_attribute = 0").
|
|
||||||
Where("ps.active = ?", 1).
|
|
||||||
Group("ps.id_product").
|
|
||||||
Clauses(exclause.With{CTEs: []exclause.CTE{
|
|
||||||
{
|
|
||||||
Name: "variants",
|
|
||||||
Subquery: exclause.Subquery{DB: db.Get().Model(&dbmodel.PsProductAttributeShop{}).Select("id_product", "COUNT(*) AS variants_number").Group("id_product")},
|
|
||||||
},
|
|
||||||
}})
|
|
||||||
|
|
||||||
// Apply all filters
|
|
||||||
if filt != nil {
|
|
||||||
filt.ApplyAll(query)
|
|
||||||
}
|
|
||||||
|
|
||||||
// run counter first as query is without limit and offset
|
|
||||||
err := query.Count(&total).Error
|
|
||||||
if err != nil {
|
|
||||||
return find.Found[model.ProductInList]{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = query.
|
|
||||||
Order("ps.id_product DESC").
|
|
||||||
Limit(p.Limit()).
|
|
||||||
Offset(p.Offset()).
|
|
||||||
Find(&list).Error
|
|
||||||
if err != nil {
|
|
||||||
return find.Found[model.ProductInList]{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return find.Found[model.ProductInList]{
|
|
||||||
Items: list,
|
|
||||||
Count: uint(total),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *ListRepo) ListUsers(id_lang uint, p find.Paging, filt *filters.FiltersList) (find.Found[model.UserInList], error) {
|
|
||||||
var list []model.UserInList
|
|
||||||
var total int64
|
|
||||||
|
|
||||||
query := db.Get().
|
|
||||||
Table("b2b_customers AS users").
|
|
||||||
Select(`
|
|
||||||
users.id AS id,
|
|
||||||
users.email AS email,
|
|
||||||
users.first_name AS first_name,
|
|
||||||
users.last_name AS last_name,
|
|
||||||
users.role AS role
|
|
||||||
`)
|
|
||||||
|
|
||||||
// Apply all filters
|
|
||||||
if filt != nil {
|
|
||||||
filt.ApplyAll(query)
|
|
||||||
}
|
|
||||||
|
|
||||||
// run counter first as query is without limit and offset
|
|
||||||
err := query.Count(&total).Error
|
|
||||||
if err != nil {
|
|
||||||
return find.Found[model.UserInList]{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = query.
|
|
||||||
Order("users.id DESC").
|
|
||||||
Limit(p.Limit()).
|
|
||||||
Offset(p.Offset()).
|
|
||||||
Find(&list).Error
|
|
||||||
if err != nil {
|
|
||||||
return find.Found[model.UserInList]{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return find.Found[model.UserInList]{
|
|
||||||
Items: list,
|
|
||||||
Count: uint(total),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
@@ -4,11 +4,19 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/config"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/db"
|
"git.ma-al.com/goc_daniel/b2b/app/db"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/model/dbmodel"
|
||||||
|
"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_marek/gormcol"
|
||||||
|
"github.com/WinterYukky/gorm-extra-clause-plugin/exclause"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UIProductsRepo interface {
|
type UIProductsRepo interface {
|
||||||
GetJSON(p_id_product, p_id_shop, p_id_lang, p_id_customer, b2b_id_country, p_quantity int) (*json.RawMessage, error)
|
GetJSON(p_id_product, p_id_shop, p_id_lang, p_id_customer, b2b_id_country, p_quantity int) (*json.RawMessage, error)
|
||||||
|
Find(id_lang uint, p find.Paging, filt *filters.FiltersList) (find.Found[model.ProductInList], error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProductsRepo struct{}
|
type ProductsRepo struct{}
|
||||||
@@ -37,3 +45,61 @@ func (repo *ProductsRepo) GetJSON(p_id_product, p_id_shop, p_id_lang, p_id_custo
|
|||||||
raw := json.RawMessage(productStr)
|
raw := json.RawMessage(productStr)
|
||||||
return &raw, nil
|
return &raw, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (repo *ProductsRepo) Find(id_lang uint, p find.Paging, filt *filters.FiltersList) (find.Found[model.ProductInList], error) {
|
||||||
|
var list []model.ProductInList
|
||||||
|
var total int64
|
||||||
|
|
||||||
|
query := db.Get().
|
||||||
|
Table(gormcol.Field.Tab(dbmodel.PsProductShopCols.Active)+" AS ps").
|
||||||
|
Select(`
|
||||||
|
ps.id_product AS product_id,
|
||||||
|
pl.name AS name,
|
||||||
|
pl.link_rewrite AS link_rewrite,
|
||||||
|
CONCAT(?, '/', ims.id_image, '-small_default/', pl.link_rewrite, '.webp') AS image_link,
|
||||||
|
cl.name AS category_name,
|
||||||
|
p.reference AS reference,
|
||||||
|
COALESCE(v.variants_number, 0) AS variants_number,
|
||||||
|
sa.quantity AS quantity
|
||||||
|
`, config.Get().Image.ImagePrefix).
|
||||||
|
Joins("JOIN "+dbmodel.PsProductCols.IDProduct.Tab()+" p ON p.id_product = ps.id_product").
|
||||||
|
Joins("JOIN ps_product_lang pl ON pl.id_product = ps.id_product AND pl.id_lang = ?", id_lang).
|
||||||
|
Joins("JOIN ps_image_shop ims ON ims.id_product = ps.id_product AND ims.cover = 1").
|
||||||
|
Joins("JOIN ps_category_lang cl ON cl.id_category = ps.id_category_default AND cl.id_lang = ?", id_lang).
|
||||||
|
Joins("JOIN ps_category_product cp ON cp.id_product = ps.id_product").
|
||||||
|
Joins("LEFT JOIN variants v ON v.id_product = ps.id_product").
|
||||||
|
Joins("LEFT JOIN ps_stock_available sa ON sa.id_product = ps.id_product AND sa.id_product_attribute = 0").
|
||||||
|
Where("ps.active = ?", 1).
|
||||||
|
Group("ps.id_product").
|
||||||
|
Clauses(exclause.With{CTEs: []exclause.CTE{
|
||||||
|
{
|
||||||
|
Name: "variants",
|
||||||
|
Subquery: exclause.Subquery{DB: db.Get().Model(&dbmodel.PsProductAttributeShop{}).Select("id_product", "COUNT(*) AS variants_number").Group("id_product")},
|
||||||
|
},
|
||||||
|
}}).
|
||||||
|
Order("ps.id_product DESC")
|
||||||
|
|
||||||
|
// Apply all filters
|
||||||
|
if filt != nil {
|
||||||
|
filt.ApplyAll(query)
|
||||||
|
}
|
||||||
|
|
||||||
|
// run counter first as query is without limit and offset
|
||||||
|
err := query.Count(&total).Error
|
||||||
|
if err != nil {
|
||||||
|
return find.Found[model.ProductInList]{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = query.
|
||||||
|
Limit(p.Limit()).
|
||||||
|
Offset(p.Offset()).
|
||||||
|
Find(&list).Error
|
||||||
|
if err != nil {
|
||||||
|
return find.Found[model.ProductInList]{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return find.Found[model.ProductInList]{
|
||||||
|
Items: list,
|
||||||
|
Count: uint(total),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -153,7 +153,6 @@ func (s *AuthService) Register(req *model.RegisterRequest) error {
|
|||||||
Password: string(hashedPassword),
|
Password: string(hashedPassword),
|
||||||
FirstName: req.FirstName,
|
FirstName: req.FirstName,
|
||||||
LastName: req.LastName,
|
LastName: req.LastName,
|
||||||
Role: model.Role{},
|
|
||||||
Provider: model.ProviderLocal,
|
Provider: model.ProviderLocal,
|
||||||
IsActive: false,
|
IsActive: false,
|
||||||
EmailVerified: false,
|
EmailVerified: false,
|
||||||
|
|||||||
@@ -150,7 +150,6 @@ func (s *AuthService) findOrCreateGoogleUser(info *view.GoogleUserInfo) (*model.
|
|||||||
Provider: model.ProviderGoogle,
|
Provider: model.ProviderGoogle,
|
||||||
ProviderID: info.ID,
|
ProviderID: info.ID,
|
||||||
AvatarURL: info.Picture,
|
AvatarURL: info.Picture,
|
||||||
Role: model.Role{},
|
|
||||||
IsActive: true,
|
IsActive: true,
|
||||||
EmailVerified: true,
|
EmailVerified: true,
|
||||||
LangID: 2, // default is english
|
LangID: 2, // default is english
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package customerService
|
|||||||
import (
|
import (
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/repos/customerRepo"
|
"git.ma-al.com/goc_daniel/b2b/app/repos/customerRepo"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/utils/query/filters"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/utils/query/find"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CustomerService struct {
|
type CustomerService struct {
|
||||||
@@ -18,3 +20,7 @@ func New() *CustomerService {
|
|||||||
func (s *CustomerService) GetById(id uint) (*model.Customer, error) {
|
func (s *CustomerService) GetById(id uint) (*model.Customer, error) {
|
||||||
return s.repo.Get(id)
|
return s.repo.Get(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *CustomerService) Find(langId uint, p find.Paging, filt *filters.FiltersList) (*find.Found[model.UserInList], error) {
|
||||||
|
return s.repo.Find(langId, p, filt)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
package listService
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/repos/listRepo"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/query/filters"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/query/find"
|
|
||||||
)
|
|
||||||
|
|
||||||
type ListService struct {
|
|
||||||
listRepo listRepo.UIListRepo
|
|
||||||
}
|
|
||||||
|
|
||||||
func New() *ListService {
|
|
||||||
return &ListService{
|
|
||||||
listRepo: listRepo.New(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *ListService) ListProducts(id_lang uint, p find.Paging, filters *filters.FiltersList) (find.Found[model.ProductInList], error) {
|
|
||||||
return s.listRepo.ListProducts(id_lang, p, filters)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *ListService) ListUsers(id_lang uint, p find.Paging, filters *filters.FiltersList) (find.Found[model.UserInList], error) {
|
|
||||||
return s.listRepo.ListUsers(id_lang, p, filters)
|
|
||||||
}
|
|
||||||
@@ -3,8 +3,11 @@ package productService
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/repos/productsRepo"
|
"git.ma-al.com/goc_daniel/b2b/app/repos/productsRepo"
|
||||||
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
|
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/utils/query/filters"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/utils/query/find"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ProductService struct {
|
type ProductService struct {
|
||||||
@@ -25,3 +28,7 @@ func (s *ProductService) GetJSON(p_id_product, p_id_lang, p_id_customer, b2b_id_
|
|||||||
|
|
||||||
return products, nil
|
return products, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ProductService) Find(id_lang uint, p find.Paging, filters *filters.FiltersList) (find.Found[model.ProductInList], error) {
|
||||||
|
return s.productsRepo.Find(id_lang, p, filters)
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,3 +21,11 @@ func GetUserID(c fiber.Ctx) (uint, bool) {
|
|||||||
}
|
}
|
||||||
return user_locale.User.ID, true
|
return user_locale.User.ID, true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetCustomer(c fiber.Ctx) (*model.Customer, bool) {
|
||||||
|
user_locale, ok := c.Locals(constdata.USER_LOCALE).(*model.UserLocale)
|
||||||
|
if !ok || user_locale.User == nil {
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
return user_locale.User, true
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package find
|
package find
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -28,18 +27,13 @@ type Found[T any] struct {
|
|||||||
Spec map[string]interface{} `json:"spec,omitempty"`
|
Spec map[string]interface{} `json:"spec,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wraps given query adding limit, offset clauses and SQL_CALC_FOUND_ROWS to it
|
|
||||||
// and running SELECT FOUND_ROWS() afterwards to fetch the total number
|
|
||||||
// (ignoring LIMIT) of results. The final results are wrapped into the
|
|
||||||
// [find.Found] type.
|
|
||||||
func Paginate[T any](langID uint, paging Paging, stmt *gorm.DB) (Found[T], error) {
|
func Paginate[T any](langID uint, paging Paging, stmt *gorm.DB) (Found[T], error) {
|
||||||
var items []T
|
var items []T
|
||||||
var count uint64
|
var count int64
|
||||||
|
|
||||||
// stmt.Debug()
|
stmt.Count(&count)
|
||||||
|
|
||||||
err := stmt.
|
err := stmt.
|
||||||
Clauses(SqlCalcFound()).
|
|
||||||
Offset(paging.Offset()).
|
Offset(paging.Offset()).
|
||||||
Limit(paging.Limit()).
|
Limit(paging.Limit()).
|
||||||
Find(&items).
|
Find(&items).
|
||||||
@@ -48,14 +42,6 @@ func Paginate[T any](langID uint, paging Paging, stmt *gorm.DB) (Found[T], error
|
|||||||
return Found[T]{}, err
|
return Found[T]{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
countInterface, ok := stmt.Get(FOUND_ROWS_CTX_KEY)
|
|
||||||
if !ok {
|
|
||||||
return Found[T]{}, errors.New(FOUND_ROWS_CTX_KEY + " value was not found in the gorm db context")
|
|
||||||
}
|
|
||||||
if count, ok = countInterface.(uint64); !ok {
|
|
||||||
return Found[T]{}, errors.New("failed to cast value under " + FOUND_ROWS_CTX_KEY + " to uint64")
|
|
||||||
}
|
|
||||||
|
|
||||||
columnsSpec := GetColumnsSpec[T](langID)
|
columnsSpec := GetColumnsSpec[T](langID)
|
||||||
|
|
||||||
return Found[T]{
|
return Found[T]{
|
||||||
|
|||||||
@@ -6,6 +6,13 @@ info:
|
|||||||
http:
|
http:
|
||||||
method: POST
|
method: POST
|
||||||
url: "{{bas_url}}/restricted/currency-rate"
|
url: "{{bas_url}}/restricted/currency-rate"
|
||||||
|
body:
|
||||||
|
type: json
|
||||||
|
data: |-
|
||||||
|
{
|
||||||
|
"b2b_id_currency" : 1,
|
||||||
|
"conversion_rate": 4.2
|
||||||
|
}
|
||||||
auth: inherit
|
auth: inherit
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
|
|||||||
@@ -5,11 +5,7 @@ info:
|
|||||||
|
|
||||||
http:
|
http:
|
||||||
method: GET
|
method: GET
|
||||||
url: "{{bas_url}}/restricted/customer?id=1"
|
url: "{{bas_url}}/restricted/customer"
|
||||||
params:
|
|
||||||
- name: id
|
|
||||||
value: "1"
|
|
||||||
type: query
|
|
||||||
auth: inherit
|
auth: inherit
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
|
|||||||
15
bruno/api_v1/customer/Customer list.yml
Normal file
15
bruno/api_v1/customer/Customer list.yml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
info:
|
||||||
|
name: Customer list
|
||||||
|
type: http
|
||||||
|
seq: 3
|
||||||
|
|
||||||
|
http:
|
||||||
|
method: GET
|
||||||
|
url: "{{bas_url}}/restricted/customer/list"
|
||||||
|
auth: inherit
|
||||||
|
|
||||||
|
settings:
|
||||||
|
encodeUrl: true
|
||||||
|
timeout: 0
|
||||||
|
followRedirects: true
|
||||||
|
maxRedirects: 5
|
||||||
@@ -5,7 +5,7 @@ info:
|
|||||||
|
|
||||||
http:
|
http:
|
||||||
method: GET
|
method: GET
|
||||||
url: "{{bas_url}}/restricted/list/list-products?p=1&elems=30&sort=product_id,asc&category_id_in=243&reference=~62"
|
url: "{{bas_url}}/restricted/product/list?p=1&elems=30&sort=product_id,asc&category_id_in=243&reference=~62"
|
||||||
params:
|
params:
|
||||||
- name: p
|
- name: p
|
||||||
value: "1"
|
value: "1"
|
||||||
@@ -25,9 +25,6 @@ http:
|
|||||||
body:
|
body:
|
||||||
type: json
|
type: json
|
||||||
data: ""
|
data: ""
|
||||||
auth:
|
|
||||||
type: bearer
|
|
||||||
token: "{{token}}"
|
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
encodeUrl: true
|
encodeUrl: true
|
||||||
|
|||||||
@@ -29,4 +29,17 @@ VALUES
|
|||||||
(3, '🇨🇿', 16, 2),
|
(3, '🇨🇿', 16, 2),
|
||||||
(4, '🇩🇪', 1, 2);
|
(4, '🇩🇪', 1, 2);
|
||||||
|
|
||||||
|
INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('1', 'user.read.any');
|
||||||
|
INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('2', 'user.write.any');
|
||||||
|
INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('3', 'user.delete.any');
|
||||||
|
INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('4', 'currency.write');
|
||||||
|
|
||||||
|
INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '1');
|
||||||
|
INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '2');
|
||||||
|
INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '3');
|
||||||
|
INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '4');
|
||||||
|
INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '1');
|
||||||
|
INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '2');
|
||||||
|
INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '3');
|
||||||
|
INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '4');
|
||||||
-- +goose Down
|
-- +goose Down
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
package currencyRepo
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/db"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/query/filters"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/query/find"
|
|
||||||
)
|
|
||||||
|
|
||||||
type UICurrencyRepo interface {
|
|
||||||
CreateConversionRate(currencyRate *model.CurrencyRate) error
|
|
||||||
Get(id uint) (*model.Currency, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type CurrencyRepo struct{}
|
|
||||||
|
|
||||||
func New() UICurrencyRepo {
|
|
||||||
return &CurrencyRepo{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *CurrencyRepo) CreateConversionRate(currencyRate *model.CurrencyRate) error {
|
|
||||||
return db.DB.Debug().Create(currencyRate).Error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *CurrencyRepo) Get(id uint) (*model.Currency, error) {
|
|
||||||
var currency model.Currency
|
|
||||||
|
|
||||||
err := db.DB.Table("b2b_currencies c").
|
|
||||||
Select("c.*, r.conversion_rate").
|
|
||||||
Joins(`
|
|
||||||
LEFT JOIN b2b_currency_rates r
|
|
||||||
ON r.b2b_id_currency = c.id
|
|
||||||
AND r.created_at = (
|
|
||||||
SELECT MAX(created_at)
|
|
||||||
FROM b2b_currency_rates
|
|
||||||
WHERE b2b_id_currency = c.id
|
|
||||||
)
|
|
||||||
`).
|
|
||||||
Where("c.id = ?", id).
|
|
||||||
Scan(¤cy).Error
|
|
||||||
|
|
||||||
return ¤cy, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (repo *CurrencyRepo) Find(langId uint, p find.Paging, filt *filters.FiltersList) (*find.Found[model.Currency], error) {
|
|
||||||
|
|
||||||
found, err := find.Paginate[model.Currency](langId, p, db.DB.
|
|
||||||
Model(&model.Currency{}).
|
|
||||||
Scopes(filt.All()...),
|
|
||||||
)
|
|
||||||
|
|
||||||
return &found, err
|
|
||||||
}
|
|
||||||
@@ -62,5 +62,6 @@ tasks:
|
|||||||
sed '/-- +goose Down/,$d' i18n/migrations/20260302163123_create_tables_data.sql | docker compose -p {{.PROJECT}} exec -T {{.LOCAL_DB_SERVICE}} mariadb -u {{.LOCAL_DB_USER}} --password={{.LOCAL_DB_PASSWORD}} {{.LOCAL_DB_NAME}}
|
sed '/-- +goose Down/,$d' i18n/migrations/20260302163123_create_tables_data.sql | docker compose -p {{.PROJECT}} exec -T {{.LOCAL_DB_SERVICE}} mariadb -u {{.LOCAL_DB_USER}} --password={{.LOCAL_DB_PASSWORD}} {{.LOCAL_DB_NAME}}
|
||||||
sed '/-- +goose Down/,$d' i18n/migrations/20260302163152_translations_backoffice.sql | docker compose -p {{.PROJECT}} exec -T {{.LOCAL_DB_SERVICE}} mariadb -u {{.LOCAL_DB_USER}} --password={{.LOCAL_DB_PASSWORD}} {{.LOCAL_DB_NAME}}
|
sed '/-- +goose Down/,$d' i18n/migrations/20260302163152_translations_backoffice.sql | docker compose -p {{.PROJECT}} exec -T {{.LOCAL_DB_SERVICE}} mariadb -u {{.LOCAL_DB_USER}} --password={{.LOCAL_DB_PASSWORD}} {{.LOCAL_DB_NAME}}
|
||||||
sed '/-- +goose Down/,$d' i18n/migrations/20260302163157_translations_backend.sql | docker compose -p {{.PROJECT}} exec -T {{.LOCAL_DB_SERVICE}} mariadb -u {{.LOCAL_DB_USER}} --password={{.LOCAL_DB_PASSWORD}} {{.LOCAL_DB_NAME}}
|
sed '/-- +goose Down/,$d' i18n/migrations/20260302163157_translations_backend.sql | docker compose -p {{.PROJECT}} exec -T {{.LOCAL_DB_SERVICE}} mariadb -u {{.LOCAL_DB_USER}} --password={{.LOCAL_DB_PASSWORD}} {{.LOCAL_DB_NAME}}
|
||||||
|
sed '/-- +goose Down/,$d' i18n/migrations/20260319163200_procedures.sql | docker compose -p {{.PROJECT}} exec -T {{.LOCAL_DB_SERVICE}} mariadb -u {{.LOCAL_DB_USER}} --password={{.LOCAL_DB_PASSWORD}} {{.LOCAL_DB_NAME}}
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user