package models import ( "errors" "regexp" "strings" "time" ) // Typed errors var ( ErrDashboardNotFound = errors.New("Account not found") ErrDashboardWithSameNameExists = errors.New("A dashboard with the same name already exists") ) type Dashboard struct { Id int64 Slug string `xorm:"index(IX_AccountIdSlug)"` AccountId int64 `xorm:"index(IX_AccountIdSlug)"` Created time.Time `xorm:"CREATED"` Updated time.Time `xorm:"UPDATED"` Title string Tags []string Data map[string]interface{} } type SearchResult struct { Dashboards []DashboardSearchHit `json:"dashboards"` Tags []DashboardTagCloudItem `json:"tags"` TagsOnly bool `json:"tagsOnly"` } type DashboardSearchHit struct { Id string `json:"id"` Title string `json:"title"` Slug string `json:"slug"` Tags []string `json:"tags"` } type DashboardTagCloudItem struct { Term string `json:"term"` Count int `json:"count"` } type SearchDashboardsQuery struct { Query string AccountId int64 Result []DashboardSearchHit } type GetDashboardTagsQuery struct { AccountId int64 Result []DashboardTagCloudItem } type SaveDashboardCommand struct { Dashboard map[string]interface{} `json:"dashboard"` AccountId int64 `json:"-"` Result *Dashboard } type DeleteDashboardCommand struct { Slug string AccountId int64 } type GetDashboardQuery struct { Slug string AccountId int64 Result *Dashboard } func convertToStringArray(arr []interface{}) []string { b := make([]string, len(arr)) for i := range arr { b[i] = arr[i].(string) } return b } func NewDashboard(title string) *Dashboard { dash := &Dashboard{} dash.Data = make(map[string]interface{}) dash.Data["title"] = title dash.Title = title dash.UpdateSlug() return dash } func (cmd *SaveDashboardCommand) GetDashboardModel() *Dashboard { dash := &Dashboard{} dash.Data = cmd.Dashboard dash.Title = dash.Data["title"].(string) dash.AccountId = cmd.AccountId dash.Tags = convertToStringArray(dash.Data["tags"].([]interface{})) dash.UpdateSlug() if dash.Data["id"] != nil { dash.Id = int64(dash.Data["id"].(float64)) } return dash } func (dash *Dashboard) GetString(prop string) string { return dash.Data[prop].(string) } func (dash *Dashboard) UpdateSlug() { title := strings.ToLower(dash.Data["title"].(string)) re := regexp.MustCompile("[^\\w ]+") re2 := regexp.MustCompile("\\s") dash.Slug = re2.ReplaceAllString(re.ReplaceAllString(title, ""), "-") }