graphbrainz/src/extensions/cover-art-archive/resolvers.js

75 lines
2.2 KiB
JavaScript

import { resolveLookup } from '../../resolvers'
const SIZES = new Map([
[null, null],
[250, 250],
[500, 500],
['FULL', null],
['SMALL', 250],
['LARGE', 500]
])
function resolveImage(coverArt, args, { loaders }, info) {
// Since migrating the schema to an extension, we lost custom enum values
// for the time being. Translate any incoming `size` arg to the old enum
// values.
const size = SIZES.get(args.size)
// Field should be `front` or `back`.
const field = info.fieldName
if (coverArt.images) {
const matches = coverArt.images.filter(image => image[field])
if (!matches.length) {
return null
} else if (matches.length === 1) {
const match = matches[0]
if (size === 250) {
return match.thumbnails.small
} else if (size === 500) {
return match.thumbnails.large
} else {
return match.image
}
}
}
const entityType = coverArt._entityType
const id = coverArt._id
const releaseID = coverArt._releaseID
if (entityType === 'release-group' && field === 'front') {
// Release groups only have an endpoint to retrieve the front image.
// If someone requests the back of a release group, return the back of the
// release that the release group's cover art response points to.
return loaders.coverArtArchiveURL.load(['release-group', id, field, size])
} else {
return loaders.coverArtArchiveURL.load(['release', releaseID, field, size])
}
}
export default {
CoverArtArchiveImage: {
fileID: image => image.id
},
CoverArtArchiveRelease: {
front: resolveImage,
back: resolveImage,
images: coverArt => coverArt.images,
artwork: coverArt => coverArt.images.length > 0,
count: coverArt => coverArt.images.length,
release: (coverArt, args, context, info) => {
const mbid = coverArt._releaseID
if (mbid) {
return resolveLookup(coverArt, { mbid }, context, info)
}
return null
}
},
Release: {
coverArtArchive: (release, args, { loaders }) => {
return loaders.coverArtArchive.load(['release', release.id])
}
},
ReleaseGroup: {
coverArtArchive: (releaseGroup, args, { loaders }) => {
return loaders.coverArtArchive.load(['release-group', releaseGroup.id])
}
}
}