Add temporal filtering to reminders
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 |
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user