Favorite tasks (#653)
Fixed namespace tests Add test for favorite tasks Fix favorite tasks not being updated Fix integration tests Fix lint Return a pseudo namespace and list for favorites Make sure users can only see their favorites Add condition show tasks from the favorites list Regenerate swagger docs Add favorite field to task Co-authored-by: kolaente <k@knt.li> Reviewed-on: https://kolaente.dev/vikunja/api/pulls/653
This commit is contained in:
parent
ecf09e17a8
commit
e5559137dd
17 changed files with 230 additions and 31 deletions
|
|
@ -62,6 +62,15 @@ var PseudoNamespace = Namespace{
|
|||
Updated: time.Now(),
|
||||
}
|
||||
|
||||
// FavoritesPseudoNamespace is a pseudo namespace used to hold favorited lists and tasks
|
||||
var FavoritesPseudoNamespace = Namespace{
|
||||
ID: -2,
|
||||
Title: "Favorites",
|
||||
Description: "Favorite lists and tasks.",
|
||||
Created: time.Now(),
|
||||
Updated: time.Now(),
|
||||
}
|
||||
|
||||
// TableName makes beautiful table names
|
||||
func (Namespace) TableName() string {
|
||||
return "namespaces"
|
||||
|
|
@ -79,6 +88,11 @@ func (n *Namespace) GetSimpleByID() (err error) {
|
|||
return
|
||||
}
|
||||
|
||||
if n.ID == FavoritesPseudoNamespace.ID {
|
||||
*n = FavoritesPseudoNamespace
|
||||
return
|
||||
}
|
||||
|
||||
namespaceFromDB := &Namespace{}
|
||||
exists, err := x.Where("id = ?", n.ID).Get(namespaceFromDB)
|
||||
if err != nil {
|
||||
|
|
@ -180,8 +194,17 @@ func (n *Namespace) ReadAll(a web.Auth, search string, page int, perPage int) (r
|
|||
)
|
||||
}
|
||||
|
||||
// Create our pseudo-namespace to hold the shared lists
|
||||
// Create our pseudo namespace with favorite lists
|
||||
// We want this one at the beginning, which is why we create it here
|
||||
pseudoFavoriteNamespace := FavoritesPseudoNamespace
|
||||
pseudoFavoriteNamespace.Owner = doer
|
||||
all = append(all, &NamespaceWithLists{
|
||||
Namespace: pseudoFavoriteNamespace,
|
||||
Lists: []*List{{}},
|
||||
})
|
||||
*all[0].Lists[0] = FavoritesPseudoList // Copying the list to be able to modify it later
|
||||
|
||||
// Create our pseudo namespace to hold the shared lists
|
||||
pseudonamespace := PseudoNamespace
|
||||
pseudonamespace.Owner = doer
|
||||
all = append(all, &NamespaceWithLists{
|
||||
|
|
@ -266,6 +289,19 @@ func (n *Namespace) ReadAll(a web.Auth, search string, page int, perPage int) (r
|
|||
|
||||
// Remove the pseudonamespace if we don't have any shared lists
|
||||
if len(individualLists) == 0 {
|
||||
all = append(all[:1], all[2:]...)
|
||||
}
|
||||
|
||||
// Check if we have any favorites and remove the favorites namespace from the list if not
|
||||
favoriteCount, err := x.
|
||||
Join("INNER", "list", "tasks.list_id = list.id").
|
||||
Join("INNER", "namespaces", "list.namespace_id = namespaces.id").
|
||||
Where(builder.And(builder.Eq{"is_favorite": true}, builder.In("namespaces.id", namespaceids))).
|
||||
Count(&Task{})
|
||||
if err != nil {
|
||||
return nil, 0, 0, err
|
||||
}
|
||||
if favoriteCount == 0 {
|
||||
all = append(all[:0], all[1:]...)
|
||||
}
|
||||
|
||||
|
|
|
|||
Reference in a new issue