@unly/ra-data-graphql-prisma
Version:
A react-admin data provider for Prisma Server
283 lines • 14.9 kB
JavaScript
"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