diff --git a/api/system/spec.json b/api/system/spec.json index b7da60dc8..99b11af68 100644 --- a/api/system/spec.json +++ b/api/system/spec.json @@ -1630,6 +1630,18 @@ "title": "Only reminders for a given user", "type": "uint64" }, + { + "name": "scheduledFrom", + "required": false, + "title": "Only reminders from this time (included)", + "type": "*time.Time" + }, + { + "name": "scheduledBefore", + "required": false, + "title": "Only reminders up to this time (excluded)", + "type": "*time.Time" + }, { "name": "page", "type": "uint", diff --git a/api/system/spec/reminder.json b/api/system/spec/reminder.json index b872e3ea8..bb4c69251 100644 --- a/api/system/spec/reminder.json +++ b/api/system/spec/reminder.json @@ -36,6 +36,18 @@ "title": "Only reminders for a given user", "type": "uint64" }, + { + "name": "scheduledFrom", + "required": false, + "title": "Only reminders from this time (included)", + "type": "*time.Time" + }, + { + "name": "scheduledBefore", + "required": false, + "title": "Only reminders up to this time (excluded)", + "type": "*time.Time" + }, { "name": "page", "required": false, diff --git a/docs/system/README.md b/docs/system/README.md index 6e372e146..a6c0f540f 100644 --- a/docs/system/README.md +++ b/docs/system/README.md @@ -715,6 +715,8 @@ 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 | | 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 ee95fcfe7..78355e2b8 100644 --- a/system/repository/reminder.go +++ b/system/repository/reminder.go @@ -88,6 +88,13 @@ func (r reminder) Find(filter types.ReminderFilter) (set types.ReminderSet, f ty q = q.Where("r.resource LIKE ?", f.Resource+"%") } + 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.AccessCheck.HasOperation() { q = q.Where(f.AccessCheck.BindToEnv( types.ReminderPermissionResource, diff --git a/system/rest/reminder.go b/system/rest/reminder.go index d9a99fa37..aeae74868 100644 --- a/system/rest/reminder.go +++ b/system/rest/reminder.go @@ -38,8 +38,10 @@ 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, + AssignedTo: r.AssignedTo, + Resource: r.Resource, + ScheduledFrom: r.ScheduledFrom, + ScheduledBefore: r.ScheduledBefore, PageFilter: rh.Paging(r.Page, r.PerPage), } diff --git a/system/rest/request/reminder.go b/system/rest/request/reminder.go index cf23277ae..0fe91a9a7 100644 --- a/system/rest/request/reminder.go +++ b/system/rest/request/reminder.go @@ -36,10 +36,12 @@ var _ = multipart.FileHeader{} // Reminder list request parameters type ReminderList struct { - Resource string - AssignedTo uint64 `json:",string"` - Page uint - PerPage uint + Resource string + AssignedTo uint64 `json:",string"` + ScheduledFrom *time.Time + ScheduledBefore *time.Time + Page uint + PerPage uint } func NewReminderList() *ReminderList { @@ -51,6 +53,8 @@ func (r ReminderList) Auditable() map[string]interface{} { out["resource"] = r.Resource out["assignedTo"] = r.AssignedTo + out["scheduledFrom"] = r.ScheduledFrom + out["scheduledBefore"] = r.ScheduledBefore out["page"] = r.Page out["perPage"] = r.PerPage @@ -90,6 +94,18 @@ func (r *ReminderList) Fill(req *http.Request) (err error) { if val, ok := get["assignedTo"]; ok { r.AssignedTo = parseUInt64(val) } + if val, ok := get["scheduledFrom"]; ok { + + if r.ScheduledFrom, err = parseISODatePtrWithErr(val); err != nil { + return err + } + } + if val, ok := get["scheduledBefore"]; ok { + + if r.ScheduledBefore, err = parseISODatePtrWithErr(val); err != nil { + return err + } + } if val, ok := get["page"]; ok { r.Page = parseUint(val) } diff --git a/system/types/reminder.go b/system/types/reminder.go index 09a14c7ad..f0a794d5d 100644 --- a/system/types/reminder.go +++ b/system/types/reminder.go @@ -30,10 +30,12 @@ type ( } ReminderFilter struct { - Resource string `json:"resource"` - AssignedTo uint64 `json:"assignedTo,uint64"` - Page uint `json:"page,uint"` - PerPage uint `json:"perPage,uint"` + 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"` // Standard paging fields & helpers rh.PageFilter