diff --git a/app/delivery/web/api/restricted/menu.go b/app/delivery/web/api/restricted/menu.go index 04a4233..74fa700 100644 --- a/app/delivery/web/api/restricted/menu.go +++ b/app/delivery/web/api/restricted/menu.go @@ -24,18 +24,33 @@ func MenuHandlerRoutes(r fiber.Router) fiber.Router { handler := NewMenuHandler() r.Get("/get-menu", handler.GetMenu) + r.Get("/get-routes", handler.GetRouting) return r } func (h *MenuHandler) GetMenu(c fiber.Ctx) error { - id_lang, ok := c.Locals("langID").(uint) + lang_id, ok := c.Locals("langID").(uint) if !ok { return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) } - - menu, err := h.menuService.GetMenu(id_lang) + menu, err := h.menuService.GetMenu(lang_id) + if err != nil { + return c.Status(responseErrors.GetErrorStatus(err)). + JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) + } + + return c.JSON(response.Make(&menu, 0, i18n.T_(c, response.Message_OK))) +} + +func (h *MenuHandler) GetRouting(c fiber.Ctx) error { + lang_id, ok := c.Locals("langID").(uint) + if !ok { + return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)). + JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) + } + menu, err := h.menuService.GetRoutes(lang_id) if err != nil { return c.Status(responseErrors.GetErrorStatus(err)). JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err))) diff --git a/app/delivery/web/init.go b/app/delivery/web/init.go index bc61539..c18aaf0 100644 --- a/app/delivery/web/init.go +++ b/app/delivery/web/init.go @@ -110,6 +110,10 @@ func (s *Server) Setup() error { meiliSearch := s.restricted.Group("/meili-search") restricted.MeiliSearchHandlerRoutes(meiliSearch) + s.api.All("*", func(c fiber.Ctx) error { + return c.SendStatus(fiber.StatusNotFound) + }) + // // Restricted routes example // restricted := s.api.Group("/restricted") // restricted.Use(middleware.AuthMiddleware()) diff --git a/app/model/routing.go b/app/model/routing.go new file mode 100644 index 0000000..135f427 --- /dev/null +++ b/app/model/routing.go @@ -0,0 +1,21 @@ +package model + +type Route struct { + ID uint `gorm:"primaryKey;autoIncrement"` + Name string `gorm:"type:varchar(255);not null;unique"` + Path *string `gorm:"type:varchar(255);default:null"` + Component string `gorm:"type:varchar(255);not null;comment:path to component file"` + Layout *string `gorm:"type:varchar(50);default:'default';comment:'default | empty'"` + Meta *string `gorm:"type:longtext;default:'{}'"` + IsActive *bool `gorm:"type:tinyint;default:1"` + SortOrder *int `gorm:"type:int;default:0"` + + ParentID *uint `gorm:"index"` + Parent *Route `gorm:"constraint:OnUpdate:RESTRICT,OnDelete:SET NULL;foreignKey:ParentID"` + + Children []Route `gorm:"foreignKey:ParentID"` +} + +func (Route) TableName() string { + return "b2b_routes" +} diff --git a/app/repos/categoriesRepo/categoriesRepo.go b/app/repos/categoriesRepo/categoriesRepo.go index fb703c4..d420187 100644 --- a/app/repos/categoriesRepo/categoriesRepo.go +++ b/app/repos/categoriesRepo/categoriesRepo.go @@ -30,22 +30,12 @@ func (repo *CategoriesRepo) GetAllCategories(id_lang uint) ([]model.ScannedCateg ps_category.is_root_category AS is_root_category, ps_category_lang.link_rewrite AS link_rewrite, ps_lang.iso_code AS iso_code - `). - Joins(` - LEFT JOIN ps_category_lang - ON ps_category_lang.id_category = ps_category.id_category - AND ps_category_lang.id_shop = ? - AND ps_category_lang.id_lang = ? - `, constdata.SHOP_ID, id_lang). - Joins(` - LEFT JOIN ps_category_shop - ON ps_category_shop.id_category = ps_category.id_category - AND ps_category_shop.id_shop = ? - `, constdata.SHOP_ID). - Joins(` - JOIN ps_lang - ON ps_lang.id_lang = ps_category_lang.id_lang - `). + FROM ps_category + LEFT JOIN ps_category_lang ON ps_category_lang.id_category = ps_category.id_category AND ps_category_lang.id_shop = ? AND ps_category_lang.id_lang = ? + LEFT JOIN ps_category_shop ON ps_category_shop.id_category = ps_category.id_category AND ps_category_shop.id_shop = ? + JOIN ps_lang ON ps_lang.id_lang = ps_category_lang.id_lang + `, + constdata.SHOP_ID, id_lang, constdata.SHOP_ID). Scan(&allCategories).Error return allCategories, err diff --git a/app/repos/routesRepo/routesRepo.go b/app/repos/routesRepo/routesRepo.go new file mode 100644 index 0000000..c70ba86 --- /dev/null +++ b/app/repos/routesRepo/routesRepo.go @@ -0,0 +1,25 @@ +package routesrepo + +import ( + "git.ma-al.com/goc_daniel/b2b/app/db" + "git.ma-al.com/goc_daniel/b2b/app/model" +) + +type UIRoutesRepo interface { + GetRoutes(langId uint) ([]model.Route, error) +} + +type RoutesRepo struct{} + +func New() UIRoutesRepo { + return &RoutesRepo{} +} + +func (p *RoutesRepo) GetRoutes(langId uint) ([]model.Route, error) { + routes := []model.Route{} + err := db.DB.Find(&routes).Error + if err != nil { + return nil, err + } + return routes, nil +} diff --git a/app/service/menuService/menuService.go b/app/service/menuService/menuService.go index 1244075..f4b9994 100644 --- a/app/service/menuService/menuService.go +++ b/app/service/menuService/menuService.go @@ -5,23 +5,26 @@ import ( "git.ma-al.com/goc_daniel/b2b/app/model" "git.ma-al.com/goc_daniel/b2b/app/repos/categoriesRepo" + routesRepo "git.ma-al.com/goc_daniel/b2b/app/repos/routesRepo" "git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors" ) type MenuService struct { categoriesRepo categoriesRepo.UICategoriesRepo + routesRepo routesRepo.UIRoutesRepo } func New() *MenuService { return &MenuService{ categoriesRepo: categoriesRepo.New(), + routesRepo: routesRepo.New(), } } -func (s *MenuService) GetMenu(id_lang uint) (model.Category, error) { +func (s *MenuService) GetMenu(id_lang uint) (*model.Category, error) { all_categories, err := s.categoriesRepo.GetAllCategories(id_lang) if err != nil { - return model.Category{}, err + return &model.Category{}, err } // find the root @@ -35,7 +38,7 @@ func (s *MenuService) GetMenu(id_lang uint) (model.Category, error) { } } if !root_found { - return model.Category{}, responseErrors.ErrNoRootFound + return &model.Category{}, responseErrors.ErrNoRootFound } // now create the children and reorder them according to position @@ -57,7 +60,7 @@ func (s *MenuService) GetMenu(id_lang uint) (model.Category, error) { // finally, create the tree tree := s.createTree(root_index, &all_categories, &children_indices) - return tree, nil + return &tree, nil } func (s *MenuService) createTree(index int, all_categories *([]model.ScannedCategory), children_indices *(map[int][]ChildWithPosition)) model.Category { @@ -70,6 +73,10 @@ func (s *MenuService) createTree(index int, all_categories *([]model.ScannedCate return node } +func (s *MenuService) GetRoutes(id_lang uint) ([]model.Route, error) { + return s.routesRepo.GetRoutes(id_lang) +} + func (s *MenuService) scannedToNormalCategory(scanned model.ScannedCategory) model.Category { var normal model.Category // normal.Active = scanned.Active diff --git a/bo/src/router/index.ts b/bo/src/router/index.ts index 800a2e7..050a0db 100644 --- a/bo/src/router/index.ts +++ b/bo/src/router/index.ts @@ -3,6 +3,7 @@ import { currentLang, langs } from './langs' import { getSettings } from './settings' import { useAuthStore } from '@/stores/auth' import Default from '@/layouts/default.vue' +import { getMenu } from './menu' function isAuthenticated(): boolean { diff --git a/bo/src/router/menu.ts b/bo/src/router/menu.ts index 1edfdc1..61b8c57 100644 --- a/bo/src/router/menu.ts +++ b/bo/src/router/menu.ts @@ -1,7 +1,16 @@ import { useFetchJson } from "@/composable/useFetchJson"; +import type { MenuItem, Route } from "@/types/menu"; export const getMenu = async () => { - const resp = await useFetchJson('/api/v1/restricted/menu/get-menu'); + const resp = await useFetchJson('/api/v1/restricted/menu/get-menu'); + + return resp.items.children + +} + + +export const getRoutes = async () => { + const resp = await useFetchJson('/api/v1/restricted/menu/get-routes'); return resp.items diff --git a/bo/src/types/menu.d.ts b/bo/src/types/menu.d.ts new file mode 100644 index 0000000..74170b9 --- /dev/null +++ b/bo/src/types/menu.d.ts @@ -0,0 +1,26 @@ +export interface MenuItem { + category_id: number + label: string + params: Params + children: MenuItem[] +} + +export interface Params { + category_id?: number + link_rewrite?: string + locale?: string +} + +export interface Route { + ID: number + Name: string + Path: string + Component: string + Layout: string + Meta: string + IsActive: boolean + SortOrder: number + ParentID: any + Parent: any + Children: any +} \ No newline at end of file diff --git a/i18n/migrations/20260302163100_routes.sql b/i18n/migrations/20260302163100_routes.sql index a2f41a7..42904e4 100644 --- a/i18n/migrations/20260302163100_routes.sql +++ b/i18n/migrations/20260302163100_routes.sql @@ -1,6 +1,6 @@ -- +goose Up -- create routes table -CREATE TABLE IF NOT EXISTS b2b_tracker_routes ( +CREATE TABLE IF NOT EXISTS b2b_routes ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE, path VARCHAR(255) NULL, @@ -13,11 +13,11 @@ CREATE TABLE IF NOT EXISTS b2b_tracker_routes ( CONSTRAINT fk_parent FOREIGN KEY (parent_id) - REFERENCES b2b_tracker_routes(id) + REFERENCES b2b_routes(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -INSERT IGNORE INTO b2b_tracker_routes +INSERT IGNORE INTO b2b_routes (name, path, component, layout, meta, is_active, sort_order, parent_id) VALUES ('root', '', '', 'default', '{"trans": "route.root"}', 0, 0, 0), @@ -30,5 +30,5 @@ VALUES -- +goose Down -DROP TABLE IF EXISTS b2b_tracker_routes; +DROP TABLE IF EXISTS b2b_routes;