github.com/kotovmak/go-admin@v1.1.1/plugins/admin/models/menu.go (about)

     1  package models
     2  
     3  import (
     4  	"encoding/json"
     5  	"strconv"
     6  	"time"
     7  
     8  	"github.com/kotovmak/go-admin/modules/db"
     9  	"github.com/kotovmak/go-admin/modules/db/dialect"
    10  )
    11  
    12  // MenuModel is menu model structure.
    13  type MenuModel struct {
    14  	Base
    15  
    16  	Id        int64
    17  	Title     string
    18  	ParentId  int64
    19  	Icon      string
    20  	Uri       string
    21  	Header    string
    22  	CreatedAt string
    23  	UpdatedAt string
    24  }
    25  
    26  // Menu return a default menu model.
    27  func Menu() MenuModel {
    28  	return MenuModel{Base: Base{TableName: "goadmin_menu"}}
    29  }
    30  
    31  // MenuWithId return a default menu model of given id.
    32  func MenuWithId(id string) MenuModel {
    33  	idInt, _ := strconv.Atoi(id)
    34  	return MenuModel{Base: Base{TableName: "goadmin_menu"}, Id: int64(idInt)}
    35  }
    36  
    37  func (t MenuModel) SetConn(con db.Connection) MenuModel {
    38  	t.Conn = con
    39  	return t
    40  }
    41  
    42  // Find return a default menu model of given id.
    43  func (t MenuModel) Find(id interface{}) MenuModel {
    44  	item, _ := t.Table(t.TableName).Find(id)
    45  	return t.MapToModel(item)
    46  }
    47  
    48  // New create a new menu model.
    49  func (t MenuModel) New(title, icon, uri, header, pluginName string, parentId, order int64) (MenuModel, error) {
    50  
    51  	id, err := t.Table(t.TableName).Insert(dialect.H{
    52  		"title":       title,
    53  		"parent_id":   parentId,
    54  		"icon":        icon,
    55  		"uri":         uri,
    56  		"order":       order,
    57  		"header":      header,
    58  		"plugin_name": pluginName,
    59  	})
    60  
    61  	t.Id = id
    62  	t.Title = title
    63  	t.ParentId = parentId
    64  	t.Icon = icon
    65  	t.Uri = uri
    66  	t.Header = header
    67  
    68  	return t, err
    69  }
    70  
    71  // Delete delete the menu model.
    72  func (t MenuModel) Delete() {
    73  	_ = t.Table(t.TableName).Where("id", "=", t.Id).Delete()
    74  	_ = t.Table("goadmin_role_menu").Where("menu_id", "=", t.Id).Delete()
    75  	items, _ := t.Table(t.TableName).Where("parent_id", "=", t.Id).All()
    76  
    77  	if len(items) > 0 {
    78  		ids := make([]interface{}, len(items))
    79  		for i := 0; i < len(ids); i++ {
    80  			ids[i] = items[i]["id"]
    81  		}
    82  		_ = t.Table("goadmin_role_menu").WhereIn("menu_id", ids).Delete()
    83  	}
    84  
    85  	_ = t.Table(t.TableName).Where("parent_id", "=", t.Id).Delete()
    86  }
    87  
    88  // Update update the menu model.
    89  func (t MenuModel) Update(title, icon, uri, header, pluginName string, parentId int64) (int64, error) {
    90  	return t.Table(t.TableName).
    91  		Where("id", "=", t.Id).
    92  		Update(dialect.H{
    93  			"title":       title,
    94  			"parent_id":   parentId,
    95  			"icon":        icon,
    96  			"plugin_name": pluginName,
    97  			"uri":         uri,
    98  			"header":      header,
    99  			"updated_at":  time.Now().Format("2006-01-02 15:04:05"),
   100  		})
   101  }
   102  
   103  type OrderItems []OrderItem
   104  
   105  type OrderItem struct {
   106  	ID       uint       `json:"id"`
   107  	Children OrderItems `json:"children"`
   108  }
   109  
   110  // ResetOrder update the order of menu models.
   111  func (t MenuModel) ResetOrder(data []byte) {
   112  
   113  	var items OrderItems
   114  	_ = json.Unmarshal(data, &items)
   115  
   116  	count := 1
   117  	for _, v := range items {
   118  		if len(v.Children) > 0 {
   119  			_, _ = t.Table(t.TableName).
   120  				Where("id", "=", v.ID).
   121  				Update(dialect.H{
   122  					"order":     count,
   123  					"parent_id": 0,
   124  				})
   125  
   126  			for _, v2 := range v.Children {
   127  				if len(v2.Children) > 0 {
   128  
   129  					_, _ = t.Table(t.TableName).
   130  						Where("id", "=", v2.ID).
   131  						Update(dialect.H{
   132  							"order":     count,
   133  							"parent_id": v.ID,
   134  						})
   135  
   136  					for _, v3 := range v2.Children {
   137  						_, _ = t.Table(t.TableName).
   138  							Where("id", "=", v3.ID).
   139  							Update(dialect.H{
   140  								"order":     count,
   141  								"parent_id": v2.ID,
   142  							})
   143  						count++
   144  					}
   145  				} else {
   146  					_, _ = t.Table(t.TableName).
   147  						Where("id", "=", v2.ID).
   148  						Update(dialect.H{
   149  							"order":     count,
   150  							"parent_id": v.ID,
   151  						})
   152  					count++
   153  				}
   154  			}
   155  		} else {
   156  			_, _ = t.Table(t.TableName).
   157  				Where("id", "=", v.ID).
   158  				Update(dialect.H{
   159  					"order":     count,
   160  					"parent_id": 0,
   161  				})
   162  			count++
   163  		}
   164  	}
   165  }
   166  
   167  // CheckRole check the role if has permission to get the menu.
   168  func (t MenuModel) CheckRole(roleId string) bool {
   169  	checkRole, _ := t.Table("goadmin_role_menu").
   170  		Where("role_id", "=", roleId).
   171  		Where("menu_id", "=", t.Id).
   172  		First()
   173  	return checkRole != nil
   174  }
   175  
   176  // AddRole add a role to the menu.
   177  func (t MenuModel) AddRole(roleId string) (int64, error) {
   178  	if roleId != "" {
   179  		if !t.CheckRole(roleId) {
   180  			return t.Table("goadmin_role_menu").
   181  				Insert(dialect.H{
   182  					"role_id": roleId,
   183  					"menu_id": t.Id,
   184  				})
   185  		}
   186  	}
   187  	return 0, nil
   188  }
   189  
   190  // DeleteRoles delete roles with menu.
   191  func (t MenuModel) DeleteRoles() error {
   192  	return t.Table("goadmin_role_menu").
   193  		Where("menu_id", "=", t.Id).
   194  		Delete()
   195  }
   196  
   197  // MapToModel get the menu model from given map.
   198  func (t MenuModel) MapToModel(m map[string]interface{}) MenuModel {
   199  	t.Id = m["id"].(int64)
   200  	t.Title, _ = m["title"].(string)
   201  	t.ParentId = m["parent_id"].(int64)
   202  	t.Icon, _ = m["icon"].(string)
   203  	t.Uri, _ = m["uri"].(string)
   204  	t.Header, _ = m["header"].(string)
   205  	t.CreatedAt, _ = m["created_at"].(string)
   206  	t.UpdatedAt, _ = m["updated_at"].(string)
   207  	return t
   208  }