60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
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
|
|
err := db.Where("user_id IN (?)", uniqueUserIDs).Where("media_id IN (?)", uniqueMediaIDs).Where("favorite = 1").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
|
|
},
|
|
}
|
|
}
|