From 887aab30fce0f4dbde052a3b4dd857691b92d018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Jerman?= Date: Thu, 26 Sep 2019 23:15:47 +0200 Subject: [PATCH] Tweak reminder filter params --- api/system/spec.json | 16 ++++++++++++++-- api/system/spec/reminder.json | 16 ++++++++++++++-- docs/system/README.md | 4 +++- system/repository/reminder.go | 12 ++++++++++-- system/rest/reminder.go | 12 +++++++----- system/rest/request/reminder.go | 28 +++++++++++++++++++--------- system/types/reminder.go | 14 ++++++++------ 7 files changed, 75 insertions(+), 27 deletions(-) diff --git a/api/system/spec.json b/api/system/spec.json index 0deb76279..e8a048862 100644 --- a/api/system/spec.json +++ b/api/system/spec.json @@ -1637,11 +1637,23 @@ "type": "*time.Time" }, { - "name": "scheduledBefore", + "name": "scheduledUntil", "required": false, - "title": "Only reminders up to this time (excluded)", + "title": "Only reminders up to this time (included)", "type": "*time.Time" }, + { + "name": "scheduledOnly", + "required": false, + "title": "Only scheduled reminders", + "type": "bool" + }, + { + "name": "excludeDismissed", + "required": false, + "title": "Filter out dismissed reminders", + "type": "bool" + }, { "name": "page", "type": "uint", diff --git a/api/system/spec/reminder.json b/api/system/spec/reminder.json index 7301c5ad4..7c95f8052 100644 --- a/api/system/spec/reminder.json +++ b/api/system/spec/reminder.json @@ -43,11 +43,23 @@ "type": "*time.Time" }, { - "name": "scheduledBefore", + "name": "scheduledUntil", "required": false, - "title": "Only reminders up to this time (excluded)", + "title": "Only reminders up to this time (included)", "type": "*time.Time" }, + { + "name": "scheduledOnly", + "required": false, + "title": "Only scheduled reminders", + "type": "bool" + }, + { + "name": "excludeDismissed", + "required": false, + "title": "Filter out dismissed reminders", + "type": "bool" + }, { "name": "page", "required": false, diff --git a/docs/system/README.md b/docs/system/README.md index 5a99a78ff..6ed3b4208 100644 --- a/docs/system/README.md +++ b/docs/system/README.md @@ -716,7 +716,9 @@ Organisations represent a top-level grouping entity. There may be many organisat | resource | string | GET | Only reminders of a specific resource | N/A | NO | | assignedTo | uint64 | GET | Only reminders for a given user | N/A | NO | | scheduledFrom | *time.Time | GET | Only reminders from this time (included) | N/A | NO | -| scheduledBefore | *time.Time | GET | Only reminders up to this time (excluded) | N/A | NO | +| scheduledUntil | *time.Time | GET | Only reminders up to this time (included) | N/A | NO | +| scheduledOnly | bool | GET | Only scheduled reminders | N/A | NO | +| excludeDismissed | bool | GET | Filter out dismissed reminders | N/A | NO | | page | uint | GET | Page number (0 based) | N/A | NO | | perPage | uint | GET | Returned items per page (default 50) | N/A | NO | diff --git a/system/repository/reminder.go b/system/repository/reminder.go index 78355e2b8..f276bc7cd 100644 --- a/system/repository/reminder.go +++ b/system/repository/reminder.go @@ -80,6 +80,14 @@ func (r reminder) Find(filter types.ReminderFilter) (set types.ReminderSet, f ty f = filter q := r.query() + if f.ExcludeDismissed { + q = q.Where("dismissed_at IS NULL") + } + + if f.ScheduledOnly { + q = q.Where("remind_at IS NOT NULL") + } + if f.AssignedTo != 0 { q = q.Where("r.assigned_to = ?", f.AssignedTo) } @@ -91,8 +99,8 @@ func (r reminder) Find(filter types.ReminderFilter) (set types.ReminderSet, f ty if f.ScheduledFrom != nil { q = q.Where("r.remind_at >= ?", f.ScheduledFrom.Format(time.RFC3339)) } - if f.ScheduledBefore != nil { - q = q.Where("r.remind_at < ?", f.ScheduledBefore.Format(time.RFC3339)) + if f.ScheduledUntil != nil { + q = q.Where("r.remind_at <= ?", f.ScheduledUntil.Format(time.RFC3339)) } if f.AccessCheck.HasOperation() { diff --git a/system/rest/reminder.go b/system/rest/reminder.go index aeae74868..19c602fea 100644 --- a/system/rest/reminder.go +++ b/system/rest/reminder.go @@ -26,7 +26,7 @@ type ( reminderSetPayload struct { Filter types.ReminderFilter `json:"filter"` - Set types.ReminderSet `json:"set"` + Set types.ReminderSet `json:"set,omitempty"` } ) @@ -38,10 +38,12 @@ func (Reminder) New() *Reminder { func (ctrl *Reminder) List(ctx context.Context, r *request.ReminderList) (interface{}, error) { f := types.ReminderFilter{ - AssignedTo: r.AssignedTo, - Resource: r.Resource, - ScheduledFrom: r.ScheduledFrom, - ScheduledBefore: r.ScheduledBefore, + AssignedTo: r.AssignedTo, + Resource: r.Resource, + ScheduledFrom: r.ScheduledFrom, + ScheduledUntil: r.ScheduledUntil, + ExcludeDismissed: r.ExcludeDismissed, + ScheduledOnly: r.ScheduledOnly, PageFilter: rh.Paging(r.Page, r.PerPage), } diff --git a/system/rest/request/reminder.go b/system/rest/request/reminder.go index 41112d851..81e4f4224 100644 --- a/system/rest/request/reminder.go +++ b/system/rest/request/reminder.go @@ -36,12 +36,14 @@ var _ = multipart.FileHeader{} // Reminder list request parameters type ReminderList struct { - Resource string - AssignedTo uint64 `json:",string"` - ScheduledFrom *time.Time - ScheduledBefore *time.Time - Page uint - PerPage uint + Resource string + AssignedTo uint64 `json:",string"` + ScheduledFrom *time.Time + ScheduledUntil *time.Time + ScheduledOnly bool + ExcludeDismissed bool + Page uint + PerPage uint } func NewReminderList() *ReminderList { @@ -54,7 +56,9 @@ func (r ReminderList) Auditable() map[string]interface{} { out["resource"] = r.Resource out["assignedTo"] = r.AssignedTo out["scheduledFrom"] = r.ScheduledFrom - out["scheduledBefore"] = r.ScheduledBefore + out["scheduledUntil"] = r.ScheduledUntil + out["scheduledOnly"] = r.ScheduledOnly + out["excludeDismissed"] = r.ExcludeDismissed out["page"] = r.Page out["perPage"] = r.PerPage @@ -100,12 +104,18 @@ func (r *ReminderList) Fill(req *http.Request) (err error) { return err } } - if val, ok := get["scheduledBefore"]; ok { + if val, ok := get["scheduledUntil"]; ok { - if r.ScheduledBefore, err = parseISODatePtrWithErr(val); err != nil { + if r.ScheduledUntil, err = parseISODatePtrWithErr(val); err != nil { return err } } + if val, ok := get["scheduledOnly"]; ok { + r.ScheduledOnly = parseBool(val) + } + if val, ok := get["excludeDismissed"]; ok { + r.ExcludeDismissed = parseBool(val) + } if val, ok := get["page"]; ok { r.Page = parseUint(val) } diff --git a/system/types/reminder.go b/system/types/reminder.go index 4a026086c..f73ac6bdc 100644 --- a/system/types/reminder.go +++ b/system/types/reminder.go @@ -30,12 +30,14 @@ type ( } ReminderFilter struct { - Resource string `json:"resource"` - AssignedTo uint64 `json:"assignedTo,uint64"` - ScheduledFrom *time.Time `json:"scheduledFrom"` - ScheduledBefore *time.Time `json:"scheduledBefore"` - Page uint `json:"page,uint"` - PerPage uint `json:"perPage,uint"` + Resource string `json:"resource"` + AssignedTo uint64 `json:"assignedTo,uint64"` + ScheduledFrom *time.Time `json:"scheduledFrom"` + ScheduledUntil *time.Time `json:"scheduledUntil"` + ExcludeDismissed bool `json:"excludeDismissed"` + ScheduledOnly bool `json:"scheduledOnly"` + Page uint `json:"page,uint"` + PerPage uint `json:"perPage,uint"` // Standard paging fields & helpers rh.PageFilter