Add dataloaders to combine database queries (#190)

See also https://gqlgen.com/reference/dataloaders/
This commit is contained in:
Viktor Strate Kløvedal
2021-02-07 22:17:33 +01:00
committed by GitHub
parent 54a83a4dc6
commit ce3090394b
13 changed files with 931 additions and 80 deletions

View File

@@ -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) {