fix(namespaces): add list subscriptions (#1254)

Add list subscriptions to namespaces call to enable frontend to show subscription state correctly.

Resolves https://github.com/go-vikunja/frontend/issues/75

Reviewed-on: https://kolaente.dev/vikunja/api/pulls/1254
Reviewed-by: konrad <k@knt.li>
Co-authored-by: Luca Bernstein <luca@lucabernstein.com>
Co-committed-by: Luca Bernstein <luca@lucabernstein.com>
This commit is contained in:
Luca Bernstein 2022-09-29 09:49:24 +00:00 committed by konrad
parent 9bb8a26706
commit 3adfeb3b34
2 changed files with 45 additions and 10 deletions

View file

@ -476,12 +476,22 @@ func addListDetails(s *xorm.Session, lists []*List, a web.Auth) (err error) {
return err return err
} }
subscriptions, err := GetSubscriptions(s, SubscriptionEntityList, listIDs, a)
if err != nil {
log.Errorf("An error occurred while getting list subscriptions for a namespace item: %s", err.Error())
subscriptions = make(map[int64]*Subscription)
}
for _, list := range lists { for _, list := range lists {
// Don't override the favorite state if it was already set from before (favorite saved filters do this) // Don't override the favorite state if it was already set from before (favorite saved filters do this)
if list.IsFavorite { if list.IsFavorite {
continue continue
} }
list.IsFavorite = favs[list.ID] list.IsFavorite = favs[list.ID]
if subscription, exists := subscriptions[list.ID]; exists {
list.Subscription = subscription
}
} }
if len(fileIDs) == 0 { if len(fileIDs) == 0 {

View file

@ -228,28 +228,53 @@ func getSubscriberCondForEntity(entityType SubscriptionEntityType, entityID int6
// that task, if there is none it will look for a subscription on the list the task belongs to and if that also // that task, if there is none it will look for a subscription on the list the task belongs to and if that also
// doesn't exist it will check for a subscription for the namespace the list is belonging to. // doesn't exist it will check for a subscription for the namespace the list is belonging to.
func GetSubscription(s *xorm.Session, entityType SubscriptionEntityType, entityID int64, a web.Auth) (subscription *Subscription, err error) { func GetSubscription(s *xorm.Session, entityType SubscriptionEntityType, entityID int64, a web.Auth) (subscription *Subscription, err error) {
subs, err := GetSubscriptions(s, entityType, []int64{entityID}, a)
if err != nil || len(subs) == 0 {
return nil, err
}
if sub, exists := subs[entityID]; exists {
return sub, nil // Take exact match first, if available
}
for _, sub := range subs {
return sub, nil // For parents, take next available
}
return nil, nil
}
// GetSubscriptions returns a map of subscriptions to a set of given entity IDs
func GetSubscriptions(s *xorm.Session, entityType SubscriptionEntityType, entityIDs []int64, a web.Auth) (listsToSubscriptions map[int64]*Subscription, err error) {
u, is := a.(*user.User) u, is := a.(*user.User)
if !is { if !is {
return return
} }
if err := entityType.validate(); err != nil { if err := entityType.validate(); err != nil {
return nil, err return nil, err
} }
subscription = &Subscription{} var entitiesFilter builder.Cond
cond := getSubscriberCondForEntity(entityType, entityID) for _, eID := range entityIDs {
exists, err := s. if entitiesFilter == nil {
entitiesFilter = getSubscriberCondForEntity(entityType, eID)
continue
}
entitiesFilter = entitiesFilter.Or(getSubscriberCondForEntity(entityType, eID))
}
var subscriptions []*Subscription
err = s.
Where("user_id = ?", u.ID). Where("user_id = ?", u.ID).
And(cond). And(entitiesFilter).
Get(subscription) Find(&subscriptions)
if !exists { if err != nil {
return nil, err return nil, err
} }
subscription.Entity = subscription.EntityType.String() listsToSubscriptions = make(map[int64]*Subscription)
for _, sub := range subscriptions {
return subscription, err sub.Entity = sub.EntityType.String()
listsToSubscriptions[sub.EntityID] = sub
}
return listsToSubscriptions, nil
} }
func getSubscribersForEntity(s *xorm.Session, entityType SubscriptionEntityType, entityID int64) (subscriptions []*Subscription, err error) { func getSubscribersForEntity(s *xorm.Session, entityType SubscriptionEntityType, entityID int64) (subscriptions []*Subscription, err error) {