Improve pagination #105
|
@ -130,9 +130,9 @@ func (l *Label) Delete() (err error) {
|
||||||
// @Success 200 {array} models.Label "The labels"
|
// @Success 200 {array} models.Label "The labels"
|
||||||
// @Failure 500 {object} models.Message "Internal error"
|
// @Failure 500 {object} models.Message "Internal error"
|
||||||
// @Router /labels [get]
|
// @Router /labels [get]
|
||||||
func (l *Label) ReadAll(search string, a web.Auth, page int) (ls interface{}, err error) {
|
func (l *Label) ReadAll(a web.Auth, search string, page int, perPage int) (ls interface{}, resultCount int, numberOfPages int, err error) {
|
||||||
if _, is := a.(*LinkSharing); is {
|
if _, is := a.(*LinkSharing); is {
|
||||||
return nil, ErrGenericForbidden{}
|
return nil, 0, 0, ErrGenericForbidden{}
|
||||||
}
|
}
|
||||||
|
|
||||||
u := &User{ID: a.GetID()}
|
u := &User{ID: a.GetID()}
|
||||||
|
@ -140,13 +140,15 @@ func (l *Label) ReadAll(search string, a web.Auth, page int) (ls interface{}, er
|
||||||
// Get all tasks
|
// Get all tasks
|
||||||
taskIDs, err := getUserTaskIDs(u)
|
taskIDs, err := getUserTaskIDs(u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, 0, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return getLabelsByTaskIDs(&LabelByTaskIDsOptions{
|
return getLabelsByTaskIDs(&LabelByTaskIDsOptions{
|
||||||
Search: search,
|
Search: search,
|
||||||
User: u,
|
User: u,
|
||||||
TaskIDs: taskIDs,
|
TaskIDs: taskIDs,
|
||||||
|
Page: page,
|
||||||
|
PerPage: perPage,
|
||||||
GetUnusedLabels: true,
|
GetUnusedLabels: true,
|
||||||
GroupByLabelIDsOnly: true,
|
GroupByLabelIDsOnly: true,
|
||||||
})
|
})
|
||||||
|
|
|
@ -107,15 +107,15 @@ func (lt *LabelTask) Create(a web.Auth) (err error) {
|
||||||
// @Success 200 {array} models.Label "The labels"
|
// @Success 200 {array} models.Label "The labels"
|
||||||
// @Failure 500 {object} models.Message "Internal error"
|
// @Failure 500 {object} models.Message "Internal error"
|
||||||
// @Router /tasks/{task}/labels [get]
|
// @Router /tasks/{task}/labels [get]
|
||||||
func (lt *LabelTask) ReadAll(search string, a web.Auth, page int) (labels interface{}, err error) {
|
func (lt *LabelTask) ReadAll(a web.Auth, search string, page int, perPage int) (labels interface{}, resultCount int, numberOfPages int, err error) {
|
||||||
// Check if the user has the right to see the task
|
// Check if the user has the right to see the task
|
||||||
task := Task{ID: lt.TaskID}
|
task := Task{ID: lt.TaskID}
|
||||||
canRead, err := task.CanRead(a)
|
canRead, err := task.CanRead(a)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, 0, 0, err
|
||||||
}
|
}
|
||||||
if !canRead {
|
if !canRead {
|
||||||
return nil, ErrNoRightToSeeTask{lt.TaskID, a.GetID()}
|
return nil, 0, 0, ErrNoRightToSeeTask{lt.TaskID, a.GetID()}
|
||||||
}
|
}
|
||||||
|
|
||||||
return getLabelsByTaskIDs(&LabelByTaskIDsOptions{
|
return getLabelsByTaskIDs(&LabelByTaskIDsOptions{
|
||||||
|
@ -137,6 +137,7 @@ type LabelByTaskIDsOptions struct {
|
||||||
User *User
|
User *User
|
||||||
Search string
|
Search string
|
||||||
Page int
|
Page int
|
||||||
|
PerPage int
|
||||||
TaskIDs []int64
|
TaskIDs []int64
|
||||||
GetUnusedLabels bool
|
GetUnusedLabels bool
|
||||||
GroupByLabelIDsOnly bool
|
GroupByLabelIDsOnly bool
|
||||||
|
@ -144,7 +145,7 @@ type LabelByTaskIDsOptions struct {
|
||||||
|
|
||||||
// Helper function to get all labels for a set of tasks
|
// Helper function to get all labels for a set of tasks
|
||||||
// Used when getting all labels for one task as well when getting all lables
|
// Used when getting all labels for one task as well when getting all lables
|
||||||
func getLabelsByTaskIDs(opts *LabelByTaskIDsOptions) (ls []*labelWithTaskID, err error) {
|
func getLabelsByTaskIDs(opts *LabelByTaskIDsOptions) (ls []*labelWithTaskID, resultCount int, numberOfPages int, err error) {
|
||||||
// Include unused labels. Needed to be able to show a list of all unused labels a user
|
// Include unused labels. Needed to be able to show a list of all unused labels a user
|
||||||
// has access to.
|
// has access to.
|
||||||
var uidOrNil interface{}
|
var uidOrNil interface{}
|
||||||
|
@ -172,10 +173,10 @@ func getLabelsByTaskIDs(opts *LabelByTaskIDsOptions) (ls []*labelWithTaskID, err
|
||||||
Or(builder.In("label_task.task_id", opts.TaskIDs)).
|
Or(builder.In("label_task.task_id", opts.TaskIDs)).
|
||||||
And("labels.title LIKE ?", "%"+opts.Search+"%").
|
And("labels.title LIKE ?", "%"+opts.Search+"%").
|
||||||
GroupBy(groupBy).
|
GroupBy(groupBy).
|
||||||
Limit(getLimitFromPageIndex(opts.Page)).
|
Limit(getLimitFromPageIndex(opts.Page, opts.PerPage)).
|
||||||
Find(&labels)
|
Find(&labels)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, 0, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get all created by users
|
// Get all created by users
|
||||||
|
@ -186,7 +187,7 @@ func getLabelsByTaskIDs(opts *LabelByTaskIDsOptions) (ls []*labelWithTaskID, err
|
||||||
users := make(map[int64]*User)
|
users := make(map[int64]*User)
|
||||||
err = x.In("id", userids).Find(&users)
|
err = x.In("id", userids).Find(&users)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, 0, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Obfuscate all user emails
|
// Obfuscate all user emails
|
||||||
|
@ -199,7 +200,19 @@ func getLabelsByTaskIDs(opts *LabelByTaskIDsOptions) (ls []*labelWithTaskID, err
|
||||||
labels[in].CreatedBy = users[l.CreatedByID]
|
labels[in].CreatedBy = users[l.CreatedByID]
|
||||||
}
|
}
|
||||||
|
|
||||||
return labels, err
|
// Get the total pages
|
||||||
|
totalEntries, err := x.Table("labels").
|
||||||
|
Join("LEFT", "label_task", "label_task.label_id = labels.id").
|
||||||
|
Where(requestOrNil, uidOrNil).
|
||||||
|
Or(builder.In("label_task.task_id", opts.TaskIDs)).
|
||||||
|
And("labels.title LIKE ?", "%"+opts.Search+"%").
|
||||||
|
GroupBy(groupBy).
|
||||||
|
Count(&Label{})
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return labels, len(labels), getTotalAvailablePagesForPageEntries(int(totalEntries), opts.PerPage), err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create or update a bunch of task labels
|
// Create or update a bunch of task labels
|
||||||
|
|
|
@ -89,7 +89,7 @@ func TestLabelTask_ReadAll(t *testing.T) {
|
||||||
CRUDable: tt.fields.CRUDable,
|
CRUDable: tt.fields.CRUDable,
|
||||||
Rights: tt.fields.Rights,
|
Rights: tt.fields.Rights,
|
||||||
}
|
}
|
||||||
gotLabels, err := l.ReadAll(tt.args.search, tt.args.a, tt.args.page)
|
gotLabels, _, _, err := l.ReadAll(tt.args.a, tt.args.search, tt.args.page, 0)
|
||||||
if (err != nil) != tt.wantErr {
|
if (err != nil) != tt.wantErr {
|
||||||
t.Errorf("LabelTask.ReadAll() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("LabelTask.ReadAll() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
return
|
return
|
||||||
|
|
|
@ -117,7 +117,7 @@ func TestLabel_ReadAll(t *testing.T) {
|
||||||
CRUDable: tt.fields.CRUDable,
|
CRUDable: tt.fields.CRUDable,
|
||||||
Rights: tt.fields.Rights,
|
Rights: tt.fields.Rights,
|
||||||
}
|
}
|
||||||
gotLs, err := l.ReadAll(tt.args.search, tt.args.a, tt.args.page)
|
gotLs, _, _, err := l.ReadAll(tt.args.a, tt.args.search, tt.args.page, 0)
|
||||||
if (err != nil) != tt.wantErr {
|
if (err != nil) != tt.wantErr {
|
||||||
t.Errorf("Label.ReadAll() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("Label.ReadAll() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
return
|
return
|
||||||
|
|
|
@ -69,7 +69,7 @@ func SetEngine() (err error) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getLimitFromPageIndex(page int) (limit, start int) {
|
func getLimitFromPageIndex(page int, perPage ...int) (limit, start int) {
|
||||||
|
|
||||||
// Get everything when page index is -1
|
// Get everything when page index is -1
|
||||||
if page < 0 {
|
if page < 0 {
|
||||||
|
@ -77,10 +77,24 @@ func getLimitFromPageIndex(page int) (limit, start int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
limit = config.ServicePageCount.GetInt()
|
limit = config.ServicePageCount.GetInt()
|
||||||
|
if len(perPage) > 0 {
|
||||||
|
limit = perPage[0]
|
||||||
|
}
|
||||||
|
|
||||||
start = limit * (page - 1)
|
start = limit * (page - 1)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getTotalAvailablePagesForPageEntries(numberOfPageEntries, perPage int) int {
|
||||||
|
if numberOfPageEntries == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if perPage == 0 {
|
||||||
|
return numberOfPageEntries / config.ServicePageCount.GetInt()
|
||||||
|
}
|
||||||
|
return numberOfPageEntries / perPage
|
||||||
|
}
|
||||||
|
|
||||||
// GetTotalCount returns the total amount of something
|
// GetTotalCount returns the total amount of something
|
||||||
func GetTotalCount(counting interface{}) (count int64, err error) {
|
func GetTotalCount(counting interface{}) (count int64, err error) {
|
||||||
return x.Count(counting)
|
return x.Count(counting)
|
||||||
|
|
|
@ -339,7 +339,7 @@ func GetTaskByID(listTaskID int64) (listTask Task, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get task labels
|
// Get task labels
|
||||||
taskLabels, err := getLabelsByTaskIDs(&LabelByTaskIDsOptions{
|
taskLabels, _, _, err := getLabelsByTaskIDs(&LabelByTaskIDsOptions{
|
||||||
TaskIDs: []int64{listTaskID},
|
TaskIDs: []int64{listTaskID},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -413,7 +413,7 @@ func addMoreInfoToTasks(taskMap map[int64]*Task) (tasks []*Task, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get all labels for all the tasks
|
// Get all labels for all the tasks
|
||||||
labels, err := getLabelsByTaskIDs(&LabelByTaskIDsOptions{
|
labels, _, _, err := getLabelsByTaskIDs(&LabelByTaskIDsOptions{
|
||||||
TaskIDs: taskIDs,
|
TaskIDs: taskIDs,
|
||||||
Page: -1,
|
Page: -1,
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue
Block a user