1
Fork 0
photoview/api/dataloader/userFavoriteLoader.go

61 lines
1.4 KiB
Go
Raw Normal View History

package dataloader
import (
"time"
"github.com/photoview/photoview/api/graphql/models"
"gorm.io/gorm"
)
func NewUserFavoriteLoader(db *gorm.DB) *UserFavoritesLoader {
return &UserFavoritesLoader{
maxBatch: 100,
wait: 5 * time.Millisecond,
fetch: func(keys []*models.UserMediaData) ([]bool, []error) {
userIDMap := make(map[int]struct{}, len(keys))
mediaIDMap := make(map[int]struct{}, len(keys))
for _, key := range keys {
userIDMap[key.UserID] = struct{}{}
mediaIDMap[key.MediaID] = struct{}{}
}
uniqueUserIDs := make([]int, len(userIDMap))
uniqueMediaIDs := make([]int, len(mediaIDMap))
count := 0
for id := range userIDMap {
uniqueUserIDs[count] = id
count++
}
count = 0
for id := range mediaIDMap {
uniqueMediaIDs[count] = id
count++
}
var userMediaFavorites []*models.UserMediaData
2021-02-14 11:04:38 +01:00
err := db.Where("user_id IN (?)", uniqueUserIDs).Where("media_id IN (?)", uniqueMediaIDs).Where("favorite = TRUE").Find(&userMediaFavorites).Error
if err != nil {
return nil, []error{err}
}
result := make([]bool, len(keys))
for i, key := range keys {
favorite := false
for _, fav := range userMediaFavorites {
if fav.UserID == key.UserID && fav.MediaID == key.MediaID {
favorite = true
break
}
}
result[i] = favorite
}
return result, nil
},
}
}