Refactor reminder repo
This commit is contained in:
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user