mirror of
https://git.vectorsigma.ru/public/photoview.git
synced 2026-08-03 21:19:18 +00:00
Add dataloaders to combine database queries (#190)
See also https://gqlgen.com/reference/dataloaders/
This commit is contained in:
committed by
GitHub
parent
54a83a4dc6
commit
ce3090394b
@@ -5,10 +5,9 @@ import (
|
||||
|
||||
api "github.com/photoview/photoview/api/graphql"
|
||||
"github.com/photoview/photoview/api/graphql/auth"
|
||||
"github.com/photoview/photoview/api/graphql/dataloader"
|
||||
"github.com/photoview/photoview/api/graphql/models"
|
||||
"github.com/photoview/photoview/api/scanner"
|
||||
"github.com/pkg/errors"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
@@ -145,39 +144,11 @@ func (r *mediaResolver) HighRes(ctx context.Context, media *models.Media) (*mode
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var url models.MediaURL
|
||||
err := r.Database.
|
||||
Where("media_id = ?", media.ID).
|
||||
Where("purpose = ? OR (purpose = ? AND content_type IN ?)", models.PhotoHighRes, models.MediaOriginal, scanner.WebMimetypes).
|
||||
First(&url).Error
|
||||
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, nil
|
||||
} else {
|
||||
return nil, errors.Wrapf(err, "could not query high-res (%s)", media.Path)
|
||||
}
|
||||
}
|
||||
|
||||
return &url, nil
|
||||
return dataloader.For(ctx).MediaHighres.Load(media.ID)
|
||||
}
|
||||
|
||||
func (r *mediaResolver) Thumbnail(ctx context.Context, media *models.Media) (*models.MediaURL, error) {
|
||||
var url []*models.MediaURL
|
||||
err := r.Database.
|
||||
Where("media_id = ?", media.ID).
|
||||
Where("purpose = ? OR purpose = ?", models.PhotoThumbnail, models.VideoThumbnail).
|
||||
Find(&url).Error
|
||||
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "could not query thumbnail (%s)", media.Path)
|
||||
}
|
||||
|
||||
if len(url) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
return url[0], nil
|
||||
return dataloader.For(ctx).MediaThumbnail.Load(media.ID)
|
||||
}
|
||||
|
||||
func (r *mediaResolver) VideoWeb(ctx context.Context, media *models.Media) (*models.MediaURL, error) {
|
||||
@@ -185,21 +156,7 @@ func (r *mediaResolver) VideoWeb(ctx context.Context, media *models.Media) (*mod
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var url models.MediaURL
|
||||
err := r.Database.
|
||||
Where("media_id = ?", media.ID).
|
||||
Where("purpose = ? OR purpose = ?", models.VideoWeb, models.MediaOriginal).
|
||||
First(&url).Error
|
||||
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, nil
|
||||
} else {
|
||||
return nil, errors.Wrapf(err, "could not query video web-format url (%s)", media.Path)
|
||||
}
|
||||
}
|
||||
|
||||
return &url, nil
|
||||
return dataloader.For(ctx).MediaVideoWeb.Load(media.ID)
|
||||
}
|
||||
|
||||
func (r *mediaResolver) Exif(ctx context.Context, media *models.Media) (*models.MediaEXIF, error) {
|
||||
@@ -221,17 +178,10 @@ func (r *mediaResolver) Favorite(ctx context.Context, media *models.Media) (bool
|
||||
return false, auth.ErrUnauthorized
|
||||
}
|
||||
|
||||
userMediaData := models.UserMediaData{
|
||||
UserID: user.ID,
|
||||
MediaID: media.ID,
|
||||
Favorite: false,
|
||||
}
|
||||
|
||||
if err := r.Database.FirstOrInit(&userMediaData).Error; err != nil {
|
||||
return false, errors.Wrapf(err, "get user media data from database (user: %d, media: %d)", user.ID, media.ID)
|
||||
}
|
||||
|
||||
return userMediaData.Favorite, nil
|
||||
return dataloader.For(ctx).UserMediaFavorite.Load(&models.UserMediaData{
|
||||
UserID: user.ID,
|
||||
MediaID: media.ID,
|
||||
})
|
||||
}
|
||||
|
||||
func (r *mutationResolver) FavoriteMedia(ctx context.Context, mediaID int, favorite bool) (*models.Media, error) {
|
||||
|
||||
Reference in New Issue
Block a user