graphbrainz/src/extensions/cover-art-archive/resolvers.js
Brian Beck f095cd4de7
Modernize dependencies, syntax, imports (#93)
* wip: Modernize dependencies, syntax, imports

* Use final release of ava-nock v2

* Update Travis config

* Remove Node 13 from test matrix

* Replace errorClass with parseErrorMessage in subclasses

* define exports, apply updated lint rules

* Remove markdown eslint plugin

* Update README

* v9.0.0-beta.1

* Add gql tag to exports

* v9.0.0-beta.2

* Bump ava-nock, add test

* Update dataloader loadMany usage

* Add modules note to README

* Add retry option to got calls
2021-04-15 21:34:29 -07:00

75 lines
2.3 KiB
JavaScript

import { resolveLookup } from '../../resolvers.js';
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]);
},
},
};