UNPKG

10.8 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _promise = require('babel-runtime/core-js/promise');
8
9var _promise2 = _interopRequireDefault(_promise);
10
11var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
12
13var _defineProperty3 = _interopRequireDefault(_defineProperty2);
14
15var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
16
17var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
18
19var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
20
21var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
22
23var _extends3 = require('babel-runtime/helpers/extends');
24
25var _extends4 = _interopRequireDefault(_extends3);
26
27var _keys = require('babel-runtime/core-js/object/keys');
28
29var _keys2 = _interopRequireDefault(_keys);
30
31exports.includeRelationships = includeRelationships;
32exports.includeSubqueries = includeSubqueries;
33exports.resolveLookup = resolveLookup;
34exports.resolveBrowse = resolveBrowse;
35exports.resolveSearch = resolveSearch;
36exports.resolveRelationship = resolveRelationship;
37exports.resolveLinked = resolveLinked;
38exports.createSubqueryResolver = createSubqueryResolver;
39exports.resolveDiscReleases = resolveDiscReleases;
40
41var _helpers = require('./types/helpers');
42
43var _graphqlRelay = require('graphql-relay');
44
45var _util = require('./util');
46
47function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
48
49function includeRelationships(params, info) {
50 var fragments = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : info.fragments;
51
52 var fields = (0, _util.getFields)(info, fragments);
53 if (info.fieldName !== 'relationships') {
54 if (fields.relationships) {
55 fields = (0, _util.getFields)(fields.relationships, fragments);
56 } else {
57 if (fields.edges) {
58 fields = (0, _util.getFields)(fields.edges, fragments);
59 if (fields.node) {
60 return includeRelationships(params, fields.node, fragments);
61 }
62 }
63 return params;
64 }
65 }
66 if (fields) {
67 var relationships = (0, _keys2.default)(fields);
68 var includeRels = relationships.map(function (field) {
69 return (0, _helpers.toDashed)((0, _helpers.toSingular)(field)) + '-rels';
70 });
71 if (includeRels.length) {
72 params = (0, _extends4.default)({}, params, {
73 inc: (0, _util.extendIncludes)(params.inc, includeRels)
74 });
75 }
76 }
77 return params;
78}
79
80function includeSubqueries(params, info) {
81 var fragments = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : info.fragments;
82
83 var subqueryIncludes = {
84 aliases: ['aliases'],
85 artistCredit: ['artist-credits'],
86 artistCredits: ['artist-credits'],
87 isrcs: ['isrcs'],
88 media: ['media', 'discids'],
89 rating: ['ratings'],
90 tags: ['tags']
91 };
92 var fields = (0, _util.getFields)(info, fragments);
93 var include = [];
94 for (var key in subqueryIncludes) {
95 if (fields[key]) {
96 var value = subqueryIncludes[key];
97 include.push.apply(include, (0, _toConsumableArray3.default)(value));
98 }
99 }
100 params = (0, _extends4.default)({}, params, {
101 inc: (0, _util.extendIncludes)(params.inc, include)
102 });
103 if (fields.edges) {
104 fields = (0, _util.getFields)(fields.edges, fragments);
105 if (fields.node) {
106 params = includeSubqueries(params, fields.node, fragments);
107 }
108 }
109 return params;
110}
111
112function resolveLookup(root, _ref, _ref2, info) {
113 var mbid = _ref.mbid,
114 params = (0, _objectWithoutProperties3.default)(_ref, ['mbid']);
115 var loaders = _ref2.loaders;
116
117 if (!mbid && !params.resource) {
118 throw new Error('Lookups by a field other than MBID must provide: resource');
119 }
120 var entityType = (0, _helpers.toDashed)(info.fieldName);
121 params = includeSubqueries(params, info);
122 params = includeRelationships(params, info);
123 return loaders.lookup.load([entityType, mbid, params]);
124}
125
126function resolveBrowse(root, _ref3, _ref4, info) {
127 var first = _ref3.first,
128 after = _ref3.after,
129 _ref3$type = _ref3.type,
130 type = _ref3$type === undefined ? [] : _ref3$type,
131 _ref3$status = _ref3.status,
132 status = _ref3$status === undefined ? [] : _ref3$status,
133 discID = _ref3.discID,
134 isrc = _ref3.isrc,
135 iswc = _ref3.iswc,
136 args = (0, _objectWithoutProperties3.default)(_ref3, ['first', 'after', 'type', 'status', 'discID', 'isrc', 'iswc']);
137 var loaders = _ref4.loaders;
138
139 var pluralName = (0, _helpers.toDashed)(info.fieldName);
140 var singularName = (0, _helpers.toSingular)(pluralName);
141 var params = (0, _extends4.default)({}, args, {
142 type: type,
143 status: status,
144 limit: first,
145 offset: (0, _graphqlRelay.getOffsetWithDefault)(after, -1) + 1 || undefined
146 });
147 params = includeSubqueries(params, info);
148 params = includeRelationships(params, info, info.fragments);
149 var formatParam = function formatParam(value) {
150 return value.toLowerCase().replace(/ /g, '');
151 };
152 params.type = params.type.map(formatParam);
153 params.status = params.status.map(formatParam);
154 var request = void 0;
155 if (discID) {
156 request = loaders.lookup.load(['discid', discID, params]);
157 // If fetching releases by disc ID, they will already include the `media`
158 // and `discids` subqueries, and it is invalid to specify them.
159 if (params.inc) {
160 params.inc = params.inc.filter(function (value) {
161 return value !== 'media' && value !== 'discids';
162 });
163 }
164 } else if (isrc) {
165 request = loaders.lookup.load(['isrc', isrc, params]);
166 } else if (iswc) {
167 request = loaders.lookup.load(['iswc', iswc, params]);
168 } else {
169 request = loaders.browse.load([singularName, params]);
170 }
171 return request.then(function (list) {
172 // Grab the list, offet, and count from the response and use them to build
173 // a Relay connection object.
174 var arraySlice = list[pluralName],
175 _list$ = list[singularName + '-offset'],
176 sliceStart = _list$ === undefined ? 0 : _list$,
177 _list$2 = list[singularName + '-count'],
178 arrayLength = _list$2 === undefined ? arraySlice.length : _list$2;
179
180 var meta = { sliceStart: sliceStart, arrayLength: arrayLength };
181 var connection = (0, _graphqlRelay.connectionFromArraySlice)(arraySlice, { first: first, after: after }, meta);
182 return (0, _extends4.default)({
183 nodes: connection.edges.map(function (edge) {
184 return edge.node;
185 }),
186 totalCount: arrayLength
187 }, connection);
188 });
189}
190
191function resolveSearch(root, _ref5, _ref6, info) {
192 var after = _ref5.after,
193 first = _ref5.first,
194 query = _ref5.query,
195 args = (0, _objectWithoutProperties3.default)(_ref5, ['after', 'first', 'query']);
196 var loaders = _ref6.loaders;
197
198 var pluralName = (0, _helpers.toDashed)(info.fieldName);
199 var singularName = (0, _helpers.toSingular)(pluralName);
200 var params = (0, _extends4.default)({}, args, {
201 limit: first,
202 offset: (0, _graphqlRelay.getOffsetWithDefault)(after, -1) + 1 || undefined
203 });
204 params = includeSubqueries(params, info);
205 return loaders.search.load([singularName, query, params]).then(function (list) {
206 var arraySlice = list[pluralName],
207 sliceStart = list.offset,
208 arrayLength = list.count;
209
210 var meta = { sliceStart: sliceStart, arrayLength: arrayLength };
211 var connection = (0, _graphqlRelay.connectionFromArraySlice)(arraySlice, { first: first, after: after }, meta);
212 // Move the `score` field up to the edge object and make sure it's a
213 // number (MusicBrainz returns a string).
214 var edges = connection.edges.map(function (edge) {
215 return (0, _extends4.default)({}, edge, { score: +edge.node.score });
216 });
217 var connectionWithExtras = (0, _extends4.default)({
218 nodes: edges.map(function (edge) {
219 return edge.node;
220 }),
221 totalCount: arrayLength
222 }, connection, {
223 edges: edges
224 });
225 return connectionWithExtras;
226 });
227}
228
229function resolveRelationship(rels, args, context, info) {
230 var targetType = (0, _helpers.toDashed)((0, _helpers.toSingular)(info.fieldName)).replace('-', '_');
231 var matches = rels.filter(function (rel) {
232 return rel['target-type'] === targetType;
233 });
234 // There's no way to filter these at the API level, so do it here.
235 if (args.direction != null) {
236 matches = matches.filter(function (rel) {
237 return rel.direction === args.direction;
238 });
239 }
240 if (args.type != null) {
241 matches = matches.filter(function (rel) {
242 return rel.type === args.type;
243 });
244 }
245 if (args.typeID != null) {
246 matches = matches.filter(function (rel) {
247 return rel['type-id'] === args.typeID;
248 });
249 }
250 var connection = (0, _graphqlRelay.connectionFromArray)(matches, args);
251 return (0, _extends4.default)({
252 nodes: connection.edges.map(function (edge) {
253 return edge.node;
254 }),
255 totalCount: matches.length
256 }, connection);
257}
258
259function resolveLinked(entity, args, context, info) {
260 var parentEntity = (0, _helpers.toDashed)(info.parentType.name);
261 args = (0, _extends4.default)({}, args, (0, _defineProperty3.default)({}, parentEntity, entity.id));
262 return resolveBrowse(entity, args, context, info);
263}
264
265/**
266 * If we weren't smart enough or weren't able to include the `inc` parameter
267 * for a particular field that's being requested, make another request to grab
268 * it (after making sure it isn't already available).
269 */
270function createSubqueryResolver() {
271 var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
272 inc = _ref7.inc,
273 key = _ref7.key;
274
275 var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (value) {
276 return value;
277 };
278
279 return function (entity, args, _ref8, info) {
280 var loaders = _ref8.loaders;
281
282 key = key || (0, _helpers.toDashed)(info.fieldName);
283 var promise = void 0;
284 if (key in entity) {
285 promise = _promise2.default.resolve(entity);
286 } else {
287 var entityType = entity._type,
288 id = entity.id;
289
290 var params = { inc: [inc || key] };
291 promise = loaders.lookup.load([entityType, id, params]);
292 }
293 return promise.then(function (entity) {
294 return handler(entity[key], args);
295 });
296 };
297}
298
299function resolveDiscReleases(disc, args, context, info) {
300 var releases = disc.releases;
301
302 if (releases != null) {
303 var connection = (0, _graphqlRelay.connectionFromArray)(releases, args);
304 return (0, _extends4.default)({
305 nodes: connection.edges.map(function (edge) {
306 return edge.node;
307 }),
308 totalCount: releases.length
309 }, connection);
310 }
311 args = (0, _extends4.default)({}, args, { discID: disc.id });
312 return resolveBrowse(disc, args, context, info);
313}
\No newline at end of file