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:
parent
9bb8a26706
commit
3adfeb3b34
2 changed files with 45 additions and 10 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue