3
0

Refactor reminder repo

This commit is contained in:
Denis Arh
2019-10-17 16:13:43 +02:00
parent 8f0fc8b58f
commit ce1acec909
4 changed files with 77 additions and 53 deletions
+12
View File
@@ -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"
}
]
}
+57 -49
View File
@@ -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) {
+5 -2
View File
@@ -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
}
+3 -2
View File
@@ -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