You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

134 lines
3.7 KiB

package models
import (
"context"
"strings"
"time"
)
type Goal struct {
ID string `json:"id" db:"goal_id"`
UserID string `json:"-" db:"user_id"`
GroupID string `json:"groupId" db:"group_id"`
ItemID *string `json:"itemId" db:"item_id"`
StartTime time.Time `json:"startTime" db:"start_time"`
EndTime time.Time `json:"endTime" db:"end_time"`
Amount int `json:"amount" db:"amount"`
Unweighted bool `json:"unweighted" db:"unweighted"`
Name string `json:"name" db:"name"`
Description string `json:"description" db:"description"`
CompositionMode string `json:"compositionMode" db:"composition_mode"`
TaskFilter *string `json:"taskFilter" db:"task_filter"`
ItemFilter *string `json:"itemFilter" db:"item_filter"`
}
func (goal *Goal) Accepts(item *Item, task *Task) bool {
if item.GroupID != goal.GroupID {
return false
}
if goal.ItemID != nil && item.ID != *goal.ItemID {
return false
}
if goal.TaskFilter != nil && !strings.Contains(strings.ToLower(task.Name), *goal.TaskFilter) {
return false
}
if goal.ItemFilter != nil && !strings.Contains(strings.ToLower(item.Name), *goal.ItemFilter) {
return false
}
return true
}
func (goal *Goal) Update(update GoalUpdate) {
if update.Amount != nil {
goal.Amount = *update.Amount
}
if update.StartTime != nil {
goal.StartTime = *update.StartTime
}
if update.EndTime != nil {
goal.EndTime = *update.EndTime
}
if update.Name != nil {
goal.Name = *update.Name
}
if update.Description != nil {
goal.Description = *update.Description
}
if update.Unweighted != nil {
goal.Unweighted = *update.Unweighted
}
if update.CompositionMode != nil {
goal.CompositionMode = *update.CompositionMode
}
if update.ItemID != nil {
goal.ItemID = update.ItemID
}
if update.ClearItemID {
goal.ItemID = nil
}
if update.TaskFilter != nil {
goal.TaskFilter = update.TaskFilter
}
if update.ClearTaskFilter {
goal.TaskFilter = nil
}
if update.ItemFilter != nil {
goal.ItemFilter = update.ItemFilter
}
if update.ClearItemFilter {
goal.ItemFilter = nil
}
}
type GoalUpdate struct {
StartTime *time.Time `json:"startTime"`
EndTime *time.Time `json:"endTime"`
Amount *int `json:"amount"`
Name *string `json:"name"`
Description *string `json:"description"`
ItemID *string `json:"itemId"`
ClearItemID bool `json:"clearItemID"`
Unweighted *bool `json:"unweighted"`
CompositionMode *string `json:"compositionMode"`
TaskFilter *string `json:"taskFilter"`
ClearTaskFilter bool `json:"clearTaskFilter"`
ItemFilter *string `json:"itemFilter"`
ClearItemFilter bool `json:"clearItemFilter"`
}
type GoalResult struct {
Goal
Group *Group `json:"group"`
Items []*GoalResultItem `json:"items"`
Logs []*GoalResultLog `json:"logs"`
CompletedAmount int `json:"completedAmount"`
}
type GoalResultLog struct {
LogResult
ItemCounted bool `json:"itemCounted"`
SecondaryItemCounted bool `json:"secondaryItemCounted"`
}
type GoalResultItem struct {
Item
CompletedAmount int `json:"completedAmount"`
}
type GoalFilter struct {
UserID string
GroupIDs []string
IncludesTime *time.Time
MinTime *time.Time
MaxTime *time.Time
IDs []string
}
type GoalRepository interface {
Find(ctx context.Context, id string) (*Goal, error)
List(ctx context.Context, filter GoalFilter) ([]*Goal, error)
Insert(ctx context.Context, goal Goal) error
Update(ctx context.Context, goal Goal) error
Delete(ctx context.Context, goal Goal) error
}