From ce1acec909e08c0733ded1c3931b690b6f78f1e5 Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Thu, 17 Oct 2019 16:13:43 +0200 Subject: [PATCH] Refactor reminder repo --- api/system/spec.json | 12 ++++ system/repository/reminder.go | 106 ++++++++++++++++++---------------- system/service/reminder.go | 7 ++- system/types/reminder.go | 5 +- 4 files changed, 77 insertions(+), 53 deletions(-) diff --git a/api/system/spec.json b/api/system/spec.json index 70c3869f5..f16554774 100644 --- a/api/system/spec.json +++ b/api/system/spec.json @@ -1644,6 +1644,12 @@ "path": "/", "parameters": { "get": [ + { + "name": "reminderID", + "type": "[]string", + "required": false, + "title": "Filter by reminder ID" + }, { "name": "resource", "required": false, @@ -1691,6 +1697,12 @@ "type": "uint", "required": false, "title": "Returned items per page (default 50)" + }, + { + "name": "sort", + "required": false, + "title": "Sort", + "type": "string" } ] } diff --git a/system/repository/reminder.go b/system/repository/reminder.go index 744608d30..c83274839 100644 --- a/system/repository/reminder.go +++ b/system/repository/reminder.go @@ -15,7 +15,6 @@ type ( ReminderRepository interface { Find(types.ReminderFilter) (set types.ReminderSet, f types.ReminderFilter, err error) FindByID(ID uint64) (*types.Reminder, error) - FindByIDs(ID []uint64) (types.ReminderSet, error) Create(mod *types.Reminder) (*types.Reminder, error) Update(mod *types.Reminder) (*types.Reminder, error) @@ -33,10 +32,13 @@ const ( ) func Reminder(ctx context.Context, db *factory.DB) ReminderRepository { - rpo := &repository{} - return (&reminder{ - repository: rpo.With(ctx, db), - }) + return (&reminder{}).With(ctx, db) +} + +func (r reminder) With(ctx context.Context, db *factory.DB) ReminderRepository { + return &reminder{ + repository: r.repository.With(ctx, db), + } } func (r reminder) table() string { @@ -71,75 +73,81 @@ func (r reminder) query() squirrel.SelectBuilder { func (r reminder) queryNoFilter() squirrel.SelectBuilder { return squirrel. - Select(). - From(r.table() + " AS r"). - Columns(r.columns()...) + Select(r.columns()...). + From(r.table() + " AS r") +} + +func (r reminder) FindByID(ID uint64) (rm *types.Reminder, err error) { + return r.findOneBy("id", ID) +} + +func (r reminder) findOneBy(field string, value interface{}) (*types.Reminder, error) { + var ( + p = &types.Reminder{} + + q = r.query(). + Where(squirrel.Eq{field: value}) + + err = rh.FetchOne(r.db(), q, p) + ) + + if err != nil { + return nil, err + } else if p.ID == 0 { + return nil, ErrReminderNotFound + } + + return p, nil } func (r reminder) Find(filter types.ReminderFilter) (set types.ReminderSet, f types.ReminderFilter, err error) { f = filter - q := r.query() + + if f.Sort == "" { + f.Sort = "r.remind_at" + } + + query := r.query() + + if len(f.ReminderID) > 0 { + query = query.Where(squirrel.Eq{"r.ID": f.ReminderID}) + } if f.ExcludeDismissed { - q = q.Where("dismissed_at IS NULL") + query = query.Where("r.dismissed_at IS NULL") } if f.ScheduledOnly { - q = q.Where("remind_at IS NOT NULL") + query = query.Where("r.remind_at IS NOT NULL") } if f.AssignedTo != 0 { - q = q.Where("r.assigned_to = ?", f.AssignedTo) + query = query.Where("r.assigned_to = ?", f.AssignedTo) } if f.Resource != "" { - q = q.Where("r.resource LIKE ?", f.Resource+"%") + query = query.Where("r.resource LIKE ?", f.Resource+"%") } if f.ScheduledFrom != nil { - q = q.Where("r.remind_at >= ?", f.ScheduledFrom.Format(time.RFC3339)) + query = query.Where("r.remind_at >= ?", f.ScheduledFrom.Format(time.RFC3339)) } if f.ScheduledUntil != nil { - q = q.Where("r.remind_at <= ?", f.ScheduledUntil.Format(time.RFC3339)) + query = query.Where("r.remind_at <= ?", f.ScheduledUntil.Format(time.RFC3339)) } - if f.Count, err = r.count(q); err != nil || f.Count == 0 { + var orderBy []string + if orderBy, err = rh.ParseOrder(f.Sort, r.columns()...); err != nil { + return + } else { + query = query.OrderBy(orderBy...) + } + + if f.Count, err = rh.Count(r.db(), query); err != nil || f.Count == 0 { return } - // @todo allow sorting at some point - q = q.OrderBy("r.remind_at") - - return set, f, rh.FetchPaged(r.db(), q, f.Page, f.PerPage, &set) -} - -func (r reminder) FindByID(ID uint64) (rm *types.Reminder, err error) { - rm = &types.Reminder{} - - q := r.query(). - Where("r.id = ?", ID) - - 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) { - if len(IDs) == 0 { - return nil, nil - } - - var ( - q = r.query(). - Where("r.id IN (?)", IDs) - ) - - return rr, r.fetchSet(&rr, q) + return set, f, rh.FetchPaged(r.db(), query, f.Page, f.PerPage, &set) } func (r reminder) Create(mod *types.Reminder) (rm *types.Reminder, err error) { diff --git a/system/service/reminder.go b/system/service/reminder.go index d4a0fff16..88a8637d8 100644 --- a/system/service/reminder.go +++ b/system/service/reminder.go @@ -27,7 +27,6 @@ type ( ReminderService interface { Find(context.Context, types.ReminderFilter) (types.ReminderSet, types.ReminderFilter, error) FindByID(context.Context, uint64) (*types.Reminder, error) - FindByIDs(context.Context, ...uint64) (types.ReminderSet, error) Create(context.Context, *types.Reminder) (*types.Reminder, error) @@ -70,7 +69,11 @@ func (svc reminder) FindByID(ctx context.Context, ID uint64) (*types.Reminder, e } func (svc reminder) FindByIDs(ctx context.Context, IDs ...uint64) (types.ReminderSet, error) { - rr, err := svc.reminder.FindByIDs(IDs) + if len(IDs) == 0 { + return nil, nil + } + + rr, _, err := svc.reminder.Find(types.ReminderFilter{ReminderID: IDs}) if err != nil { return nil, err } diff --git a/system/types/reminder.go b/system/types/reminder.go index ab0b5f6e0..2cfe10e76 100644 --- a/system/types/reminder.go +++ b/system/types/reminder.go @@ -30,14 +30,15 @@ type ( } ReminderFilter struct { + ReminderID []uint64 `json:"reminderID"` 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"` + + Sort string `json:"sort"` // Standard paging fields & helpers rh.PageFilter