diff --git a/app/delivery/middleware/auth.go b/app/delivery/middleware/auth.go index 2aefce0..c5a87cc 100644 --- a/app/delivery/middleware/auth.go +++ b/app/delivery/middleware/auth.go @@ -1,6 +1,7 @@ package middleware import ( + "strconv" "strings" "git.ma-al.com/goc_daniel/b2b/app/config" @@ -60,9 +61,52 @@ func AuthMiddleware() fiber.Handler { }) } - // Set user in context - c.Locals(constdata.USER_LOCALES_NAME, user.ToSession()) - c.Locals(constdata.USER_LOCALES_ID, user.ID) + // Create locale. LangID is overwritten by auth Token + var userLocale model.UserLocale + userLocale.OriginalUser = user + + // Check if target user is present + targetUserIDAttribute := c.Query("target_user_id") + + if targetUserIDAttribute == "" { + userLocale.User = user + c.Locals(constdata.USER_LOCALE, &userLocale) + + return c.Next() + } + + // We now populate the target user + if user.Role != model.RoleAdmin { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{ + "error": "admin access required", + }) + } + + targetUserID, err := strconv.Atoi(targetUserIDAttribute) + if err != nil { + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "error": "invalid target user id attribute", + }) + } + + // to verify target user, we use the same functionality as for verifying original user + // Get target user from database + user, err = authService.GetUserByID(uint(targetUserID)) + if err != nil { + return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{ + "error": "target user not found", + }) + } + + // Check if target user is active + if !user.IsActive { + return c.Status(fiber.StatusForbidden).JSON(fiber.Map{ + "error": "target user account is inactive", + }) + } + + userLocale.User = user + c.Locals(constdata.USER_LOCALE, &userLocale) return c.Next() } @@ -95,24 +139,6 @@ func RequireAdmin() fiber.Handler { } } -// GetUserID extracts user ID from context -func GetUserID(c fiber.Ctx) uint { - userID, ok := c.Locals("userID").(uint) - if !ok { - return 0 - } - return userID -} - -// GetUser extracts user from context -func GetUser(c fiber.Ctx) *model.UserSession { - user, ok := c.Locals("user").(*model.UserSession) - if !ok { - return nil - } - return user -} - // GetConfig returns the app config func GetConfig() *config.Config { return config.Get() diff --git a/app/delivery/middleware/language.go b/app/delivery/middleware/language.go index e3fd5ca..c23a8e7 100644 --- a/app/delivery/middleware/language.go +++ b/app/delivery/middleware/language.go @@ -4,7 +4,9 @@ import ( "strconv" "strings" + "git.ma-al.com/goc_daniel/b2b/app/model" "git.ma-al.com/goc_daniel/b2b/app/service/langsService" + constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data" "github.com/gofiber/fiber/v3" ) @@ -22,12 +24,8 @@ func LanguageMiddleware() fiber.Handler { if id, err := strconv.ParseUint(langIDStr, 10, 32); err == nil { langID = uint(id) if langID > 0 { - lang, err := langService.GetLanguageById(langID) - if err == nil { - c.Locals("langID", langID) - c.Locals("lang", lang) - return c.Next() - } + c.Locals(constdata.USER_LOCALE, returnNewLocale(langID)) + return c.Next() } } } @@ -38,12 +36,8 @@ func LanguageMiddleware() fiber.Handler { if id, err := strconv.ParseUint(cookieLang, 10, 32); err == nil { langID = uint(id) if langID > 0 { - lang, err := langService.GetLanguageById(langID) - if err == nil { - c.Locals("langID", langID) - c.Locals("lang", lang) - return c.Next() - } + c.Locals(constdata.USER_LOCALE, returnNewLocale(langID)) + return c.Next() } } } @@ -57,8 +51,7 @@ func LanguageMiddleware() fiber.Handler { lang, err := langService.GetLanguageByISOCode(isoCode) if err == nil && lang != nil { langID = uint(lang.ID) - c.Locals("langID", langID) - c.Locals("lang", lang) + c.Locals(constdata.USER_LOCALE, returnNewLocale(langID)) return c.Next() } } @@ -68,8 +61,7 @@ func LanguageMiddleware() fiber.Handler { defaultLang, err := langService.GetDefaultLanguage() if err == nil && defaultLang != nil { langID = uint(defaultLang.ID) - c.Locals("langID", langID) - c.Locals("lang", defaultLang) + c.Locals(constdata.USER_LOCALE, returnNewLocale(langID)) } return c.Next() @@ -104,11 +96,9 @@ func parseAcceptLanguage(header string) string { return strings.ToLower(first) } -// GetLanguageID extracts language ID from context -func GetLanguageID(c fiber.Ctx) uint { - langID, ok := c.Locals("langID").(uint) - if !ok { - return 0 - } - return langID +func returnNewLocale(lang_id uint) *model.UserLocale { + newLocale := model.UserLocale{} + newLocale.OriginalUser = &model.Customer{} + newLocale.OriginalUser.LangID = lang_id + return &newLocale } diff --git a/app/delivery/web/api/public/auth.go b/app/delivery/web/api/public/auth.go index 852a4ac..5cb4e52 100644 --- a/app/delivery/web/api/public/auth.go +++ b/app/delivery/web/api/public/auth.go @@ -268,15 +268,15 @@ func (h *AuthHandler) RefreshToken(c fiber.Ctx) error { // Me returns the current user info func (h *AuthHandler) Me(c fiber.Ctx) error { - user := c.Locals("user") - if user == nil { + userLocale := c.Locals(constdata.USER_LOCALE).(*model.UserLocale) + if userLocale.OriginalUser == nil { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{ "error": responseErrors.GetErrorCode(c, responseErrors.ErrNotAuthenticated), }) } return c.JSON(fiber.Map{ - "user": user, + "user": *userLocale.OriginalUser, }) } @@ -351,21 +351,12 @@ func (h *AuthHandler) CompleteRegistration(c fiber.Ctx) error { // Updates JWT Tokens. Requires authentication and updates access token only func (h *AuthHandler) UpdateJWTToken(c fiber.Ctx) error { - userLocals, ok := c.Locals(constdata.USER_LOCALES_NAME).(*model.UserSession) + userLocale, ok := c.Locals(constdata.USER_LOCALE).(*model.UserLocale) if !ok { return c.Status(fiber.StatusUnauthorized). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrNotAuthenticated))) } - user := model.Customer{ - ID: userLocals.UserID, - Email: userLocals.Email, - Role: userLocals.Role, - LangID: userLocals.LangID, - CountryID: userLocals.CountryID, - IsActive: userLocals.IsActive, - } - // Parse language and country_id from query params langIDStr := c.Query("lang_id") @@ -375,7 +366,7 @@ func (h *AuthHandler) UpdateJWTToken(c fiber.Ctx) error { return c.Status(fiber.StatusBadRequest). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadLangID))) } - user.LangID = uint(parsedID) + userLocale.OriginalUser.LangID = uint(parsedID) } countryIDStr := c.Query("country_id") @@ -386,10 +377,10 @@ func (h *AuthHandler) UpdateJWTToken(c fiber.Ctx) error { return c.Status(fiber.StatusBadRequest). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadCountryID))) } - user.CountryID = uint(parsedID) + userLocale.OriginalUser.CountryID = uint(parsedID) } - newAccessToken, err := h.authService.UpdateJWTToken(&user) + newAccessToken, err := h.authService.UpdateJWTToken(userLocale.OriginalUser) if err != nil { return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{ diff --git a/app/delivery/web/api/public/routing.go b/app/delivery/web/api/public/routing.go index 9e36274..bad8746 100644 --- a/app/delivery/web/api/public/routing.go +++ b/app/delivery/web/api/public/routing.go @@ -3,6 +3,7 @@ package public import ( "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/localeExtractor" "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/responseErrors" @@ -30,7 +31,7 @@ func RoutingHandlerRoutes(r fiber.Router) fiber.Router { } func (h *RoutingHandler) GetRouting(c fiber.Ctx) error { - lang_id, ok := c.Locals("langID").(uint) + lang_id, ok := localeExtractor.GetLangID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) diff --git a/app/delivery/web/api/restricted/carts.go b/app/delivery/web/api/restricted/carts.go index aeed1ee..a787620 100644 --- a/app/delivery/web/api/restricted/carts.go +++ b/app/delivery/web/api/restricted/carts.go @@ -5,6 +5,7 @@ import ( "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/localeExtractor" "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/responseErrors" @@ -37,7 +38,7 @@ func CartsHandlerRoutes(r fiber.Router) fiber.Router { } func (h *CartsHandler) AddNewCart(c fiber.Ctx) error { - userID, ok := c.Locals("userID").(uint) + userID, ok := localeExtractor.GetUserID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) @@ -53,7 +54,7 @@ func (h *CartsHandler) AddNewCart(c fiber.Ctx) error { } func (h *CartsHandler) ChangeCartName(c fiber.Ctx) error { - userID, ok := c.Locals("userID").(uint) + userID, ok := localeExtractor.GetUserID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) @@ -78,7 +79,7 @@ func (h *CartsHandler) ChangeCartName(c fiber.Ctx) error { } func (h *CartsHandler) RetrieveCartsInfo(c fiber.Ctx) error { - userID, ok := c.Locals("userID").(uint) + userID, ok := localeExtractor.GetUserID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) @@ -94,7 +95,7 @@ func (h *CartsHandler) RetrieveCartsInfo(c fiber.Ctx) error { } func (h *CartsHandler) RetrieveCart(c fiber.Ctx) error { - userID, ok := c.Locals("userID").(uint) + userID, ok := localeExtractor.GetUserID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) @@ -117,7 +118,7 @@ func (h *CartsHandler) RetrieveCart(c fiber.Ctx) error { } func (h *CartsHandler) AddProduct(c fiber.Ctx) error { - userID, ok := c.Locals("userID").(uint) + userID, ok := localeExtractor.GetUserID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) diff --git a/app/delivery/web/api/restricted/list.go b/app/delivery/web/api/restricted/list.go index 7965424..c6b3116 100644 --- a/app/delivery/web/api/restricted/list.go +++ b/app/delivery/web/api/restricted/list.go @@ -5,6 +5,7 @@ import ( "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" @@ -43,19 +44,19 @@ func (h *ListHandler) ListProducts(c fiber.Ctx) error { JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) } - id_lang, ok := c.Locals("langID").(uint) + 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))) } - listing, err := h.listService.ListProducts(id_lang, paging, filters) + 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(&listing.Items, int(listing.Count), i18n.T_(c, response.Message_OK))) + return c.JSON(response.Make(&list.Items, int(list.Count), i18n.T_(c, response.Message_OK))) } var columnMappingListProducts map[string]string = map[string]string{ @@ -74,19 +75,19 @@ func (h *ListHandler) ListUsers(c fiber.Ctx) error { JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) } - id_lang, ok := c.Locals("langID").(uint) + 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))) } - listing, err := h.listService.ListUsers(id_lang, paging, filters) + 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(&listing.Items, int(listing.Count), i18n.T_(c, response.Message_OK))) + return c.JSON(response.Make(&list.Items, int(list.Count), i18n.T_(c, response.Message_OK))) } var columnMappingListUsers map[string]string = map[string]string{ diff --git a/app/delivery/web/api/restricted/menu.go b/app/delivery/web/api/restricted/menu.go index b269fb7..4ed8300 100644 --- a/app/delivery/web/api/restricted/menu.go +++ b/app/delivery/web/api/restricted/menu.go @@ -5,6 +5,7 @@ import ( "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/localeExtractor" "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/responseErrors" @@ -33,7 +34,7 @@ func MenuHandlerRoutes(r fiber.Router) fiber.Router { } func (h *MenuHandler) GetCategoryTree(c fiber.Ctx) error { - lang_id, ok := c.Locals("langID").(uint) + lang_id, ok := localeExtractor.GetLangID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) @@ -56,7 +57,7 @@ func (h *MenuHandler) GetCategoryTree(c fiber.Ctx) error { } func (h *MenuHandler) GetBreadcrumb(c fiber.Ctx) error { - lang_id, ok := c.Locals("langID").(uint) + lang_id, ok := localeExtractor.GetLangID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) @@ -86,7 +87,7 @@ func (h *MenuHandler) GetBreadcrumb(c fiber.Ctx) error { } func (h *MenuHandler) GetTopMenu(c fiber.Ctx) error { - lang_id, ok := c.Locals("langID").(uint) + lang_id, ok := localeExtractor.GetLangID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) diff --git a/app/delivery/web/api/restricted/productTranslation.go b/app/delivery/web/api/restricted/productTranslation.go index 760ddb3..ea6f906 100644 --- a/app/delivery/web/api/restricted/productTranslation.go +++ b/app/delivery/web/api/restricted/productTranslation.go @@ -6,6 +6,7 @@ import ( "git.ma-al.com/goc_daniel/b2b/app/config" "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/localeExtractor" "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/responseErrors" @@ -41,7 +42,7 @@ func ProductTranslationHandlerRoutes(r fiber.Router) fiber.Router { // GetProductDescription returns the product description for a given product ID func (h *ProductTranslationHandler) GetProductDescription(c fiber.Ctx) error { - userID, ok := c.Locals("userID").(uint) + userID, ok := localeExtractor.GetUserID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) @@ -72,7 +73,7 @@ func (h *ProductTranslationHandler) GetProductDescription(c fiber.Ctx) error { // SaveProductDescription saves the description for a given product ID, in given language func (h *ProductTranslationHandler) SaveProductDescription(c fiber.Ctx) error { - userID, ok := c.Locals("userID").(uint) + userID, ok := localeExtractor.GetUserID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) @@ -109,7 +110,7 @@ func (h *ProductTranslationHandler) SaveProductDescription(c fiber.Ctx) error { // TranslateProductDescription returns translated product description func (h *ProductTranslationHandler) TranslateProductDescription(c fiber.Ctx) error { - userID, ok := c.Locals("userID").(uint) + userID, ok := localeExtractor.GetUserID(c) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) diff --git a/app/delivery/web/api/restricted/search.go b/app/delivery/web/api/restricted/search.go index ac6abb1..8881853 100644 --- a/app/delivery/web/api/restricted/search.go +++ b/app/delivery/web/api/restricted/search.go @@ -7,6 +7,7 @@ import ( "git.ma-al.com/goc_daniel/b2b/app/service/meiliService" 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/localeExtractor" "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/responseErrors" @@ -36,7 +37,7 @@ func MeiliSearchHandlerRoutes(r fiber.Router) fiber.Router { } func (h *MeiliSearchHandler) CreateIndex(c fiber.Ctx) error { - id_lang, ok := c.Locals("langID").(uint) + 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))) @@ -49,12 +50,11 @@ func (h *MeiliSearchHandler) CreateIndex(c fiber.Ctx) error { JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) } - nothing := "" - return c.JSON(response.Make(¬hing, 0, i18n.T_(c, response.Message_OK))) + return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK))) } func (h *MeiliSearchHandler) Search(c fiber.Ctx) error { - id_lang, ok := c.Locals("langID").(uint) + 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))) @@ -88,7 +88,7 @@ func (h *MeiliSearchHandler) Search(c fiber.Ctx) error { } func (h *MeiliSearchHandler) GetSettings(c fiber.Ctx) error { - id_lang, ok := c.Locals("langID").(uint) + 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))) diff --git a/app/model/customer.go b/app/model/customer.go index ec7b63d..3934dcd 100644 --- a/app/model/customer.go +++ b/app/model/customer.go @@ -82,6 +82,15 @@ type UserSession struct { IsActive bool `json:"is_active"` } +type UserLocale struct { + // User is the Target user if present, otherwise same as Original. + // User ought to be used in applications + User *Customer + // Original user is the one associated with auth token + OriginalUser *Customer + // Importantly, lang_id used in application is stored as OriginalUser.LangID +} + // ToSession converts User to UserSession func (u *Customer) ToSession() *UserSession { return &UserSession{ @@ -98,6 +107,7 @@ func (u *Customer) ToSession() *UserSession { type LoginRequest struct { Email string `json:"email" form:"email"` Password string `json:"password" form:"password"` + LangID *uint `json:"lang_id" form:"lang_id"` } // RegisterRequest represents the initial registration form data diff --git a/app/model/productDescription.go b/app/model/productDescription.go index 4781be5..985b819 100644 --- a/app/model/productDescription.go +++ b/app/model/productDescription.go @@ -18,9 +18,10 @@ type ProductDescription struct { AvailableLater string `gorm:"column:available_later;type:varchar(255)" json:"available_later" form:"available_later"` DeliveryInStock string `gorm:"column:delivery_in_stock;type:varchar(255)" json:"delivery_in_stock" form:"delivery_in_stock"` DeliveryOutStock string `gorm:"column:delivery_out_stock;type:varchar(255)" json:"delivery_out_stock" form:"delivery_out_stock"` - Usage string `gorm:"column:usage;type:text" json:"usage" form:"usage"` + Usage string `gorm:"column:_usage_;type:text" json:"usage" form:"usage"` - ExistsInDatabase bool `gorm:"-" json:"exists_in_database"` + ImageLink string `gorm:"column:image_link" json:"image_link"` + ExistsInDatabase bool `gorm:"-" json:"exists_in_database"` } type ProductRow struct { diff --git a/app/repos/productDescriptionRepo/productDescriptionRepo.go b/app/repos/productDescriptionRepo/productDescriptionRepo.go index 1b0faf8..ae26f6b 100644 --- a/app/repos/productDescriptionRepo/productDescriptionRepo.go +++ b/app/repos/productDescriptionRepo/productDescriptionRepo.go @@ -4,6 +4,7 @@ import ( "errors" "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/model" "git.ma-al.com/goc_daniel/b2b/app/model/dbmodel" @@ -36,6 +37,27 @@ func (r *ProductDescriptionRepo) GetProductDescription(productID uint, productid IDShop: int32(constdata.SHOP_ID), IDLang: int32(productid_lang), }). + Select(` + `+dbmodel.PsProductLangCols.IDProduct.TabCol()+` AS id_product, + `+dbmodel.PsProductLangCols.IDShop.TabCol()+` AS id_shop, + `+dbmodel.PsProductLangCols.IDLang.TabCol()+` AS id_lang, + `+dbmodel.PsProductLangCols.Description.TabCol()+` AS description, + `+dbmodel.PsProductLangCols.DescriptionShort.TabCol()+` AS description_short, + `+dbmodel.PsProductLangCols.LinkRewrite.TabCol()+` AS link_rewrite, + `+dbmodel.PsProductLangCols.MetaDescription.TabCol()+` AS meta_description, + `+dbmodel.PsProductLangCols.MetaKeywords.TabCol()+` AS meta_keywords, + `+dbmodel.PsProductLangCols.MetaTitle.TabCol()+` AS meta_title, + `+dbmodel.PsProductLangCols.Name.TabCol()+` AS name, + `+dbmodel.PsProductLangCols.AvailableNow.TabCol()+` AS available_now, + `+dbmodel.PsProductLangCols.AvailableLater.TabCol()+` AS available_later, + `+dbmodel.PsProductLangCols.DeliveryInStock.TabCol()+` AS delivery_in_stock, + `+dbmodel.PsProductLangCols.DeliveryOutStock.TabCol()+` AS delivery_out_stock, + `+dbmodel.PsProductLangCols.Usage.TabCol()+` AS _usage_, + CONCAT(?, '/', `+dbmodel.PsImageShopCols.IDImage.TabCol()+`, '-large_default/', `+dbmodel.PsProductLangCols.LinkRewrite.TabCol()+`, '.webp') AS image_link + `, config.Get().Image.ImagePrefix). + Joins("JOIN " + dbmodel.TableNamePsImageShop + + " ON " + dbmodel.PsImageShopCols.IDProduct.TabCol() + "=" + dbmodel.PsProductLangCols.IDProduct.TabCol() + + " AND " + dbmodel.PsImageShopCols.Cover.TabCol() + " = 1"). First(&ProductDescription).Error if errors.Is(err, gorm.ErrRecordNotFound) { diff --git a/app/service/authService/auth.go b/app/service/authService/auth.go index 2fc4a7d..c873ce0 100644 --- a/app/service/authService/auth.go +++ b/app/service/authService/auth.go @@ -83,6 +83,15 @@ func (s *AuthService) Login(req *model.LoginRequest) (*model.AuthResponse, strin // Update last login time now := time.Now() user.LastLoginAt = &now + + if req.LangID != nil { + _, err := s.GetLangISOCode(*req.LangID) + if err != nil { + return nil, "", responseErrors.ErrBadLangID + } + user.LangID = *req.LangID + } + s.db.Save(&user) // Generate access token (JWT) diff --git a/app/utils/const_data/consts.go b/app/utils/const_data/consts.go index 9c64ee5..b3790c8 100644 --- a/app/utils/const_data/consts.go +++ b/app/utils/const_data/consts.go @@ -11,5 +11,4 @@ const CATEGORY_TREE_ROOT_ID = 2 const MAX_AMOUNT_OF_CARTS_PER_USER = 10 const DEFAULT_NEW_CART_NAME = "new cart" -const USER_LOCALES_NAME = "user" -const USER_LOCALES_ID = "userID" +const USER_LOCALE = "user" diff --git a/app/utils/localeExtractor/localeExtractor.go b/app/utils/localeExtractor/localeExtractor.go new file mode 100644 index 0000000..735397c --- /dev/null +++ b/app/utils/localeExtractor/localeExtractor.go @@ -0,0 +1,23 @@ +package localeExtractor + +import ( + "git.ma-al.com/goc_daniel/b2b/app/model" + constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data" + "github.com/gofiber/fiber/v3" +) + +func GetLangID(c fiber.Ctx) (uint, bool) { + user_locale, ok := c.Locals(constdata.USER_LOCALE).(*model.UserLocale) + if !ok || user_locale.OriginalUser == nil { + return 0, false + } + return user_locale.OriginalUser.LangID, true +} + +func GetUserID(c fiber.Ctx) (uint, bool) { + user_locale, ok := c.Locals(constdata.USER_LOCALE).(*model.UserLocale) + if !ok || user_locale.User == nil { + return 0, false + } + return user_locale.User.ID, true +} diff --git a/bruno/b2b_daniel/list/list-products.yml b/bruno/b2b_daniel/list/list-products.yml index adc88a7..20e6cac 100644 --- a/bruno/b2b_daniel/list/list-products.yml +++ b/bruno/b2b_daniel/list/list-products.yml @@ -5,7 +5,7 @@ info: http: method: GET - url: http://localhost:3000/api/v1/restricted/list/list-products?p=1&elems=10 + url: http://localhost:3000/api/v1/restricted/list/list-products?p=1&elems=10&target_user_id=2 params: - name: p value: "1" @@ -13,6 +13,9 @@ http: - name: elems value: "10" type: query + - name: target_user_id + value: "2" + type: query settings: encodeUrl: true diff --git a/storage/folder/a.txt b/storage/folder/a.txt new file mode 100644 index 0000000..273c1a9 --- /dev/null +++ b/storage/folder/a.txt @@ -0,0 +1 @@ +This is a test. \ No newline at end of file