Add album thumbnail to graphql

This commit is contained in:
viktorstrate
2020-02-09 16:16:41 +01:00
parent e6593ee7f3
commit 963acf11e8
6 changed files with 119 additions and 31 deletions

View File

@@ -54,7 +54,8 @@ type ComplexityRoot struct {
ParentAlbum func(childComplexity int) int
Path func(childComplexity int) int
Photos func(childComplexity int, filter *models.Filter) int
SubAlbums func(childComplexity int) int
SubAlbums func(childComplexity int, filter *models.Filter) int
Thumbnail func(childComplexity int) int
Title func(childComplexity int) int
}
@@ -134,9 +135,11 @@ type ComplexityRoot struct {
type AlbumResolver interface {
Photos(ctx context.Context, obj *models.Album, filter *models.Filter) ([]*models.Photo, error)
SubAlbums(ctx context.Context, obj *models.Album) ([]*models.Album, error)
SubAlbums(ctx context.Context, obj *models.Album, filter *models.Filter) ([]*models.Album, error)
ParentAlbum(ctx context.Context, obj *models.Album) (*models.Album, error)
Owner(ctx context.Context, obj *models.Album) (*models.User, error)
Thumbnail(ctx context.Context, obj *models.Album) (*models.Photo, error)
}
type MutationResolver interface {
AuthorizeUser(ctx context.Context, username string, password string) (*models.AuthorizeResult, error)
@@ -222,7 +225,19 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
break
}
return e.complexity.Album.SubAlbums(childComplexity), true
args, err := ec.field_Album_subAlbums_args(context.TODO(), rawArgs)
if err != nil {
return 0, false
}
return e.complexity.Album.SubAlbums(childComplexity, args["filter"].(*models.Filter)), true
case "Album.thumbnail":
if e.complexity.Album.Thumbnail == nil {
break
}
return e.complexity.Album.Thumbnail(childComplexity), true
case "Album.title":
if e.complexity.Album.Title == nil {
@@ -750,10 +765,11 @@ type Album {
id: ID!
title: String!
photos(filter: Filter): [Photo!]!
subAlbums: [Album!]!
subAlbums(filter: Filter): [Album!]!
parentAlbum: Album
owner: User!
path: String!
thumbnail: Photo
# shares: [ShareToken]
}
@@ -829,6 +845,20 @@ func (ec *executionContext) field_Album_photos_args(ctx context.Context, rawArgs
return args, nil
}
func (ec *executionContext) field_Album_subAlbums_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
var err error
args := map[string]interface{}{}
var arg0 *models.Filter
if tmp, ok := rawArgs["filter"]; ok {
arg0, err = ec.unmarshalOFilter2ᚖgithubᚗcomᚋviktorstrateᚋphotoviewᚋapiᚋgraphqlᚋmodelsᚐFilter(ctx, tmp)
if err != nil {
return nil, err
}
}
args["filter"] = arg0
return args, nil
}
func (ec *executionContext) field_Mutation_authorizeUser_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
var err error
args := map[string]interface{}{}
@@ -1179,10 +1209,17 @@ func (ec *executionContext) _Album_subAlbums(ctx context.Context, field graphql.
IsMethod: true,
}
ctx = graphql.WithResolverContext(ctx, rctx)
rawArgs := field.ArgumentMap(ec.Variables)
args, err := ec.field_Album_subAlbums_args(ctx, rawArgs)
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
rctx.Args = args
ctx = ec.Tracer.StartFieldResolverExecution(ctx, rctx)
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Album().SubAlbums(rctx, obj)
return ec.resolvers.Album().SubAlbums(rctx, obj, args["filter"].(*models.Filter))
})
if err != nil {
ec.Error(ctx, err)
@@ -1308,6 +1345,40 @@ func (ec *executionContext) _Album_path(ctx context.Context, field graphql.Colle
return ec.marshalNString2string(ctx, field.Selections, res)
}
func (ec *executionContext) _Album_thumbnail(ctx context.Context, field graphql.CollectedField, obj *models.Album) (ret graphql.Marshaler) {
ctx = ec.Tracer.StartFieldExecution(ctx, field)
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
ec.Tracer.EndFieldExecution(ctx)
}()
rctx := &graphql.ResolverContext{
Object: "Album",
Field: field,
Args: nil,
IsMethod: true,
}
ctx = graphql.WithResolverContext(ctx, rctx)
ctx = ec.Tracer.StartFieldResolverExecution(ctx, rctx)
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Album().Thumbnail(rctx, obj)
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
return graphql.Null
}
res := resTmp.(*models.Photo)
rctx.Result = res
ctx = ec.Tracer.StartFieldChildExecution(ctx)
return ec.marshalOPhoto2ᚖgithubᚗcomᚋviktorstrateᚋphotoviewᚋapiᚋgraphqlᚋmodelsᚐPhoto(ctx, field.Selections, res)
}
func (ec *executionContext) _AuthorizeResult_success(ctx context.Context, field graphql.CollectedField, obj *models.AuthorizeResult) (ret graphql.Marshaler) {
ctx = ec.Tracer.StartFieldExecution(ctx, field)
defer func() {
@@ -4414,6 +4485,17 @@ func (ec *executionContext) _Album(ctx context.Context, sel ast.SelectionSet, ob
if out.Values[i] == graphql.Null {
atomic.AddUint32(&invalids, 1)
}
case "thumbnail":
field := field
out.Concurrently(i, func() (res graphql.Marshaler) {
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
}
}()
res = ec._Album_thumbnail(ctx, field, obj)
return res
})
default:
panic("unknown field " + strconv.Quote(field.Name))
}

View File

@@ -2,6 +2,7 @@ package resolvers
import (
"context"
"database/sql"
api "github.com/viktorstrate/photoview/api/graphql"
"github.com/viktorstrate/photoview/api/graphql/auth"
@@ -74,8 +75,29 @@ func (r *albumResolver) Photos(ctx context.Context, obj *models.Album, filter *m
return photos, nil
}
func (r *albumResolver) SubAlbums(ctx context.Context, obj *models.Album) ([]*models.Album, error) {
rows, err := r.Database.Query("SELECT * FROM album WHERE parent_album = ?", obj.AlbumID)
func (r *albumResolver) Thumbnail(ctx context.Context, obj *models.Album) (*models.Photo, error) {
row := r.Database.QueryRow("SELECT photo.* FROM album, photo WHERE album.album_id = ? AND photo.album_id = album.album_id", obj.AlbumID)
photo, err := models.NewPhotoFromRow(row)
if err != nil {
if err == sql.ErrNoRows {
return nil, nil
} else {
return nil, err
}
}
return photo, nil
}
func (r *albumResolver) SubAlbums(ctx context.Context, obj *models.Album, filter *models.Filter) ([]*models.Album, error) {
filterSQL, err := filter.FormatSQL()
if err != nil {
return nil, err
}
rows, err := r.Database.Query("SELECT * FROM album WHERE parent_album = ?"+filterSQL, obj.AlbumID)
if err != nil {
return nil, err
}

View File

@@ -88,10 +88,11 @@ type Album {
id: ID!
title: String!
photos(filter: Filter): [Photo!]!
subAlbums: [Album!]!
subAlbums(filter: Filter): [Album!]!
parentAlbum: Album
owner: User!
path: String!
thumbnail: Photo
# shares: [ShareToken]
}

View File

@@ -14,16 +14,16 @@ const albumQuery = gql`
album(id: $id) {
id
title
subAlbums(orderBy: title_asc) {
subAlbums(filter: { order_by: "title" }) {
id
title
photos {
thumbnail {
thumbnail {
url
}
}
}
photos(orderBy: title_desc) {
photos(filter: { order_by: "title", order_direction: DESC }) {
id
thumbnail {
url

View File

@@ -6,21 +6,14 @@ import { Query } from 'react-apollo'
const getAlbumsQuery = gql`
query getMyAlbums {
myAlbums(filter: { parentAlbum: null }, orderBy: title_asc) {
myAlbums(filter: { order_by: "title" }) {
id
title
photos(first: 1) {
thumbnail {
thumbnail {
url
}
}
subAlbums(first: 1) {
photos(first: 1) {
thumbnail {
url
}
}
}
}
}
`

View File

@@ -50,17 +50,7 @@ export const AlbumBox = ({ album, customLink, ...props }) => {
)
}
let thumbnail =
album.photos[0] &&
album.photos[0].thumbnail &&
album.photos[0].thumbnail.url
thumbnail =
thumbnail ||
(album.subAlbums &&
album.subAlbums[0] &&
album.subAlbums[0].photos[0] &&
album.subAlbums[0].photos[0].thumbnail.url)
let thumbnail = album.thumbnail && album.thumbnail.thumbnail.url
return (
<AlbumBoxLink {...props} to={customLink || `/album/${album.id}`}>