UNPKG

@unly/ra-data-graphql-prisma

Version:
283 lines 14.9 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var get_1 = __importDefault(require("lodash/get")); var isDate_1 = __importDefault(require("lodash/isDate")); var isObject_1 = __importDefault(require("lodash/isObject")); var ra_core_1 = require("ra-core"); var mutations_1 = require("./constants/mutations"); var computeAddRemoveUpdate_1 = require("./utils/computeAddRemoveUpdate"); var getFinalType_1 = __importDefault(require("./utils/getFinalType")); var buildGetListVariables = function (introspectionResults) { return function (resource, aorFetchType, params) { var filter = Object.keys(params.filter).reduce(function (acc, key) { var _a, _b, _c, _d, _e, _f, _g; if (key === 'ids') { return __assign(__assign({}, acc), { id_in: params.filter[key] }); } if (Array.isArray(params.filter[key])) { var type = introspectionResults.types.find(function (t) { return t.name === resource.type.name + "WhereInput"; }); var inputField = type.inputFields.find(function (t) { return t.name === key; }); if (!!inputField) { return __assign(__assign({}, acc), (_a = {}, _a[key] = { id_in: params.filter[key] }, _a)); } } if (isObject_1.default(params.filter[key])) { var type = introspectionResults.types.find(function (t) { return t.name === resource.type.name + "WhereInput"; }); var filterSome = type.inputFields.find(function (t) { return t.name === key + "_some"; }); if (filterSome) { var filter_1 = Object.keys(params.filter[key]).reduce(function (acc, k) { var _a; return (__assign(__assign({}, acc), (_a = {}, _a[k + "_in"] = params.filter[key][k], _a))); }, {}); return __assign(__assign({}, acc), (_b = {}, _b[key + "_some"] = filter_1, _b)); } } var parts = key.split('.'); if (parts.length > 1) { if (parts[1] == 'id') { var type = introspectionResults.types.find(function (t) { return t.name === resource.type.name + "WhereInput"; }); var filterSome = type.inputFields.find(function (t) { return t.name === parts[0] + "_some"; }); if (filterSome) { return __assign(__assign({}, acc), (_c = {}, _c[parts[0] + "_some"] = { id: params.filter[key] }, _c)); } return __assign(__assign({}, acc), (_d = {}, _d[parts[0]] = { id: params.filter[key] }, _d)); } var resourceField = resource.type.fields.find(function (f) { return f.name === parts[0]; }); if (resourceField.type.name === 'Int') { return __assign(__assign({}, acc), (_e = {}, _e[key] = parseInt(params.filter[key]), _e)); } if (resourceField.type.name === 'Float') { return __assign(__assign({}, acc), (_f = {}, _f[key] = parseFloat(params.filter[key]), _f)); } } return __assign(__assign({}, acc), (_g = {}, _g[key] = params.filter[key], _g)); }, {}); return { skip: (params.pagination.page - 1) * params.pagination.perPage, first: params.pagination.perPage, orderBy: params.sort.field + "_" + params.sort.order, where: filter, }; }; }; var findInputFieldForType = function (introspectionResults, typeName, field) { var type = introspectionResults.types.find(function (t) { return t.name === typeName; }); if (!type) { return null; } var inputFieldType = type.inputFields.find(function (t) { return t.name === field; }); return !!inputFieldType ? getFinalType_1.default(inputFieldType.type) : null; }; var inputFieldExistsForType = function (introspectionResults, typeName, field) { return !!findInputFieldForType(introspectionResults, typeName, field); }; var buildReferenceField = function (_a) { var inputArg = _a.inputArg, introspectionResults = _a.introspectionResults, typeName = _a.typeName, field = _a.field, mutationType = _a.mutationType; var inputType = findInputFieldForType(introspectionResults, typeName, field); var mutationInputType = findInputFieldForType(introspectionResults, inputType.name, mutationType); return Object.keys(inputArg).reduce(function (acc, key) { var _a; if (!mutationInputType) { console.error("Couldn't find a GraphQL mutation type of type \"" + mutationType + "\" for \"" + (inputType === null || inputType === void 0 ? void 0 : inputType.name) + "\" input type through introspection. Field \"" + field + "\" has been ignored."); return acc; } return ((Object.keys(acc).length === 0) && inputFieldExistsForType(introspectionResults, mutationInputType.name, key)) ? __assign(__assign({}, acc), (_a = {}, _a[key] = inputArg[key], _a)) : acc; }, {}); }; var buildUpdateVariables = function (introspectionResults) { return function (resource, aorFetchType, params, fieldAliasResolver) { return Object.keys(params.data).reduce(function (acc, fieldName) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; var value = params.data[fieldName]; var previousValue = params.previousData[fieldName]; if (Array.isArray(value)) { if (/Ids$/.test(fieldName)) { previousValue = params.previousData[fieldName].map(function (id) { return ({ id: id }); }); fieldName = fieldName.replace(/Ids$/, ''); value = value.map(function (id) { return ({ id: id }); }); } var inputType = findInputFieldForType(introspectionResults, resource.type.name + "UpdateInput", fieldName); if (!inputType) { return acc; } var hasConnectMethod = findInputFieldForType(introspectionResults, inputType.name, 'connect'); if (!hasConnectMethod) { return __assign(__assign({}, acc), { data: __assign(__assign({}, acc.data), (_a = {}, _a[fieldName] = (_b = {}, _b[mutations_1.PRISMA_SET] = value, _b), _a)) }); } var _k = computeAddRemoveUpdate_1.computeFieldsToAddRemoveUpdate(previousValue, value), fieldsToAdd = _k.fieldsToAdd, fieldsToRemove = _k.fieldsToRemove; return __assign(__assign({}, acc), { data: __assign(__assign({}, acc.data), (_c = {}, _c[fieldName] = (_d = {}, _d[mutations_1.PRISMA_CONNECT] = fieldsToAdd, _d[mutations_1.PRISMA_DISCONNECT] = fieldsToRemove, _d), _c)) }); } if (isObject_1.default(value) && !isDate_1.default(value)) { var fieldsToConnect = buildReferenceField({ inputArg: value, introspectionResults: introspectionResults, typeName: resource.type.name + "UpdateInput", field: fieldName, mutationType: mutations_1.PRISMA_CONNECT, }); var fieldsToUpdate_1 = buildReferenceField({ inputArg: value, introspectionResults: introspectionResults, typeName: resource.type.name + "UpdateInput", field: fieldName, mutationType: mutations_1.PRISMA_UPDATE, }); if (Object.keys(fieldsToConnect).length === 0) { if (Object.keys(fieldsToUpdate_1).length === 0) { return acc; } else { fieldsToUpdate_1 = Object.keys(fieldsToUpdate_1).reduce(function (subAcc, subFieldName) { var _a, _b, _c; var subValue = fieldsToUpdate_1[subFieldName]; if (isObject_1.default(subValue) && !isDate_1.default(subValue)) { var nestedId = get_1.default(subValue, 'id'); if (typeof nestedId === 'string') { return __assign(__assign({}, subAcc), (_a = {}, _a[subFieldName] = (_b = {}, _b[mutations_1.PRISMA_CONNECT] = { id: nestedId }, _b), _a)); } } return __assign(__assign({}, subAcc), (_c = {}, _c[subFieldName] = subValue, _c)); }, {}); return __assign(__assign({}, acc), { data: __assign(__assign({}, acc.data), (_e = {}, _e[fieldName] = (_f = {}, _f[mutations_1.PRISMA_UPDATE] = __assign({}, fieldsToUpdate_1), _f), _e)) }); } } else { return __assign(__assign({}, acc), { data: __assign(__assign({}, acc.data), (_g = {}, _g[fieldName] = (_h = {}, _h[mutations_1.PRISMA_CONNECT] = __assign({}, fieldsToConnect), _h), _g)) }); } } if (fieldName === 'id' && value) { return __assign(__assign({}, acc), { where: { id: value, } }); } var type = introspectionResults.types.find(function (t) { return t.name === resource.type.name; }); var field = type.fields.find(function (t) { return t.name === fieldName; }); if (!field) { if (typeof field === 'undefined' && fieldAliasResolver) { field = resource.type.fields.find(function (field) { return field.name === fieldAliasResolver(field, fieldName, acc, introspectionResults); }); } } if (field) { return __assign(__assign({}, acc), { data: __assign(__assign({}, acc.data), (_j = {}, _j[fieldName] = value, _j)) }); } return acc; }, {}); }; }; var buildCreateVariables = function (introspectionResults) { return function (resource, aorFetchType, params, fieldAliasResolver) { return Object.keys(params.data).reduce(function (acc, fieldName) { var _a, _b, _c, _d, _e, _f, _g; var data = params.data[fieldName]; if (Array.isArray(data)) { if (/Ids$/.test(fieldName)) { fieldName = fieldName.replace(/Ids$/, ''); data = data.map(function (id) { return ({ id: id }); }); } var entryIsObject = data.some(function (entry) { return isObject_1.default(entry) && !isDate_1.default(entry); }); if (entryIsObject) { data = data.map(function (entry) { return Object.keys(entry) .reduce(function (obj, key) { if (key === 'id') { obj[key] = entry[key]; } return obj; }, {}); }); } var inputType = findInputFieldForType(introspectionResults, resource.type.name + "CreateInput", fieldName); if (!inputType) { return acc; } var hasSetMethod = findInputFieldForType(introspectionResults, inputType.name, 'set'); if (hasSetMethod) { return __assign(__assign({}, acc), { data: __assign(__assign({}, acc.data), (_a = {}, _a[fieldName] = (_b = {}, _b[mutations_1.PRISMA_SET] = data, _b), _a)) }); } return __assign(__assign({}, acc), { data: __assign(__assign({}, acc.data), (_c = {}, _c[fieldName] = (_d = {}, _d[mutations_1.PRISMA_CONNECT] = data, _d), _c)) }); } if (isObject_1.default(data) && !isDate_1.default(data)) { var fieldsToConnect = buildReferenceField({ inputArg: data, introspectionResults: introspectionResults, typeName: resource.type.name + "CreateInput", field: fieldName, mutationType: mutations_1.PRISMA_CONNECT, }); if (Object.keys(fieldsToConnect).length === 0) { return acc; } return __assign(__assign({}, acc), { data: __assign(__assign({}, acc.data), (_e = {}, _e[fieldName] = (_f = {}, _f[mutations_1.PRISMA_CONNECT] = __assign({}, fieldsToConnect), _f), _e)) }); } if (fieldName === 'id' && params.data[fieldName]) { return __assign(__assign({}, acc), { where: { id: params.data[fieldName], } }); } var type = introspectionResults.types.find(function (t) { return t.name === resource.type.name; }); var field = type.fields.find(function (t) { return t.name === fieldName; }); if (!field) { if (typeof field === 'undefined' && fieldAliasResolver) { field = resource.type.fields.find(function (field) { return field.name === fieldAliasResolver(field, fieldName, acc, introspectionResults); }); } } if (field) { return __assign(__assign({}, acc), { data: __assign(__assign({}, acc.data), (_g = {}, _g[fieldName] = data, _g)) }); } return acc; }, {}); }; }; exports.default = (function (introspectionResults) { return function (resource, aorFetchType, params, fieldAliasResolver) { var _a; switch (aorFetchType) { case ra_core_1.GET_LIST: { return buildGetListVariables(introspectionResults)(resource, aorFetchType, params); } case ra_core_1.GET_MANY: return { where: { id_in: params.ids }, }; case ra_core_1.GET_MANY_REFERENCE: { var parts = params.target.split('.'); return { where: (_a = {}, _a[parts[0]] = { id: params.id }, _a), }; } case ra_core_1.GET_ONE: return { where: { id: params.id }, }; case ra_core_1.UPDATE: { return buildUpdateVariables(introspectionResults)(resource, aorFetchType, params, fieldAliasResolver); } case ra_core_1.CREATE: { return buildCreateVariables(introspectionResults)(resource, aorFetchType, params, fieldAliasResolver); } case ra_core_1.DELETE: return { where: { id: params.id }, }; } }; }); //# sourceMappingURL=buildVariables.js.map