mirror of
https://github.com/spurtcms/spurtcms.git
synced 2026-09-21 10:32:06 +00:00
674 lines
15 KiB
Go
674 lines
15 KiB
Go
package controllers
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
"spurt-cms/config"
|
|
"spurt-cms/models"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type SubModule struct {
|
|
Id int
|
|
ModuleName string
|
|
IconPath string
|
|
Routes []URL
|
|
// FullAccessPermission bool
|
|
Action bool
|
|
}
|
|
|
|
type URL struct {
|
|
Id int
|
|
DisplayName string
|
|
RouteName string
|
|
}
|
|
|
|
type MenuMod struct {
|
|
Id int
|
|
ParentId int
|
|
ModuleName string
|
|
IconPath string
|
|
Routes []URL // this is for single menu multiple permissions arr
|
|
HrefRoute URL
|
|
Route string //this is for a tag href route
|
|
SubModule []SubModule // this is for submodules
|
|
// FullAccessPermission bool
|
|
EmptyCheck bool //this is flg for mainmenu hide if submodule is empty
|
|
}
|
|
|
|
type TablePageType struct {
|
|
Id int
|
|
Title string
|
|
Slug string
|
|
CreatedBy int
|
|
CreatedOn time.Time
|
|
ModifiedBy int
|
|
ModifiedOn time.Time
|
|
DeletedBy int
|
|
DeletedOn time.Time
|
|
IsDeleted int
|
|
}
|
|
|
|
type USR struct {
|
|
TblModule []MenuMod
|
|
Name string
|
|
NameLength int
|
|
LimitedLengthName string
|
|
RoleName string
|
|
ProfileImagePath string
|
|
Languages []models.TblLanguage
|
|
DefaultLanguage models.TblLanguage
|
|
CurrentLanguage models.TblLanguage
|
|
Personalize models.TblUserPersonalize
|
|
Footer string
|
|
NameString string
|
|
Expand bool
|
|
LogoPath string
|
|
ExpandLogoPath string
|
|
TblPageTypes []TablePageType
|
|
ChannelID int
|
|
LastUpdatedOn string
|
|
WebsiteUrl string
|
|
}
|
|
|
|
type TblModulePermission struct {
|
|
Id int
|
|
RouteName string
|
|
DisplayName string
|
|
SlugName string
|
|
Description string
|
|
ModuleId int
|
|
CreatedBy int
|
|
CreatedOn time.Time
|
|
CreatedDate string `gorm:"-"`
|
|
ModifiedBy int `gorm:"DEFAULT:NULL"`
|
|
ModifiedOn time.Time `gorm:"DEFAULT:NULL"`
|
|
ModuleName string `gorm:"<-:false"`
|
|
FullAccessPermission int
|
|
ParentId int
|
|
AssignPermission int
|
|
BreadcrumbName string
|
|
TblRolePermission []TblRolePermission `gorm:"<-:false; foreignKey:PermissionId"`
|
|
OrderIndex int
|
|
}
|
|
|
|
type TblRolePermission struct {
|
|
Id int
|
|
RoleId int
|
|
PermissionId int
|
|
CreatedBy int
|
|
CreatedOn time.Time
|
|
CreatedDate string `gorm:"<-:false"`
|
|
}
|
|
|
|
type TblModule struct {
|
|
Id int
|
|
ModuleName string
|
|
IsActive int
|
|
CreatedBy int
|
|
CreatedOn time.Time
|
|
CreatedDate string `gorm:"<-:false"`
|
|
DefaultModule int
|
|
ParentId int
|
|
IconPath string
|
|
OrderIndex int
|
|
TblModulePermission []TblModulePermission `gorm:"<-:false; foreignKey:ModuleId"`
|
|
Description string
|
|
DisplayName string `gorm:"column:display_name;<-:false"`
|
|
RouteName string `gorm:"column:route_name;<-:false"`
|
|
RouteParentId int `gorm:"column:parent_id;<-:false"`
|
|
FullAccessPermission int
|
|
GroupFlg int
|
|
}
|
|
|
|
func GetLanguageList() []models.TblLanguage {
|
|
|
|
var languagelist []models.TblLanguage
|
|
|
|
err := models.FetchAllLanguage(&languagelist, TenantId)
|
|
if err != nil {
|
|
ErrorLog.Printf("Fectch all language error: %s", err)
|
|
return []models.TblLanguage{}
|
|
}
|
|
|
|
for _, langlist := range languagelist {
|
|
_, err := os.Stat(langlist.JsonPath)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return []models.TblLanguage{}
|
|
}
|
|
}
|
|
|
|
return languagelist
|
|
|
|
}
|
|
|
|
func MainMenu() []TblModule {
|
|
|
|
var parentModules []TblModule
|
|
|
|
GetAllParentModule(&parentModules) //get parent default main module only
|
|
|
|
return parentModules
|
|
|
|
}
|
|
|
|
func GetPageType() []TablePageType {
|
|
|
|
var pagetypes []TablePageType
|
|
|
|
GetDefaultPagetypes(&pagetypes) //get parent default main module only
|
|
|
|
return pagetypes
|
|
|
|
}
|
|
|
|
func TabMenu(parentid int) []TblModule {
|
|
|
|
var subModules []TblModule
|
|
|
|
GetAllSubModule(&subModules, parentid)
|
|
|
|
return subModules
|
|
|
|
}
|
|
|
|
func NewMenuController(c *gin.Context) USR {
|
|
|
|
userid := c.GetInt("userid")
|
|
|
|
var (
|
|
permissionid []int
|
|
Final []MenuMod
|
|
personalize_data models.TblUserPersonalize
|
|
firstn string
|
|
lastn string
|
|
expandflg bool
|
|
currentLanguage models.TblLanguage
|
|
)
|
|
|
|
user, _, _ := NewTeamWP.GetUserById(userid, []int{})
|
|
|
|
rolepermission, err := GetPermissionIDS(user.RoleId)
|
|
|
|
pagetype := GetPageType()
|
|
|
|
if err != nil {
|
|
|
|
log.Println(err)
|
|
|
|
}
|
|
|
|
for _, val := range rolepermission {
|
|
permissionid = append(permissionid, val.PermissionId)
|
|
}
|
|
|
|
LeftMain := MainMenu()
|
|
|
|
for _, val := range LeftMain {
|
|
|
|
var fin MenuMod
|
|
fin.Id = val.Id
|
|
fin.ModuleName = val.ModuleName
|
|
fin.IconPath = val.IconPath
|
|
|
|
TabManu := TabMenu(val.Id)
|
|
|
|
var Suball []SubModule
|
|
|
|
if user.RoleId != 1 && user.RoleId != 2 { //not admin users
|
|
for _, tab := range TabManu {
|
|
|
|
var sub SubModule
|
|
sub.Id = tab.Id
|
|
sub.ModuleName = tab.ModuleName
|
|
sub.IconPath = tab.IconPath
|
|
|
|
var (
|
|
Url []URL
|
|
rout []TblModulePermission
|
|
flg bool
|
|
)
|
|
|
|
GetModulePermissions(&rout, tab.Id, permissionid)
|
|
|
|
for _, url := range rout {
|
|
if strings.Contains(url.RouteName, "/entries/entrylist/") {
|
|
flg = true
|
|
break
|
|
}
|
|
}
|
|
|
|
for _, url := range rout {
|
|
if url.ModuleId == tab.Id {
|
|
if url.RouteName != "/entries/entrylist" {
|
|
|
|
var urll URL
|
|
if strings.Contains(url.RouteName, "/entries/entrylist/") {
|
|
|
|
url.RouteName = "/entries/entrylist"
|
|
}
|
|
urll.Id = url.Id
|
|
urll.DisplayName = url.DisplayName
|
|
urll.RouteName = url.RouteName
|
|
Url = append(Url, urll)
|
|
|
|
} else if flg && url.RouteName == "/entries/entrylist" {
|
|
|
|
var urll URL
|
|
urll.Id = url.Id
|
|
urll.DisplayName = url.DisplayName
|
|
urll.RouteName = url.RouteName
|
|
Url = append(Url, urll)
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
if flg {
|
|
|
|
var urll URL
|
|
urll.DisplayName = "Entries"
|
|
urll.RouteName = "/entries/entrylist"
|
|
Url = append(Url, urll)
|
|
}
|
|
|
|
sub.Routes = Url
|
|
Suball = append(Suball, sub)
|
|
}
|
|
} else {
|
|
|
|
for _, tab := range TabManu {
|
|
|
|
if tab.ParentId == val.Id {
|
|
|
|
var sub SubModule
|
|
sub.Id = tab.Id
|
|
sub.ModuleName = tab.ModuleName
|
|
sub.IconPath = tab.IconPath
|
|
|
|
var rout []TblModulePermission
|
|
GetModulePermissions(&rout, tab.Id, []int{})
|
|
|
|
var Url []URL
|
|
for _, url := range rout {
|
|
var urll URL
|
|
urll.Id = url.Id
|
|
urll.DisplayName = url.DisplayName
|
|
urll.RouteName = url.RouteName
|
|
Url = append(Url, urll)
|
|
}
|
|
|
|
sub.Routes = Url
|
|
Suball = append(Suball, sub)
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
if len(Suball) > 0 && len(Suball[0].Routes) > 0 {
|
|
|
|
fin.Route = Suball[0].Routes[0].RouteName
|
|
|
|
}
|
|
|
|
for _, val := range Suball {
|
|
if len(val.Routes) != 0 {
|
|
fin.Route = val.Routes[0].RouteName
|
|
break
|
|
}
|
|
|
|
}
|
|
|
|
fin.SubModule = Suball
|
|
Final = append(Final, fin)
|
|
|
|
}
|
|
|
|
// for _, val := range Final {
|
|
|
|
// fmt.Println(val)
|
|
|
|
// fmt.Println()
|
|
// }
|
|
|
|
models.GetPersonalize(&personalize_data, userid, TenantId)
|
|
|
|
var first = user.FirstName
|
|
var last = user.LastName
|
|
|
|
if first != "" {
|
|
firstn = strings.ToUpper(first[:1])
|
|
}
|
|
if user.LastName != "" {
|
|
lastn = strings.ToUpper(last[:1])
|
|
}
|
|
|
|
var nameLength = len(user.FirstName) + len(user.LastName)
|
|
|
|
user.NameLength = nameLength
|
|
|
|
if nameLength > 18 {
|
|
if len(first) > 6 {
|
|
user.LimitedLengthName = first[:5] + "..."
|
|
|
|
} else {
|
|
user.LimitedLengthName = first[:len(first)] + "..."
|
|
}
|
|
|
|
}
|
|
|
|
var Name = firstn + lastn
|
|
|
|
user.NameString = Name
|
|
|
|
if user.ProfileImagePath != "" {
|
|
if user.StorageType == "local" {
|
|
user.ProfileImagePath = "/" + user.ProfileImagePath
|
|
} else if user.StorageType == "aws" {
|
|
user.ProfileImagePath = "/image-resize?name=" + user.ProfileImagePath
|
|
}
|
|
}
|
|
|
|
if interfaceValue, exists := c.Get("currentLanguage"); exists {
|
|
if structValue, ok := interfaceValue.(models.TblLanguage); ok {
|
|
currentLanguage = structValue
|
|
}
|
|
}
|
|
|
|
session1, _ := c.Cookie("mainmenu")
|
|
|
|
if session1 != "" {
|
|
expandflg = true
|
|
} else {
|
|
expandflg = false
|
|
}
|
|
|
|
tblGeneralSettings, _ := models.GetGeneralSettings(TenantId)
|
|
|
|
if !strings.Contains(tblGeneralSettings.LogoPath, "/public/img") {
|
|
|
|
if tblGeneralSettings.StorageType == "aws" {
|
|
|
|
LogoPath = "/image-resize?name=" + tblGeneralSettings.LogoPath
|
|
ExpantLogoPath = "/image-resize?name=" + tblGeneralSettings.ExpandLogoPath
|
|
|
|
} else if tblGeneralSettings.StorageType == "local" {
|
|
|
|
LogoPath = "Storage/" + tblGeneralSettings.LogoPath
|
|
ExpantLogoPath = "Storage/" + tblGeneralSettings.ExpandLogoPath
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
LogoPath = tblGeneralSettings.LogoPath
|
|
|
|
}
|
|
|
|
var ChannelId int
|
|
channelist, clerr := ChannelConfig.GetPermissionChannel(TenantId)
|
|
if clerr != nil {
|
|
ErrorLog.Printf(" Entry listchannel error: %s", clerr)
|
|
}
|
|
if len(channelist) != 0 {
|
|
|
|
selectedchannel := channelist[len(channelist)-1]
|
|
|
|
ChannelId = selectedchannel.Id
|
|
|
|
}
|
|
|
|
Mod := USR{
|
|
TblModule: Final,
|
|
Name: user.FirstName + " " + user.LastName,
|
|
NameLength: user.NameLength,
|
|
LimitedLengthName: user.LimitedLengthName,
|
|
RoleName: user.RoleName,
|
|
ProfileImagePath: user.ProfileImagePath,
|
|
Languages: GetLanguageList(),
|
|
// DefaultLanguage: GetDefaultLanguageDetails(userid),
|
|
Personalize: personalize_data,
|
|
CurrentLanguage: currentLanguage,
|
|
Footer: os.Getenv("COPYRIGHTS"),
|
|
NameString: user.NameString,
|
|
Expand: expandflg,
|
|
LogoPath: LogoPath,
|
|
ExpandLogoPath: ExpantLogoPath,
|
|
TblPageTypes: pagetype,
|
|
ChannelID: ChannelId,
|
|
LastUpdatedOn: LastUpdatedTime,
|
|
WebsiteUrl: os.Getenv("WEBSITE_URL"),
|
|
}
|
|
|
|
return Mod
|
|
}
|
|
|
|
func GetPermissionIDS(roleid int) ([]TblRolePermission, error) {
|
|
|
|
var perm []TblRolePermission
|
|
|
|
err := GetPermissionId(&perm, roleid)
|
|
|
|
if err != nil {
|
|
|
|
log.Println(err)
|
|
|
|
return []TblRolePermission{}, err
|
|
|
|
}
|
|
|
|
return perm, nil
|
|
}
|
|
|
|
var db = config.SetupDB()
|
|
|
|
/**/
|
|
func GetAllParentModule(modules *[]TblModule) error {
|
|
|
|
if err := db.Table("tbl_modules").Where("default_module = 0 and parent_id = 0").Order("tbl_modules.order_index asc").Find(&modules).
|
|
Error; err != nil {
|
|
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetAllSubModules(modules *[]TblModule, parentId []int) error {
|
|
|
|
if err := db.Table("tbl_modules").Where("parent_id in (?)", parentId).Order("tbl_modules.order_index asc").Find(&modules).
|
|
Error; err != nil {
|
|
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetAllSubModule(modules *[]TblModule, moduleid int) error {
|
|
|
|
if err := db.Table("tbl_modules").Where("parent_id = (?) and menu_type='tab'", moduleid).Order("tbl_modules.order_index asc").Find(&modules).
|
|
Error; err != nil {
|
|
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetModulePermissions(permission *[]TblModulePermission, modid int, ids []int) error {
|
|
|
|
query := db.Table("tbl_module_permissions").Select("tbl_module_permissions.*,tbl_modules.module_name").Joins("inner join tbl_modules on tbl_modules.id = tbl_module_permissions.module_id").Order("tbl_modules.order_index asc,tbl_module_permissions.order_index asc")
|
|
|
|
if len(ids) > 0 {
|
|
|
|
query = query.Where("tbl_module_permissions.id in (?)", ids)
|
|
|
|
}
|
|
|
|
if modid != 0 && modid > -1 {
|
|
|
|
query = query.Where("module_id = (?)", modid)
|
|
}
|
|
|
|
query.Find(&permission)
|
|
|
|
if err := query.Error; err != nil {
|
|
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
/*Get PermissionId By RoleId*/
|
|
func GetPermissionId(perm *[]TblRolePermission, roleid int) error {
|
|
|
|
if err := db.Model(TblRolePermission{}).Where("role_id=?", roleid).Find(&perm).Error; err != nil {
|
|
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
/**/
|
|
func GetAllParentModules1(mod *[]TblModule) (err error) {
|
|
|
|
if err := DB.Model(TblModule{}).Where("parent_id=0 and (tenant_id is NULL or tenant_id = ?)", TenantId).Order("order_index asc").Find(&mod).Error; err != nil {
|
|
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
/**/
|
|
func GetDefaultPagetypes(mod *[]TablePageType) (err error) {
|
|
|
|
if err := DB.Table("tbl_page_types").Where("is_deleted=0").Find(&mod).Error; err != nil {
|
|
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
/**/
|
|
func GetAllSubModules1(mod *[]TblModule, ids []int) (err error) {
|
|
|
|
if err := DB.Debug().Model(TblModule{}).Where("(tbl_modules.parent_id in (?) or id in(?)) and tbl_modules.assign_permission=0 and (tenant_id is NULL or tenant_id = ?)", ids, ids, TenantId).Order("order_index").Preload("TblModulePermission", func(db *gorm.DB) *gorm.DB {
|
|
return db.Where("assign_permission =1 and tenant_id is NULL or tenant_id = ?", TenantId).Order("order_index asc")
|
|
}).Find(&mod).Error; err != nil {
|
|
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func Permissions() []TblModule {
|
|
|
|
var (
|
|
allmodule []TblModule
|
|
allmodules []TblModule
|
|
parentid []int //all parentid
|
|
submod []TblModule
|
|
)
|
|
|
|
GetAllParentModules1(&allmodule)
|
|
for _, val := range allmodule {
|
|
parentid = append(parentid, val.Id)
|
|
}
|
|
|
|
GetAllSubModules1(&submod, parentid)
|
|
for _, val := range allmodule {
|
|
|
|
if val.GroupFlg == 1 {
|
|
|
|
var newmod TblModule
|
|
newmod.Id = val.Id
|
|
newmod.Description = val.Description
|
|
newmod.CreatedBy = val.CreatedBy
|
|
newmod.ModuleName = val.ModuleName
|
|
newmod.IsActive = val.IsActive
|
|
newmod.IconPath = val.IconPath
|
|
newmod.CreatedDate = val.CreatedOn.Format("02 Jan 2006 03:04 PM")
|
|
|
|
for _, sub := range submod {
|
|
if sub.ParentId == val.Id {
|
|
for _, getmod := range sub.TblModulePermission {
|
|
if getmod.ModuleId == sub.Id {
|
|
|
|
var modper TblModulePermission
|
|
modper.Id = getmod.Id
|
|
modper.Description = getmod.Description
|
|
modper.DisplayName = getmod.DisplayName
|
|
modper.ModuleName = getmod.ModuleName
|
|
modper.RouteName = getmod.RouteName
|
|
modper.CreatedBy = getmod.CreatedBy
|
|
modper.Description = getmod.Description
|
|
modper.TblRolePermission = getmod.TblRolePermission
|
|
modper.CreatedDate = val.CreatedOn.Format("2006-01-02 15:04:05")
|
|
modper.FullAccessPermission = getmod.FullAccessPermission
|
|
newmod.TblModulePermission = append(newmod.TblModulePermission, modper)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
allmodules = append(allmodules, newmod)
|
|
|
|
} else {
|
|
|
|
for _, sub := range submod {
|
|
|
|
if sub.ParentId == val.Id {
|
|
|
|
var newmod TblModule
|
|
newmod.Id = sub.Id
|
|
newmod.Description = sub.Description
|
|
newmod.CreatedBy = sub.CreatedBy
|
|
newmod.ModuleName = sub.ModuleName
|
|
newmod.IsActive = sub.IsActive
|
|
newmod.IconPath = sub.IconPath
|
|
newmod.CreatedDate = sub.CreatedOn.Format("02 Jan 2006 03:04 PM")
|
|
|
|
for _, getmod := range sub.TblModulePermission {
|
|
if getmod.ModuleId == sub.Id {
|
|
|
|
var modper TblModulePermission
|
|
modper.Id = getmod.Id
|
|
modper.Description = sub.Description
|
|
modper.DisplayName = getmod.DisplayName
|
|
modper.ModuleName = getmod.ModuleName
|
|
modper.RouteName = getmod.RouteName
|
|
modper.CreatedBy = getmod.CreatedBy
|
|
modper.Description = getmod.Description
|
|
modper.TblRolePermission = getmod.TblRolePermission
|
|
modper.CreatedDate = val.CreatedOn.Format("2006-01-02 15:04:05")
|
|
modper.FullAccessPermission = getmod.FullAccessPermission
|
|
newmod.TblModulePermission = append(newmod.TblModulePermission, modper)
|
|
}
|
|
|
|
}
|
|
|
|
allmodules = append(allmodules, newmod)
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return allmodules
|
|
}
|