精简后的项目:仅保留 api/ui 源码、文档、构建依赖
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
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 = 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
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user