3
0

Add temporal filtering to reminders

This commit is contained in:
Tomaž Jerman
2019-09-24 21:04:44 +02:00
parent 3df7d7d50e
commit eac8781d02
7 changed files with 63 additions and 10 deletions

View File

@@ -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",

View File

@@ -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,

View File

@@ -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 |

View File

@@ -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,

View File

@@ -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),
}

View File

@@ -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)
}

View File

@@ -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