add filter logic when getting tasks
continuous-integration/drone/pr Build is failing Details

Signed-off-by: kolaente <k@knt.li>
This commit is contained in:
kolaente 2020-04-07 21:31:49 +02:00
parent 8a7a560604
commit 015442b81e
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
2 changed files with 27 additions and 19 deletions

View File

@ -27,6 +27,7 @@ const (
taskFilterComparatorGreateEquals taskFilterComparator = ">="
taskFilterComparatorLess taskFilterComparator = "<"
taskFilterComparatorLessEquals taskFilterComparator = "<="
taskFilterComparatorNotEquals taskFilterComparator = "!="
)
type taskFilter struct {
@ -47,7 +48,8 @@ func (tf *taskFilter) validate() (err error) {
taskFilterComparatorGreater,
taskFilterComparatorGreateEquals,
taskFilterComparatorLess,
taskFilterComparatorLessEquals:
taskFilterComparatorLessEquals,
taskFilterComparatorNotEquals:
return nil
default:
return ErrInvalidTaskFilterComparator{Comparator: tf.comparator}
@ -66,6 +68,8 @@ func getFilterComparatorFromString(comparator string) (taskFilterComparator, err
return taskFilterComparatorLess, nil
case "less_equals":
return taskFilterComparatorLessEquals, nil
case "not_equals":
return taskFilterComparatorNotEquals, nil
default:
return taskFilterComparatorInvalid, ErrInvalidTaskFilterComparator{Comparator: taskFilterComparator(comparator)}
}

View File

@ -27,6 +27,7 @@ import (
"sort"
"strconv"
"time"
"xorm.io/builder"
)
// Task represents an task in a todolist
@ -164,27 +165,32 @@ func getRawTasksForLists(lists []*List, opts *taskOptions) (taskMap map[int64]*T
}
}
var filters = make([]builder.Cond, 0, len(opts.filters))
for _, f := range opts.filters {
switch f.comparator {
case taskFilterComparatorEquals:
filters = append(filters, &builder.Eq{f.field: f.value})
case taskFilterComparatorNotEquals:
filters = append(filters, &builder.Neq{f.field: f.value})
case taskFilterComparatorGreater:
filters = append(filters, &builder.Gt{f.field: f.value})
case taskFilterComparatorGreateEquals:
filters = append(filters, &builder.Gte{f.field: f.value})
case taskFilterComparatorLess:
filters = append(filters, &builder.Lt{f.field: f.value})
case taskFilterComparatorLessEquals:
filters = append(filters, &builder.Lte{f.field: f.value})
}
}
taskMap = make(map[int64]*Task)
// Then return all tasks for that lists
if opts.startDate.Unix() != 0 || opts.endDate.Unix() != 0 {
startDateUnix := time.Now().Unix()
if opts.startDate.Unix() != 0 {
startDateUnix = opts.startDate.Unix()
}
endDateUnix := time.Now().Unix()
if opts.endDate.Unix() != 0 {
endDateUnix = opts.endDate.Unix()
}
if len(filters) > 0 {
err := x.In("list_id", listIDs).
Where("text LIKE ?", "%"+opts.search+"%").
// TODO: Remove this in favour of filters
And("((due_date_unix BETWEEN ? AND ?) OR "+
"(start_date_unix BETWEEN ? and ?) OR "+
"(end_date_unix BETWEEN ? and ?))", startDateUnix, endDateUnix, startDateUnix, endDateUnix, startDateUnix, endDateUnix).
And(filters).
OrderBy(orderby).
Limit(getLimitFromPageIndex(opts.page, opts.perPage)).
Find(&taskMap)
@ -194,9 +200,7 @@ func getRawTasksForLists(lists []*List, opts *taskOptions) (taskMap map[int64]*T
totalItems, err = x.In("list_id", listIDs).
Where("text LIKE ?", "%"+opts.search+"%").
And("((due_date_unix BETWEEN ? AND ?) OR "+
"(start_date_unix BETWEEN ? and ?) OR "+
"(end_date_unix BETWEEN ? and ?))", startDateUnix, endDateUnix, startDateUnix, endDateUnix, startDateUnix, endDateUnix).
And(filters).
Count(&Task{})
if err != nil {
return nil, 0, 0, err