infrastructure-components
Version:
Infrastructure-Components configure the infrastructure of your React-App as part of your React-Components.
313 lines (311 loc) • 15.4 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const graphql_1 = require("graphql");
const types_1 = __importDefault(require("../types"));
const libs_1 = require("../libs");
const entry_component_1 = require("./entry-component");
const datalayer_libs_1 = require("./datalayer-libs");
exports.DATALAYER_INSTANCE_TYPE = "DataLayerComponent";
;
/**
* identifies a component as a DataLayer
*
* @param component to be tested
*/
function isDataLayer(component) {
return component !== undefined && component.instanceType === exports.DATALAYER_INSTANCE_TYPE;
}
exports.isDataLayer = isDataLayer;
;
exports.default = (props) => {
const componentProps = {
infrastructureType: types_1.default.INFRASTRUCTURE_TYPE_COMPONENT,
instanceType: exports.DATALAYER_INSTANCE_TYPE,
instanceId: props.id
};
//const listEntities = getChildrenArray(props).filter(child => isEntity(child));
//const entries = getChildrenArray(props).filter(child => isEntry(child));
const entries = libs_1.findComponentRecursively(props.children, entry_component_1.isEntry);
const complementedProps = {};
/**
* create the
* @type {{queries: {}, mutations: {}}}
*/
const datalayerProps = {
entries: entries,
mutations: (resolveWithData) => entries.reduce((result, entry) => {
result[entry.getSetMutationName()] = {
args: entry.createEntryArgs(),
type: entry.createEntryType("set_"),
resolve: (source, args, context, info) => {
if (!resolveWithData) {
return entry.id;
}
//console.log("resolve: ", resolveWithData, source, context, info, args);
// This context gets the data from the context put into the <Query/> or Mutation...
//console.log("context: ", context);
const result = entry.setEntry(args, context, process.env.TABLE_NAME, complementedProps["isOffline"]);
//console.log("result: ", result);
return result;
}
};
result[entry.getDeleteMutationName()] = {
args: entry.createEntryArgs(),
type: entry.createEntryType("delete_"),
resolve: (source, args, context, info) => {
if (!resolveWithData) {
return entry.id;
}
//console.log("resolve: ", resolveWithData, source, context, info, args);
// This context gets the data from the context put into the <Query/> or Mutation...
//console.log("context: ", context);
const result = entry.deleteEntry(args, context, process.env.TABLE_NAME, complementedProps["isOffline"]);
//console.log("result: ", result);
return result;
}
};
//console.log("mutation definition: ", result["set_"+entry.id]);
return result;
}, {}),
queries: (resolveWithData) => entries.reduce((result, entry) => {
const listType = entry.createEntryType("list_");
const getType = entry.createEntryType("get_");
//console.log("listType: ", listType);
//console.log("dl-comp-props: ", complementedProps["isOffline"], datalayerProps["isOffline"])
// list all the items, specifying the primaryKey
const inputArgs = {};
inputArgs[entry.primaryKey] = { name: entry.primaryKey, type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) };
result[entry.getPrimaryListQueryName()] = {
args: inputArgs,
type: resolveWithData ? new graphql_1.GraphQLList(listType) : listType,
resolve: (source, args, context, info) => {
//console.log("resolve list: ", resolveWithData, source, args, context, complementedProps["isOffline"]);
if (!resolveWithData) {
return entry.id;
}
return entry.listEntries(args, context, process.env.TABLE_NAME, "pk", complementedProps["isOffline"]);
}
};
// list all the items, specifying the RANGE
const inputRangeArgs = {};
inputRangeArgs[entry.rangeKey] = { name: entry.rangeKey, type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) };
result[entry.getRangeListQueryName()] = {
args: inputRangeArgs,
type: resolveWithData ? new graphql_1.GraphQLList(listType) : listType,
resolve: (source, args, context, info) => {
//console.log("resolve: ", resolveWithData, source, args, context, complementedProps["isOffline"]);
if (!resolveWithData) {
return entry.id;
}
return entry.listEntries(args, context, process.env.TABLE_NAME, "sk", complementedProps["isOffline"]);
}
};
const inputArgsGet = {};
if (entry.primaryKey) {
inputArgsGet[entry.primaryKey] = { name: entry.primaryKey, type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) };
}
if (entry.rangeKey) {
inputArgsGet[entry.rangeKey] = { name: entry.rangeKey, type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) };
}
result[entry.getGetQueryName()] = {
args: inputArgsGet,
type: getType,
resolve: (source, args, context, info) => {
//console.log("resolve: ", resolveWithData, source, args, context);
if (!resolveWithData) {
return entry.id;
}
return entry.getEntry(args, context, process.env.TABLE_NAME, complementedProps["isOffline"]);
}
};
const scanRangeArgs = {};
scanRangeArgs[`start_${entry.rangeKey}`] = { name: `start_${entry.rangeKey}`, type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) };
scanRangeArgs[`end_${entry.rangeKey}`] = { name: `end_${entry.rangeKey}`, type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) };
// scan the table
result[entry.getRangeScanName()] = {
args: scanRangeArgs,
type: resolveWithData ? new graphql_1.GraphQLList(listType) : listType,
resolve: (source, args, context, info) => {
//console.log("resolve scan: ", resolveWithData, source, args, context);
if (!resolveWithData) {
return entry.id;
}
return entry.scan(args, context, process.env.TABLE_NAME, "sk", complementedProps["isOffline"]);
}
};
const scanPrimaryArgs = {};
scanPrimaryArgs[`start_${entry.primaryKey}`] = { name: `start_${entry.primaryKey}`, type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) };
scanPrimaryArgs[`end_${entry.primaryKey}`] = { name: `end_${entry.primaryKey}`, type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) };
// scan the table
result[entry.getPrimaryScanName()] = {
args: scanPrimaryArgs,
type: resolveWithData ? new graphql_1.GraphQLList(listType) : listType,
resolve: (source, args, context, info) => {
//console.log("resolve scan: ", resolveWithData, source, args, context);
if (!resolveWithData) {
return entry.id;
}
return entry.scan(args, context, process.env.TABLE_NAME, "pk", complementedProps["isOffline"]);
}
};
const scanAllArgs = { scanall: { name: "scanall", type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) } };
// scan the table
result[entry.getScanName()] = {
args: scanAllArgs,
type: resolveWithData ? new graphql_1.GraphQLList(listType) : listType,
resolve: (source, args, context, info) => {
//console.log("resolve scan: ", resolveWithData, source, args, context);
if (!resolveWithData) {
return entry.id;
}
return entry.scan(args, context, process.env.TABLE_NAME, "pk", complementedProps["isOffline"]);
}
};
return result;
}, {}),
/*
getEntryDataFields: (entryId) => {
const entry = entries.find(entry => entry.id === entryId);
if (entry !== undefined) {
return entry.createEntryFields()
};
console.warn("could not find entry: ",entryId);
return {};
},*/
// TODO forward this request to the Entry and let the entry handle the whole request!
getEntryListQuery: (entryId, dictKey) => {
const entry = entries.find(entry => entry.id === entryId);
if (entry !== undefined) {
return entry.getEntryListQuery(dictKey);
}
;
console.warn("could not find entry: ", entryId);
return {};
/*
const fields = datalayerProps.getEntryDataFields(entryId);
//console.log("fields: ", fields);
return getEntryListQuery(
entryId,
dictKey,
fields
);*/
},
getEntryQuery: (entryId, dictKey) => {
const entry = entries.find(entry => entry.id === entryId);
if (entry !== undefined) {
return entry.getEntryQuery(dictKey);
}
;
console.warn("could not find entry: ", entryId);
return {};
},
getEntryScanQuery: (entryId, dictKey) => {
const entry = entries.find(entry => entry.id === entryId);
if (entry !== undefined) {
return entry.getEntryScanQuery(dictKey);
}
;
console.warn("could not find entry: ", entryId);
return {};
},
setEntryMutation: (entryId, values) => {
const entry = entries.find(entry => entry.id === entryId);
if (entry !== undefined) {
return entry.setEntryMutation(values);
}
;
console.warn("could not find entry: ", entryId);
return {};
},
deleteEntryMutation: (entryId, values) => {
const entry = entries.find(entry => entry.id === entryId);
if (entry !== undefined) {
return entry.deleteEntryMutation(values);
}
;
console.warn("could not find entry: ", entryId);
return {};
},
updateEntryQuery: (entryId, fDictKey) => {
//console.log("updateEntryQuery: ", entryId);
return {
entryId: entryId,
getEntryQuery: () => datalayerProps.getEntryQuery(entryId, fDictKey({})),
setEntryMutation: (oldData) => datalayerProps.setEntryMutation(entryId, fDictKey(oldData)),
};
},
setClient: (client) => {
complementedProps["client"] = client;
},
setOffline: (offline) => {
complementedProps["isOffline"] = offline;
// provide offline flags to children (esp. to Auth)
libs_1.findComponentRecursively(props.children, (child) => child.setIsOffline !== undefined).forEach(child => {
child.setIsOffline(offline);
});
}
};
const schemaProps = {
getSchema: (resolveWithData) => new graphql_1.GraphQLSchema({
query: new graphql_1.GraphQLObjectType({
name: 'RootQueryType',
fields: datalayerProps.queries(resolveWithData)
}), mutation: new graphql_1.GraphQLObjectType({
name: 'RootMutationType',
fields: datalayerProps.mutations(resolveWithData)
})
})
};
// we need to provide the DataLayerId to webApps, these may be anywhere in the tree, not
// only direct children. So rather than mapping the children, we need to change them
libs_1.findComponentRecursively(props.children, (child) => child.setDataLayerId !== undefined).forEach(child => {
child.setDataLayerId(props.id);
});
libs_1.findComponentRecursively(props.children, (child) => child.setStoreData !== undefined).forEach(child => {
child.setStoreData(function (pkEntity, pkVal, skEntity, skVal, jsonData) {
return __awaiter(this, void 0, void 0, function* () {
return yield datalayer_libs_1.setEntry(process.env.TABLE_NAME, //"code-architect-dev-data-layer",
pkEntity, // schema.Entry.ENTITY, //pkEntity
pkVal, // pkId
skEntity, //schema.Data.ENTITY, // skEntity
skVal, // skId
jsonData, // jsonData
complementedProps["isOffline"]);
});
});
child.setGetData(function (pkEntity, pkVal, skEntity, skVal) {
return __awaiter(this, void 0, void 0, function* () {
if (pkVal !== undefined) {
return yield datalayer_libs_1.ddbGetEntry(process.env.TABLE_NAME, //"code-architect-dev-data-layer",
pkEntity, // schema.Entry.ENTITY, //pkEntity
pkVal, // pkId
skEntity, //schema.Data.ENTITY, // skEntity
skVal, // skId
complementedProps["isOffline"]);
}
else {
return datalayer_libs_1.ddbListEntries(process.env.TABLE_NAME, //tableName
"sk", //key
skEntity, // entity
skVal, //value,
pkEntity, // rangeEntity
complementedProps["isOffline"]);
}
});
});
});
return Object.assign({}, props, componentProps, datalayerProps, schemaProps, complementedProps);
};
//# sourceMappingURL=datalayer-component.js.map
;