Compare commits
1 Commits
main
...
609f1bebff
| Author | SHA1 | Date | |
|---|---|---|---|
| 609f1bebff |
@@ -6,9 +6,8 @@ import (
|
|||||||
|
|
||||||
"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/web"
|
"git.ma-al.com/goc_daniel/b2b/app/delivery/web"
|
||||||
|
logger "git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/langsService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/langsService"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/version"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/version"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
@@ -24,7 +23,7 @@ var (
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Init("b2b", nil, config.Get().Log.LogLevel, config.Get().Log.LogColorize)
|
logger.Init("b2b", nil, config.Get().App.LogLevel, config.Get().App.LogColorize)
|
||||||
|
|
||||||
// Create and setup the server
|
// Create and setup the server
|
||||||
server := web.New()
|
server := web.New()
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ type Config struct {
|
|||||||
Cors CorsConfig
|
Cors CorsConfig
|
||||||
MeiliSearch MeiliSearchConfig
|
MeiliSearch MeiliSearchConfig
|
||||||
Storage StorageConfig
|
Storage StorageConfig
|
||||||
Log LogConfig
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type I18n struct {
|
type I18n struct {
|
||||||
@@ -86,9 +85,6 @@ type AppConfig struct {
|
|||||||
Version string `env:"APP_VERSION,1.0.0"`
|
Version string `env:"APP_VERSION,1.0.0"`
|
||||||
Environment string `env:"APP_ENVIRONMENT,development"`
|
Environment string `env:"APP_ENVIRONMENT,development"`
|
||||||
BaseURL string `env:"APP_BASE_URL,http://localhost:5173"`
|
BaseURL string `env:"APP_BASE_URL,http://localhost:5173"`
|
||||||
}
|
|
||||||
|
|
||||||
type LogConfig struct {
|
|
||||||
LogLevel string `env:"LOG_LEVEL,warn"`
|
LogLevel string `env:"LOG_LEVEL,warn"`
|
||||||
LogColorize bool `env:"LOG_COLORIZE,true"`
|
LogColorize bool `env:"LOG_COLORIZE,true"`
|
||||||
}
|
}
|
||||||
@@ -215,11 +211,6 @@ func load() *Config {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("not possible to load env variables for storage : ", err.Error(), "")
|
slog.Error("not possible to load env variables for storage : ", err.Error(), "")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = loadEnv(&cfg.Log)
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("not possible to load env variables for logger : ", err.Error(), "")
|
|
||||||
}
|
|
||||||
cfg.Storage.RootFolder = ResolveRelativePath(cfg.Storage.RootFolder)
|
cfg.Storage.RootFolder = ResolveRelativePath(cfg.Storage.RootFolder)
|
||||||
|
|
||||||
return cfg
|
return cfg
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ import (
|
|||||||
|
|
||||||
"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"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"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/authService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/authService"
|
||||||
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/i18n"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/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"
|
||||||
@@ -75,6 +75,13 @@ func (h *AuthHandler) Login(c fiber.Ctx) error {
|
|||||||
// Attempt login
|
// Attempt login
|
||||||
response, rawRefreshToken, err := h.authService.Login(&req)
|
response, rawRefreshToken, err := h.authService.Login(&req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
||||||
|
logger.Error("login failed",
|
||||||
|
"handler", "AuthHandler.Login",
|
||||||
|
|
||||||
|
"email", req.Email,
|
||||||
|
"error", err.Error(),
|
||||||
|
)
|
||||||
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
|
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
|
||||||
"error": responseErrors.GetErrorCode(c, err),
|
"error": responseErrors.GetErrorCode(c, err),
|
||||||
})
|
})
|
||||||
@@ -212,6 +219,12 @@ func (h *AuthHandler) ResetPassword(c fiber.Ctx) error {
|
|||||||
// Reset password (also revokes all refresh tokens for the user)
|
// Reset password (also revokes all refresh tokens for the user)
|
||||||
err := h.authService.ResetPassword(req.Token, req.Password)
|
err := h.authService.ResetPassword(req.Token, req.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
||||||
|
logger.Error("password reset failed",
|
||||||
|
"handler", "AuthHandler.ResetPassword",
|
||||||
|
|
||||||
|
"error", err.Error(),
|
||||||
|
)
|
||||||
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
|
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
|
||||||
"error": responseErrors.GetErrorCode(c, err),
|
"error": responseErrors.GetErrorCode(c, err),
|
||||||
})
|
})
|
||||||
@@ -313,6 +326,13 @@ func (h *AuthHandler) Register(c fiber.Ctx) error {
|
|||||||
// Attempt registration
|
// Attempt registration
|
||||||
err := h.authService.Register(&req)
|
err := h.authService.Register(&req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
||||||
|
logger.Error("registration failed",
|
||||||
|
"handler", "AuthHandler.Register",
|
||||||
|
|
||||||
|
"email", req.Email,
|
||||||
|
"error", err.Error(),
|
||||||
|
)
|
||||||
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
|
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
|
||||||
"error": responseErrors.GetErrorCode(c, err),
|
"error": responseErrors.GetErrorCode(c, err),
|
||||||
})
|
})
|
||||||
@@ -452,6 +472,12 @@ func (h *AuthHandler) GoogleCallback(c fiber.Ctx) error {
|
|||||||
|
|
||||||
response, rawRefreshToken, err := h.authService.HandleGoogleCallback(code)
|
response, rawRefreshToken, err := h.authService.HandleGoogleCallback(code)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
||||||
|
logger.Error("google oauth callback failed",
|
||||||
|
"handler", "AuthHandler.GoogleCallback",
|
||||||
|
|
||||||
|
"error", err.Error(),
|
||||||
|
)
|
||||||
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
|
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
|
||||||
"error": responseErrors.GetErrorCode(c, err),
|
"error": responseErrors.GetErrorCode(c, err),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ package restricted
|
|||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/addressesService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/addressesService"
|
||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/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"
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ package restricted
|
|||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/cartsService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/cartsService"
|
||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/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"
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import (
|
|||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/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"
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ import (
|
|||||||
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware"
|
"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/delivery/middleware/perms"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"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/localeExtractor"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/query/query_params"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package restricted
|
package restricted
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/localeSelectorService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/localeSelectorService"
|
||||||
"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/logger"
|
|
||||||
"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/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"
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ package restricted
|
|||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/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"
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ package restricted
|
|||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"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/orderService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/orderService"
|
||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/query/query_params"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
||||||
@@ -73,11 +73,6 @@ var columnMappingListOrders map[string]string = map[string]string{
|
|||||||
"name": "b2b_customer_orders.name",
|
"name": "b2b_customer_orders.name",
|
||||||
"country_id": "b2b_customer_orders.country_id",
|
"country_id": "b2b_customer_orders.country_id",
|
||||||
"status": "b2b_customer_orders.status",
|
"status": "b2b_customer_orders.status",
|
||||||
"base_price": "b2b_customer_orders.base_price",
|
|
||||||
"tax_incl": "b2b_customer_orders.tax_incl",
|
|
||||||
"tax_excl": "b2b_customer_orders.tax_excl",
|
|
||||||
"created_at": "b2b_customer_orders.created_at",
|
|
||||||
"updated_at": "b2b_customer_orders.updated_at",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *OrdersHandler) PlaceNewOrder(c fiber.Ctx) error {
|
func (h *OrdersHandler) PlaceNewOrder(c fiber.Ctx) error {
|
||||||
|
|||||||
@@ -4,12 +4,12 @@ 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/internal/logger"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/model/dbmodel"
|
"git.ma-al.com/goc_daniel/b2b/app/model/dbmodel"
|
||||||
"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"
|
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/localeExtractor"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/query/query_params"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import (
|
|||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/productTranslationService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/productTranslationService"
|
||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/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"
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ import (
|
|||||||
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware"
|
"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/delivery/middleware/perms"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/meiliService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/meiliService"
|
||||||
searchservice "git.ma-al.com/goc_daniel/b2b/app/service/searchService"
|
searchservice "git.ma-al.com/goc_daniel/b2b/app/service/searchService"
|
||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/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"
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import (
|
|||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"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/specificPriceService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/specificPriceService"
|
||||||
"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/logger"
|
|
||||||
"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/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"
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ import (
|
|||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/storageService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/storageService"
|
||||||
"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"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"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/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"
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ func (h *consoleHandler) Handle(ctx context.Context, r slog.Record) error {
|
|||||||
case slog.LevelWarn:
|
case slog.LevelWarn:
|
||||||
color = yellow
|
color = yellow
|
||||||
case slog.LevelInfo:
|
case slog.LevelInfo:
|
||||||
color = blue
|
color = green
|
||||||
case slog.LevelDebug:
|
case slog.LevelDebug:
|
||||||
color = gray
|
color = gray
|
||||||
}
|
}
|
||||||
@@ -47,9 +47,9 @@ func (h *consoleHandler) Handle(ctx context.Context, r slog.Record) error {
|
|||||||
var msg string
|
var msg string
|
||||||
if h.colorize {
|
if h.colorize {
|
||||||
msg = fmt.Sprintf("%s%s%s %s%s%s %s%s%s",
|
msg = fmt.Sprintf("%s%s%s %s%s%s %s%s%s",
|
||||||
reset, r.Time.Format("15:04:05"), reset,
|
gray, r.Time.Format("15:04:05"), reset,
|
||||||
color, level, reset,
|
color, level, reset,
|
||||||
reset, r.Message, reset)
|
blue, r.Message, reset)
|
||||||
} else {
|
} else {
|
||||||
msg = fmt.Sprintf("%s %s %s", r.Time.Format("15:04:05"), level, r.Message)
|
msg = fmt.Sprintf("%s %s %s", r.Time.Format("15:04:05"), level, r.Message)
|
||||||
}
|
}
|
||||||
@@ -57,7 +57,7 @@ func (h *consoleHandler) Handle(ctx context.Context, r slog.Record) error {
|
|||||||
var pairs []string
|
var pairs []string
|
||||||
r.Attrs(func(attr slog.Attr) bool {
|
r.Attrs(func(attr slog.Attr) bool {
|
||||||
if h.colorize {
|
if h.colorize {
|
||||||
pairs = append(pairs, fmt.Sprintf("%s%s=%s%v%s", green, attr.Key, reset, attr.Value, reset))
|
pairs = append(pairs, fmt.Sprintf("%s=%v%s", blue, attr.Value, reset))
|
||||||
} else {
|
} else {
|
||||||
pairs = append(pairs, fmt.Sprintf("%s=%v", attr.Key, attr.Value))
|
pairs = append(pairs, fmt.Sprintf("%s=%v", attr.Key, attr.Value))
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
type CustomerOrder struct {
|
type CustomerOrder struct {
|
||||||
OrderID uint `gorm:"column:order_id;primaryKey;autoIncrement" json:"order_id"`
|
OrderID uint `gorm:"column:order_id;primaryKey;autoIncrement" json:"order_id"`
|
||||||
UserID uint `gorm:"column:user_id;not null;index" json:"user_id"`
|
UserID uint `gorm:"column:user_id;not null;index" json:"user_id"`
|
||||||
@@ -10,11 +8,6 @@ type CustomerOrder struct {
|
|||||||
AddressString string `gorm:"column:address_string;not null" json:"address_string"`
|
AddressString string `gorm:"column:address_string;not null" json:"address_string"`
|
||||||
AddressUnparsed *AddressUnparsed `gorm:"-" json:"address_unparsed"`
|
AddressUnparsed *AddressUnparsed `gorm:"-" json:"address_unparsed"`
|
||||||
Status string `gorm:"column:status;size:50;not null" json:"status"`
|
Status string `gorm:"column:status;size:50;not null" json:"status"`
|
||||||
BasePrice float64 `gorm:"column:base_price;type:decimal(10,2);not null" json:"base_price"`
|
|
||||||
TaxIncl float64 `gorm:"column:tax_incl;type:decimal(10,2);not null" json:"tax_incl"`
|
|
||||||
TaxExcl float64 `gorm:"column:tax_excl;type:decimal(10,2);not null" json:"tax_excl"`
|
|
||||||
CreatedAt time.Time `gorm:"column:created_at;not null" json:"created_at"`
|
|
||||||
UpdatedAt time.Time `gorm:"column:updated_at;not null" json:"updated_at"`
|
|
||||||
Products []OrderProduct `gorm:"foreignKey:OrderID;references:OrderID" json:"products"`
|
Products []OrderProduct `gorm:"foreignKey:OrderID;references:OrderID" json:"products"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package ordersRepo
|
package ordersRepo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
|
||||||
|
|
||||||
"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"
|
||||||
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
|
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
|
||||||
@@ -13,7 +11,7 @@ import (
|
|||||||
type UIOrdersRepo interface {
|
type UIOrdersRepo interface {
|
||||||
UserHasOrder(user_id uint, order_id uint) (bool, error)
|
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, base_price float64, tax_incl float64, tax_excl float64) 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
|
ChangeOrderAddress(order_id uint, country_id uint, address_info string) error
|
||||||
ChangeOrderStatus(order_id uint, status string) error
|
ChangeOrderStatus(order_id uint, status string) error
|
||||||
}
|
}
|
||||||
@@ -71,7 +69,7 @@ func (repo *OrdersRepo) Find(user_id uint, p find.Paging, filt *filters.FiltersL
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (repo *OrdersRepo) PlaceNewOrder(cart *model.CustomerCart, name string, country_id uint, address_info string, base_price float64, tax_incl float64, tax_excl float64) error {
|
func (repo *OrdersRepo) PlaceNewOrder(cart *model.CustomerCart, name string, country_id uint, address_info string) error {
|
||||||
order := model.CustomerOrder{
|
order := model.CustomerOrder{
|
||||||
UserID: cart.UserID,
|
UserID: cart.UserID,
|
||||||
Name: name,
|
Name: name,
|
||||||
@@ -89,12 +87,6 @@ func (repo *OrdersRepo) PlaceNewOrder(cart *model.CustomerCart, name string, cou
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
order.CreatedAt = time.Now()
|
|
||||||
order.UpdatedAt = time.Now()
|
|
||||||
order.BasePrice = base_price
|
|
||||||
order.TaxIncl = tax_incl
|
|
||||||
order.TaxExcl = tax_excl
|
|
||||||
|
|
||||||
return db.DB.Create(&order).Error
|
return db.DB.Create(&order).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,7 +97,6 @@ func (repo *OrdersRepo) ChangeOrderAddress(order_id uint, country_id uint, addre
|
|||||||
Updates(map[string]interface{}{
|
Updates(map[string]interface{}{
|
||||||
"country_id": country_id,
|
"country_id": country_id,
|
||||||
"address_string": address_info,
|
"address_string": address_info,
|
||||||
"updated_at": time.Now(),
|
|
||||||
}).
|
}).
|
||||||
Error
|
Error
|
||||||
}
|
}
|
||||||
@@ -114,9 +105,6 @@ func (repo *OrdersRepo) ChangeOrderStatus(order_id uint, status string) error {
|
|||||||
return db.DB.
|
return db.DB.
|
||||||
Table("b2b_customer_orders").
|
Table("b2b_customer_orders").
|
||||||
Where("order_id = ?", order_id).
|
Where("order_id = ?", order_id).
|
||||||
Updates(map[string]interface{}{
|
Update("status", status).
|
||||||
"status": status,
|
|
||||||
"updated_at": time.Now(),
|
|
||||||
}).
|
|
||||||
Error
|
Error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import (
|
|||||||
roleRepo "git.ma-al.com/goc_daniel/b2b/app/repos/rolesRepo"
|
roleRepo "git.ma-al.com/goc_daniel/b2b/app/repos/rolesRepo"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/emailService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/emailService"
|
||||||
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/logger"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
||||||
|
|
||||||
"github.com/dlclark/regexp2"
|
"github.com/dlclark/regexp2"
|
||||||
@@ -69,47 +68,22 @@ func (s *AuthService) Login(req *model.LoginRequest) (*model.AuthResponse, strin
|
|||||||
// Find user by email
|
// Find user by email
|
||||||
if err := s.db.Preload("Role.Permissions").Where("email = ?", req.Email).First(&user).Error; err != nil {
|
if err := s.db.Preload("Role.Permissions").Where("email = ?", req.Email).First(&user).Error; err != nil {
|
||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
logger.Info("login failed - invalid credentials",
|
|
||||||
"service", "AuthService.Login",
|
|
||||||
"email", req.Email,
|
|
||||||
"reason", "user not found",
|
|
||||||
)
|
|
||||||
return nil, "", responseErrors.ErrInvalidCredentials
|
return nil, "", responseErrors.ErrInvalidCredentials
|
||||||
}
|
}
|
||||||
logger.Error("login failed - database error",
|
|
||||||
"service", "AuthService.Login",
|
|
||||||
"email", req.Email,
|
|
||||||
"error", err.Error(),
|
|
||||||
)
|
|
||||||
return nil, "", fmt.Errorf("database error: %w", err)
|
return nil, "", fmt.Errorf("database error: %w", err)
|
||||||
}
|
}
|
||||||
// Check if user is active
|
// Check if user is active
|
||||||
if !user.IsActive {
|
if !user.IsActive {
|
||||||
logger.Info("login failed - user inactive",
|
|
||||||
"service", "AuthService.Login",
|
|
||||||
"email", req.Email,
|
|
||||||
"reason", "user account is inactive",
|
|
||||||
)
|
|
||||||
return nil, "", responseErrors.ErrUserInactive
|
return nil, "", responseErrors.ErrUserInactive
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if email is verified
|
// Check if email is verified
|
||||||
if !user.EmailVerified {
|
if !user.EmailVerified {
|
||||||
logger.Info("login failed - email not verified",
|
|
||||||
"service", "AuthService.Login",
|
|
||||||
"email", req.Email,
|
|
||||||
"reason", "email not verified",
|
|
||||||
)
|
|
||||||
return nil, "", responseErrors.ErrEmailNotVerified
|
return nil, "", responseErrors.ErrEmailNotVerified
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify password
|
// Verify password
|
||||||
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password)); err != nil {
|
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password)); err != nil {
|
||||||
logger.Info("login failed - invalid credentials",
|
|
||||||
"service", "AuthService.Login",
|
|
||||||
"email", req.Email,
|
|
||||||
"reason", "wrong password",
|
|
||||||
)
|
|
||||||
return nil, "", responseErrors.ErrInvalidCredentials
|
return nil, "", responseErrors.ErrInvalidCredentials
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,38 +94,22 @@ func (s *AuthService) Login(req *model.LoginRequest) (*model.AuthResponse, strin
|
|||||||
if req.LangID != nil {
|
if req.LangID != nil {
|
||||||
_, err := s.GetLangISOCode(*req.LangID)
|
_, err := s.GetLangISOCode(*req.LangID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Warn("login failed - invalid language ID",
|
|
||||||
"service", "AuthService.Login",
|
|
||||||
"email", req.Email,
|
|
||||||
"reason", "invalid language ID",
|
|
||||||
)
|
|
||||||
return nil, "", responseErrors.ErrBadLangID
|
return nil, "", responseErrors.ErrBadLangID
|
||||||
}
|
}
|
||||||
user.LangID = *req.LangID
|
user.LangID = *req.LangID
|
||||||
}
|
}
|
||||||
|
|
||||||
user.Country = nil
|
|
||||||
s.db.Save(&user)
|
s.db.Save(&user)
|
||||||
|
|
||||||
// Generate access token (JWT)
|
// Generate access token (JWT)
|
||||||
accessToken, err := s.generateAccessToken(&user)
|
accessToken, err := s.generateAccessToken(&user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("login failed - token generation error",
|
|
||||||
"service", "AuthService.Login",
|
|
||||||
"email", req.Email,
|
|
||||||
"error", err.Error(),
|
|
||||||
)
|
|
||||||
return nil, "", fmt.Errorf("failed to generate access token: %w", err)
|
return nil, "", fmt.Errorf("failed to generate access token: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate opaque refresh token and store in DB
|
// Generate opaque refresh token and store in DB
|
||||||
rawRefreshToken, err := s.createRefreshToken(user.ID)
|
rawRefreshToken, err := s.createRefreshToken(user.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error("login failed - refresh token creation error",
|
|
||||||
"service", "AuthService.Login",
|
|
||||||
"email", req.Email,
|
|
||||||
"error", err.Error(),
|
|
||||||
)
|
|
||||||
return nil, "", fmt.Errorf("failed to create refresh token: %w", err)
|
return nil, "", fmt.Errorf("failed to create refresh token: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,11 +170,6 @@ func (s *AuthService) Register(req *model.RegisterRequest) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := s.db.Create(&user).Error; err != nil {
|
if err := s.db.Create(&user).Error; err != nil {
|
||||||
logger.Error("registration failed - database error",
|
|
||||||
"service", "AuthService.Register",
|
|
||||||
"email", req.Email,
|
|
||||||
"error", err.Error(),
|
|
||||||
)
|
|
||||||
return fmt.Errorf("failed to create user: %w", err)
|
return fmt.Errorf("failed to create user: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,11 +181,8 @@ func (s *AuthService) Register(req *model.RegisterRequest) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := s.email.SendVerificationEmail(user.Email, user.EmailVerificationToken, baseURL, lang); err != nil {
|
if err := s.email.SendVerificationEmail(user.Email, user.EmailVerificationToken, baseURL, lang); err != nil {
|
||||||
logger.Warn("failed to send verification email",
|
// Log error but don't fail registration - user can request resend
|
||||||
"service", "AuthService.Register",
|
_ = err
|
||||||
"email", req.Email,
|
|
||||||
"error", err.Error(),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -260,7 +210,6 @@ func (s *AuthService) CompleteRegistration(req *model.CompleteRegistrationReques
|
|||||||
user.EmailVerificationToken = ""
|
user.EmailVerificationToken = ""
|
||||||
user.EmailVerificationExpires = nil
|
user.EmailVerificationExpires = nil
|
||||||
|
|
||||||
user.Country = nil
|
|
||||||
if err := s.db.Save(&user).Error; err != nil {
|
if err := s.db.Save(&user).Error; err != nil {
|
||||||
return nil, "", fmt.Errorf("failed to update user: %w", err)
|
return nil, "", fmt.Errorf("failed to update user: %w", err)
|
||||||
}
|
}
|
||||||
@@ -329,7 +278,6 @@ func (s *AuthService) RequestPasswordReset(emailAddr string) error {
|
|||||||
user.PasswordResetToken = token
|
user.PasswordResetToken = token
|
||||||
user.PasswordResetExpires = &expiresAt
|
user.PasswordResetExpires = &expiresAt
|
||||||
user.LastPasswordResetRequest = &now
|
user.LastPasswordResetRequest = &now
|
||||||
user.Country = nil
|
|
||||||
if err := s.db.Save(&user).Error; err != nil {
|
if err := s.db.Save(&user).Error; err != nil {
|
||||||
return fmt.Errorf("failed to save reset token: %w", err)
|
return fmt.Errorf("failed to save reset token: %w", err)
|
||||||
}
|
}
|
||||||
@@ -356,10 +304,6 @@ func (s *AuthService) ResetPassword(token, newPassword string) error {
|
|||||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
return responseErrors.ErrInvalidResetToken
|
return responseErrors.ErrInvalidResetToken
|
||||||
}
|
}
|
||||||
logger.Error("password reset failed - database error",
|
|
||||||
"service", "AuthService.ResetPassword",
|
|
||||||
"error", err.Error(),
|
|
||||||
)
|
|
||||||
return fmt.Errorf("database error: %w", err)
|
return fmt.Errorf("database error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -384,12 +328,7 @@ func (s *AuthService) ResetPassword(token, newPassword string) error {
|
|||||||
user.PasswordResetToken = ""
|
user.PasswordResetToken = ""
|
||||||
user.PasswordResetExpires = nil
|
user.PasswordResetExpires = nil
|
||||||
|
|
||||||
user.Country = nil
|
|
||||||
if err := s.db.Save(&user).Error; err != nil {
|
if err := s.db.Save(&user).Error; err != nil {
|
||||||
logger.Error("password reset failed - database error",
|
|
||||||
"service", "AuthService.ResetPassword",
|
|
||||||
"error", err.Error(),
|
|
||||||
)
|
|
||||||
return fmt.Errorf("failed to update password: %w", err)
|
return fmt.Errorf("failed to update password: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -600,7 +539,6 @@ func (s *AuthService) UpdateJWTToken(user *model.Customer) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Save the updated user
|
// Save the updated user
|
||||||
user.Country = nil
|
|
||||||
if err := s.db.Save(user).Error; err != nil {
|
if err := s.db.Save(user).Error; err != nil {
|
||||||
return "", fmt.Errorf("database error: %w", err)
|
return "", fmt.Errorf("database error: %w", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,12 +8,10 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"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/model"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/view"
|
"git.ma-al.com/goc_daniel/b2b/app/view"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
@@ -79,20 +77,12 @@ func (s *AuthService) HandleGoogleCallback(code string) (*model.AuthResponse, st
|
|||||||
// Find or create user
|
// Find or create user
|
||||||
user, err := s.findOrCreateGoogleUser(userInfo)
|
user, err := s.findOrCreateGoogleUser(userInfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(err.Error(), "database") {
|
|
||||||
logger.Error("google oauth callback failed - database error",
|
|
||||||
"service", "AuthService.HandleGoogleCallback",
|
|
||||||
"email", userInfo.Email,
|
|
||||||
"error", err.Error(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
return nil, "", err
|
return nil, "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update last login
|
// Update last login
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
user.LastLoginAt = &now
|
user.LastLoginAt = &now
|
||||||
user.Country = nil
|
|
||||||
s.db.Save(user)
|
s.db.Save(user)
|
||||||
|
|
||||||
// Generate access token (JWT)
|
// Generate access token (JWT)
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package cartsService
|
package cartsService
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"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/cartsRepo"
|
"git.ma-al.com/goc_daniel/b2b/app/repos/cartsRepo"
|
||||||
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/logger"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -4,14 +4,12 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
|
||||||
|
"git.ma-al.com/goc_daniel/b2b/app/internal/logger"
|
||||||
"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/cartsRepo"
|
"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/repos/ordersRepo"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/repos/productsRepo"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/addressesService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/addressesService"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/service/emailService"
|
"git.ma-al.com/goc_daniel/b2b/app/service/emailService"
|
||||||
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
|
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/query/filters"
|
"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/query/find"
|
||||||
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
|
||||||
@@ -20,7 +18,6 @@ import (
|
|||||||
type OrderService struct {
|
type OrderService struct {
|
||||||
ordersRepo ordersRepo.UIOrdersRepo
|
ordersRepo ordersRepo.UIOrdersRepo
|
||||||
cartsRepo cartsRepo.UICartsRepo
|
cartsRepo cartsRepo.UICartsRepo
|
||||||
productsRepo productsRepo.UIProductsRepo
|
|
||||||
addressesService *addressesService.AddressesService
|
addressesService *addressesService.AddressesService
|
||||||
emailService *emailService.EmailService
|
emailService *emailService.EmailService
|
||||||
}
|
}
|
||||||
@@ -29,7 +26,6 @@ func New() *OrderService {
|
|||||||
return &OrderService{
|
return &OrderService{
|
||||||
ordersRepo: ordersRepo.New(),
|
ordersRepo: ordersRepo.New(),
|
||||||
cartsRepo: cartsRepo.New(),
|
cartsRepo: cartsRepo.New(),
|
||||||
productsRepo: productsRepo.New(),
|
|
||||||
addressesService: addressesService.New(),
|
addressesService: addressesService.New(),
|
||||||
emailService: emailService.NewEmailService(),
|
emailService: emailService.NewEmailService(),
|
||||||
}
|
}
|
||||||
@@ -89,10 +85,8 @@ func (s *OrderService) PlaceNewOrder(user_id uint, cart_id uint, name string, co
|
|||||||
name = *cart.Name
|
name = *cart.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
base_price, tax_incl, tax_excl, err := s.getOrderTotalPrice(user_id, cart_id, country_id)
|
|
||||||
|
|
||||||
// all checks passed
|
// all checks passed
|
||||||
err = s.ordersRepo.PlaceNewOrder(cart, name, country_id, address_info, base_price, tax_incl, tax_excl)
|
err = s.ordersRepo.PlaceNewOrder(cart, name, country_id, address_info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -159,27 +153,3 @@ func (s *OrderService) ChangeOrderStatus(user *model.Customer, order_id uint, st
|
|||||||
|
|
||||||
return s.ordersRepo.ChangeOrderStatus(order_id, status)
|
return s.ordersRepo.ChangeOrderStatus(order_id, status)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *OrderService) getOrderTotalPrice(user_id uint, cart_id uint, country_id uint) (float64, float64, float64, error) {
|
|
||||||
cart, err := s.cartsRepo.RetrieveCart(user_id, cart_id)
|
|
||||||
if err != nil {
|
|
||||||
return 0.0, 0.0, 0.0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
base_price := 0.0
|
|
||||||
tax_incl := 0.0
|
|
||||||
tax_excl := 0.0
|
|
||||||
|
|
||||||
for _, product := range cart.Products {
|
|
||||||
prices, err := s.productsRepo.GetPrice(product.ProductID, product.ProductAttributeID, constdata.SHOP_ID, user_id, country_id, product.Amount)
|
|
||||||
if err != nil {
|
|
||||||
return 0.0, 0.0, 0.0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
base_price += prices.Base
|
|
||||||
tax_incl += prices.FinalTaxIncl
|
|
||||||
tax_excl += prices.FinalTaxExcl
|
|
||||||
}
|
|
||||||
|
|
||||||
return base_price, tax_incl, tax_excl, nil
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -5,14 +5,15 @@ info:
|
|||||||
|
|
||||||
http:
|
http:
|
||||||
method: POST
|
method: POST
|
||||||
url: http://localhost:3000/api/v1/public/auth/update-choice?lang_id=1&country_id=1
|
url: http://localhost:3000/api/v1/public/auth/update-choice?lang_id=0&country_id=1
|
||||||
params:
|
params:
|
||||||
- name: lang_id
|
- name: lang_id
|
||||||
value: "1"
|
value: "0"
|
||||||
type: query
|
type: query
|
||||||
- name: country_id
|
- name: country_id
|
||||||
value: "1"
|
value: "1"
|
||||||
type: query
|
type: query
|
||||||
|
auth: inherit
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
encodeUrl: true
|
encodeUrl: true
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ info:
|
|||||||
|
|
||||||
http:
|
http:
|
||||||
method: GET
|
method: GET
|
||||||
url: http://localhost:3000/api/v1/restricted/carts/add-product-to-cart?cart_id=1&product_id=51&product_attribute_id=1115&amount=2&set_amount=true
|
url: http://localhost:3000/api/v1/restricted/carts/add-product-to-cart?cart_id=1&product_id=51&product_attribute_id=1115&amount=1&set_amount=true
|
||||||
params:
|
params:
|
||||||
- name: cart_id
|
- name: cart_id
|
||||||
value: "1"
|
value: "1"
|
||||||
@@ -17,7 +17,7 @@ http:
|
|||||||
value: "1115"
|
value: "1115"
|
||||||
type: query
|
type: query
|
||||||
- name: amount
|
- name: amount
|
||||||
value: "2"
|
value: "1"
|
||||||
type: query
|
type: query
|
||||||
- name: set_amount
|
- name: set_amount
|
||||||
value: "true"
|
value: "true"
|
||||||
|
|||||||
@@ -251,11 +251,6 @@ CREATE TABLE IF NOT EXISTS b2b_customer_orders (
|
|||||||
country_id BIGINT UNSIGNED NOT NULL,
|
country_id BIGINT UNSIGNED NOT NULL,
|
||||||
address_string TEXT NOT NULL,
|
address_string TEXT NOT NULL,
|
||||||
status VARCHAR(50) NOT NULL,
|
status VARCHAR(50) NOT NULL,
|
||||||
created_at DATETIME NOT NULL,
|
|
||||||
updated_at DATETIME NOT NULL,
|
|
||||||
base_price DECIMAL(10, 2) NOT NULL,
|
|
||||||
tax_incl DECIMAL(10, 2) NOT NULL,
|
|
||||||
tax_excl DECIMAL(10, 2) NOT NULL,
|
|
||||||
CONSTRAINT fk_customer_orders_customers FOREIGN KEY (user_id) REFERENCES b2b_customers(id) ON DELETE NO ACTION ON UPDATE CASCADE,
|
CONSTRAINT fk_customer_orders_customers FOREIGN KEY (user_id) REFERENCES b2b_customers(id) ON DELETE NO ACTION ON UPDATE CASCADE,
|
||||||
CONSTRAINT fk_customer_orders_countries FOREIGN KEY (country_id) REFERENCES b2b_countries(id) ON DELETE NO ACTION ON UPDATE CASCADE
|
CONSTRAINT fk_customer_orders_countries FOREIGN KEY (country_id) REFERENCES b2b_countries(id) ON DELETE NO ACTION ON UPDATE CASCADE
|
||||||
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
|
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
|
||||||
|
|||||||
@@ -415,7 +415,7 @@ BEGIN
|
|||||||
LEFT JOIN ps_manufacturer m
|
LEFT JOIN ps_manufacturer m
|
||||||
ON m.id_manufacturer = p.id_manufacturer
|
ON m.id_manufacturer = p.id_manufacturer
|
||||||
LEFT JOIN ps_configuration
|
LEFT JOIN ps_configuration
|
||||||
ON ps_configuration.name = 'PS_NB_DAYS_NEW_PRODUCT'
|
ON ps_configuration.name = PS_NB_DAYS_NEW_PRODUCT
|
||||||
|
|
||||||
WHERE p.id_product = p_id_product
|
WHERE p.id_product = p_id_product
|
||||||
LIMIT 1;
|
LIMIT 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user