From 3df7d7d50e3222d2767e5cc6bda09f7f1b0c4673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toma=C5=BE=20Jerman?= Date: Tue, 24 Sep 2019 13:58:31 +0200 Subject: [PATCH] Small code tweaks --- api/system/spec.json | 2 +- api/system/spec/reminder.json | 2 +- codegen.sh | 4 +-- docs/system/README.md | 2 +- system/repository/reminder.go | 61 ++++++++++++++++++++++++----------- system/rest/reminder.go | 6 ++-- system/service/reminder.go | 20 ++++++------ system/types/reminder.go | 10 +++++- 8 files changed, 72 insertions(+), 35 deletions(-) diff --git a/api/system/spec.json b/api/system/spec.json index e768ddf0a..b7da60dc8 100644 --- a/api/system/spec.json +++ b/api/system/spec.json @@ -1634,7 +1634,7 @@ "name": "page", "type": "uint", "required": false, - "title": "Page number (1 based)" + "title": "Page number (0 based)" }, { "name": "perPage", diff --git a/api/system/spec/reminder.json b/api/system/spec/reminder.json index 236aee1bb..b872e3ea8 100644 --- a/api/system/spec/reminder.json +++ b/api/system/spec/reminder.json @@ -39,7 +39,7 @@ { "name": "page", "required": false, - "title": "Page number (1 based)", + "title": "Page number (0 based)", "type": "uint" }, { diff --git a/codegen.sh b/codegen.sh index 8344a3b7b..6da4a6333 100755 --- a/codegen.sh +++ b/codegen.sh @@ -81,14 +81,14 @@ function types { ./build/gen-type-set --types Role --output system/types/role.gen.go ./build/gen-type-set --types Organisation --output system/types/organisation.gen.go ./build/gen-type-set --types Credentials --output system/types/credentials.gen.go - ./build/gen-type-set --types Reminder --output system/types/reminder.gen.go + ./build/gen-type-set --types Reminder --output system/types/reminder.gen.go ./build/gen-type-set-test --types User --output system/types/user.gen_test.go ./build/gen-type-set-test --types Application --output system/types/application.gen_test.go ./build/gen-type-set-test --types Role --output system/types/role.gen_test.go ./build/gen-type-set-test --types Organisation --output system/types/organisation.gen_test.go ./build/gen-type-set-test --types Credentials --output system/types/credentials.gen_test.go - ./build/gen-type-set-test --types Reminder --output system/types/reminder.gen_test.go + ./build/gen-type-set-test --types Reminder --output system/types/reminder.gen_test.go ./build/gen-type-set --types Value --output internal/settings/types.gen.go --with-primary-key=false --package settings ./build/gen-type-set-test --types Value --output internal/settings/types.gen_test.go --with-primary-key=false --package settings diff --git a/docs/system/README.md b/docs/system/README.md index 10452d351..6e372e146 100644 --- a/docs/system/README.md +++ b/docs/system/README.md @@ -715,7 +715,7 @@ 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 | -| page | uint | GET | Page number (1 based) | 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 | ## Add new reminder diff --git a/system/repository/reminder.go b/system/repository/reminder.go index 17b71fb30..ee95fcfe7 100644 --- a/system/repository/reminder.go +++ b/system/repository/reminder.go @@ -4,6 +4,8 @@ import ( "context" "time" + "github.com/cortezaproject/corteza-server/pkg/rh" + "github.com/cortezaproject/corteza-server/system/types" "github.com/titpetric/factory" squirrel "gopkg.in/Masterminds/squirrel.v1" @@ -11,7 +13,7 @@ import ( type ( ReminderRepository interface { - Find(types.ReminderFilter) (set types.ReminderSet, err error) + Find(types.ReminderFilter) (set types.ReminderSet, f types.ReminderFilter, err error) FindByID(ID uint64) (*types.Reminder, error) FindByIDs(ID []uint64) (types.ReminderSet, error) @@ -43,19 +45,23 @@ func (r reminder) table() string { func (r reminder) columns() []string { return []string{ - "r.id", - "r.resource", - "r.payload", - "r.snooze_count", + "id", + "resource", + "payload", + "snooze_count", - "r.assigned_to", - "r.assigned_by", - "r.assigned_at", + "assigned_to", + "assigned_by", + "assigned_at", - "r.dismissed_by", - "r.dismissed_at", + "dismissed_by", + "dismissed_at", - "r.remind_at", + "remind_at", + + "created_at", + "updated_at", + "deleted_at", } } @@ -70,21 +76,33 @@ func (r reminder) queryNoFilter() squirrel.SelectBuilder { Columns(r.columns()...) } -func (r reminder) Find(filter types.ReminderFilter) (set types.ReminderSet, err error) { +func (r reminder) Find(filter types.ReminderFilter) (set types.ReminderSet, f types.ReminderFilter, err error) { + f = filter q := r.query() - if filter.AssignedTo != 0 { - q = q.Where("r.assigned_to = ?", filter.AssignedTo) + if f.AssignedTo != 0 { + q = q.Where("r.assigned_to = ?", f.AssignedTo) } - if filter.Resource != "" { - q = q.Where("r.resource LIKE ?%", filter.Resource) + if f.Resource != "" { + q = q.Where("r.resource LIKE ?", f.Resource+"%") + } + + if f.AccessCheck.HasOperation() { + q = q.Where(f.AccessCheck.BindToEnv( + types.ReminderPermissionResource, + "sys", + )) + } + + if f.Count, err = r.count(q); err != nil || f.Count == 0 { + return } // @todo allow sorting at some point q = q.OrderBy("r.remind_at") - return set, r.fetchPaged(&set, q, filter.Page, filter.PerPage) + return set, f, rh.FetchPaged(r.db(), q, f.Page, f.PerPage, &set) } func (r reminder) FindByID(ID uint64) (rm *types.Reminder, err error) { @@ -93,7 +111,14 @@ func (r reminder) FindByID(ID uint64) (rm *types.Reminder, err error) { q := r.query(). Where("r.id = ?", ID) - return rm, isFound(r.fetchOne(rm, q), rm.ID > 0, ErrReminderNotFound) + err = r.fetchOne(rm, q) + if err != nil { + return nil, err + } else if rm.ID <= 0 { + return nil, ErrReminderNotFound + } + + return rm, nil } func (r reminder) FindByIDs(IDs []uint64) (rr types.ReminderSet, err error) { diff --git a/system/rest/reminder.go b/system/rest/reminder.go index 7ce48dbdd..d9a99fa37 100644 --- a/system/rest/reminder.go +++ b/system/rest/reminder.go @@ -4,6 +4,8 @@ import ( "context" "time" + "github.com/cortezaproject/corteza-server/pkg/rh" + "github.com/cortezaproject/corteza-server/internal/auth" "github.com/titpetric/factory/resputil" @@ -38,8 +40,8 @@ func (ctrl *Reminder) List(ctx context.Context, r *request.ReminderList) (interf f := types.ReminderFilter{ AssignedTo: r.AssignedTo, Resource: r.Resource, - Page: r.Page, - PerPage: r.PerPage, + + PageFilter: rh.Paging(r.Page, r.PerPage), } set, filter, err := ctrl.reminder.Find(ctx, f) diff --git a/system/service/reminder.go b/system/service/reminder.go index 46bd305bd..e896e7603 100644 --- a/system/service/reminder.go +++ b/system/service/reminder.go @@ -4,6 +4,7 @@ import ( "context" "time" + "github.com/cortezaproject/corteza-server/internal/permissions" "github.com/cortezaproject/corteza-server/system/repository" intAuth "github.com/cortezaproject/corteza-server/internal/auth" @@ -53,19 +54,20 @@ func Reminder(ctx context.Context) ReminderService { } func (svc reminder) Find(ctx context.Context, f types.ReminderFilter) (types.ReminderSet, types.ReminderFilter, error) { - rr, err := svc.reminder.Find(f) + f.PageFilter.NormalizePerPageNoMax() + + f.AccessCheck = permissions.InitAccessCheckFilter( + "read", + intAuth.GetIdentityFromContext(ctx).Roles(), + svc.ac.CanReadAnyReminder(ctx), + ) + + rr, f, err := svc.reminder.Find(f) if err != nil { return nil, f, err } - ret := types.ReminderSet{} - for _, rm := range rr { - if svc.ac.CanReadReminder(ctx, rm) { - ret = append(ret, rm) - } - } - - return ret, f, nil + return rr, f, nil } func (svc reminder) FindByID(ctx context.Context, ID uint64) (*types.Reminder, error) { diff --git a/system/types/reminder.go b/system/types/reminder.go index 8fea61825..09a14c7ad 100644 --- a/system/types/reminder.go +++ b/system/types/reminder.go @@ -3,12 +3,14 @@ package types import ( "time" + "github.com/cortezaproject/corteza-server/internal/permissions" + "github.com/cortezaproject/corteza-server/pkg/rh" "github.com/jmoiron/sqlx/types" ) type ( Reminder struct { - ID uint64 `json:"notificationID,string" db:"id"` + ID uint64 `json:"reminderID,string" db:"id"` Resource string `json:"resource" db:"resource"` Payload types.JSONText `json:"payload" db:"payload"` SnoozeCount uint `json:"snoozeCount" db:"snooze_count"` @@ -32,5 +34,11 @@ type ( AssignedTo uint64 `json:"assignedTo,uint64"` Page uint `json:"page,uint"` PerPage uint `json:"perPage,uint"` + + // Standard paging fields & helpers + rh.PageFilter + + // Access controll + permissions.AccessCheck `json:"-"` } )