diff --git a/pkg/datastore/datastore.go b/pkg/datastore/datastore.go index 82eda8f..ca2dbe0 100644 --- a/pkg/datastore/datastore.go +++ b/pkg/datastore/datastore.go @@ -38,6 +38,7 @@ type Mapfixes interface { IfStatusThenUpdateAndGet(ctx context.Context, id int64, statuses []model.MapfixStatus, values OptionalMap) (model.Mapfix, error) Delete(ctx context.Context, id int64) error List(ctx context.Context, filters OptionalMap, page model.Page, sort ListSort) ([]model.Mapfix, error) + ListRestricted(ctx context.Context, filters OptionalMap, page model.Page, sort ListSort, submitter int64) ([]model.Mapfix, error) } type Operations interface { @@ -56,6 +57,7 @@ type Submissions interface { IfStatusThenUpdateAndGet(ctx context.Context, id int64, statuses []model.SubmissionStatus, values OptionalMap) (model.Submission, error) Delete(ctx context.Context, id int64) error List(ctx context.Context, filters OptionalMap, page model.Page, sort ListSort) ([]model.Submission, error) + ListRestricted(ctx context.Context, filters OptionalMap, page model.Page, sort ListSort, submitter int64) ([]model.Submission, error) } type Scripts interface { diff --git a/pkg/datastore/gormstore/mapfixes.go b/pkg/datastore/gormstore/mapfixes.go index d80067e..ec91cd1 100644 --- a/pkg/datastore/gormstore/mapfixes.go +++ b/pkg/datastore/gormstore/mapfixes.go @@ -130,3 +130,40 @@ func (env *Mapfixes) List(ctx context.Context, filters datastore.OptionalMap, pa return maps, nil } + +func (env *Mapfixes) ListRestricted(ctx context.Context, filters datastore.OptionalMap, page model.Page, sort datastore.ListSort, submitter int64) ([]model.Mapfix, error) { + var maps []model.Mapfix + + db := env.db + + switch sort { + case datastore.ListSortDisabled: + // No sort + break + case datastore.ListSortDisplayNameAscending: + db=db.Order("display_name ASC") + break + case datastore.ListSortDisplayNameDescending: + db=db.Order("display_name DESC") + break + case datastore.ListSortDateAscending: + db=db.Order("created_at ASC") + break + case datastore.ListSortDateDescending: + db=db.Order("created_at DESC") + break + default: + return nil, datastore.ErrInvalidListSort + } + + if err := db. + Where(filters.Map()). + Where("status_id NOT IN ? OR submitter = ? AND status_id IN ?",PrivateSubmissions,submitter,PrivateSubmissions). + Offset(int((page.Number - 1) * page.Size)). + Limit(int(page.Size)). + Find(&maps).Error; err != nil { + return nil, err + } + + return maps, nil +} diff --git a/pkg/datastore/gormstore/submissions.go b/pkg/datastore/gormstore/submissions.go index dc384c6..5bd1959 100644 --- a/pkg/datastore/gormstore/submissions.go +++ b/pkg/datastore/gormstore/submissions.go @@ -10,6 +10,13 @@ import ( "gorm.io/gorm/clause" ) +var( + PrivateSubmissions = []model.SubmissionStatus{ + model.SubmissionStatusUnderConstruction, + model.SubmissionStatusChangesRequested, + } +) + type Submissions struct { db *gorm.DB } @@ -130,3 +137,44 @@ func (env *Submissions) List(ctx context.Context, filters datastore.OptionalMap, return maps, nil } + +func (env *Submissions) ListRestricted(ctx context.Context, filters datastore.OptionalMap, page model.Page, sort datastore.ListSort, submitter int64) ([]model.Submission, error) { + var maps []model.Submission + + db := env.db + + switch sort { + case datastore.ListSortDisabled: + // No sort + break + case datastore.ListSortDisplayNameAscending: + db=db.Order("display_name ASC") + break + case datastore.ListSortDisplayNameDescending: + db=db.Order("display_name DESC") + break + case datastore.ListSortDateAscending: + db=db.Order("created_at ASC") + break + case datastore.ListSortDateDescending: + db=db.Order("created_at DESC") + break + default: + return nil, datastore.ErrInvalidListSort + } + + if err := db. + Where(filters.Map()). + // In order to see submissions, + // at least one of two criteria must be met: + // - You are the submitter + // - The submission is not under construction / changes requested + Where("status_id NOT IN ? OR submitter = ? AND status_id IN ?",PrivateSubmissions,submitter,PrivateSubmissions). + Offset(int((page.Number - 1) * page.Size)). + Limit(int(page.Size)). + Find(&maps).Error; err != nil { + return nil, err + } + + return maps, nil +}