package models import "context" type ProjectGroup struct { ID string `json:"id" db:"project_group_id"` UserID string `json:"-" db:"user_id"` Name string `json:"name" db:"name"` Description string `json:"description" db:"description"` Abbreviation string `json:"abbreviation" db:"abbreviation"` CategoryNames map[string]string `json:"categoryNames" db:"category_names"` } func (group *ProjectGroup) Update(update ProjectGroupUpdate) { for key, value := range update.SetCategoryNames { if value == "" { delete(group.CategoryNames, key) } else { group.CategoryNames[key] = value } } if update.Name != nil && *update.Name != "" { group.Name = *update.Name } if update.Abbreviation != nil && *update.Abbreviation != "" { group.Abbreviation = *update.Abbreviation } if update.Description != nil { group.Description = *update.Description } } type ProjectGroupUpdate struct { Name *string `json:"name"` Abbreviation *string `json:"abbreviation"` Description *string `json:"description"` SetCategoryNames map[string]string `json:"setCategoryNames"` } type ProjectGroupFilter struct { UserID string `json:"userId"` } type ProjectGroupResult struct { ProjectGroup Projects []*ProjectResult `json:"projects"` ProjectCounts map[string]int `json:"projectCounts"` TaskCounts map[string]int `json:"taskCounts"` } func (r *ProjectGroupResult) RecountTasks() { r.ProjectCounts = make(map[string]int) r.TaskCounts = make(map[string]int) r.ProjectCounts["total"] = 0 r.TaskCounts["total"] = 0 for _, project := range r.Projects { r.ProjectCounts["total"] += 1 if project.StatusTag == nil { r.ProjectCounts["active"] += 1 } else { r.ProjectCounts[*project.StatusTag] += 1 } for _, task := range project.Tasks { r.TaskCounts["total"] += 1 if task.StatusTag == nil { r.TaskCounts["active"] += 1 } else { r.TaskCounts[*task.StatusTag] += 1 } } } } type ProjectGroupRepository interface { Find(ctx context.Context, id string) (*ProjectGroup, error) List(ctx context.Context, filter ProjectGroupFilter) ([]*ProjectGroup, error) Insert(ctx context.Context, group ProjectGroup) error Update(ctx context.Context, group ProjectGroup) error Delete(ctx context.Context, group ProjectGroup) error }