infrastructure-components
Version:
Infrastructure-Components configure the infrastructure of your React-App as part of your React-Components.
233 lines (213 loc) • 8.49 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const types_1 = __importDefault(require("../types"));
const entry_component_1 = require("../datalayer/entry-component");
const auth_middleware_1 = require("./auth-middleware");
const middleware_component_1 = __importDefault(require("../middleware/middleware-component"));
const connect_sequence_1 = __importDefault(require("connect-sequence"));
const datalayer_libs_1 = require("../datalayer/datalayer-libs");
/**
* an entry specifies a kind of data that can be stored in a line of the table
*/
exports.default = (props) => {
// the component must have the properties of IComponent
const componentProps = {
infrastructureType: types_1.default.INFRASTRUCTURE_TYPE_COMPONENT,
instanceType: entry_component_1.ENTRY_INSTANCE_TYPE,
instanceId: props.id
};
const mwProps = {
middleware: middleware_component_1.default({ callback: (req, res, next) => {
console.log("this is the default mw of the SecuredEntry: ", props.id);
if (securedEntryProps.externalMiddleware) {
console.log("now using the provided middleware");
return new connect_sequence_1.default(req, res, next)
.append(securedEntryProps.externalMiddleware.callback)
.run();
}
return next();
} })
};
const securedEntryProps = {
//origRangeKey: props.rangeKey,
setUserId: (userId) => {
console.log(props.id, " received userId: ", userId);
securedEntryProps.userId = userId;
//props.rangeKey = IC_USER_ID
},
/**
* We MUST NOT OVERWRITE exisiting functions, only data. middleware is a function
* because they get not called
*/
// the authentication-component replaces the middleware!
setMiddleware: (mw) => {
console.log(props.id, " received middleware: ", mw);
securedEntryProps.externalMiddleware = mw;
}
};
const entryProps = entry_component_1.createEntryProps(Object.assign({}, props, componentProps, securedEntryProps));
const setUserIdFromContext = (context) => {
//console.log("check userId? ", entryProps, props, securedEntryProps)
// when called through ssr, we do not get the userId through the ICs. But the DataLayer-Integration puts
// it into the context for us
if (securedEntryProps && securedEntryProps.userId) {
console.log("SecuredEntry already has userId, not taking from context: ", securedEntryProps.userId);
return;
}
if (context && context.userId) {
if (securedEntryProps) {
securedEntryProps["userId"] = context["userId"];
}
else {
console.error("no entryProps exist, cannot set userId");
}
return;
}
console.warn("no userId in context or in entryProps...");
};
return Object.assign(entryProps, {
// we need to adjust the writing into the table
setEntry: (args, context, tableName, isOffline) => {
setUserIdFromContext(context);
return datalayer_libs_1.setEntry(tableName, //"code-architect-dev-data-layer",
props.primaryKey, // schema.Entry.ENTITY, //pkEntity
args[props.primaryKey], // pkId
auth_middleware_1.IC_USER_ID, //schema.Data.ENTITY, // skEntity
`${securedEntryProps.userId}|${props.rangeKey}|${args[props.rangeKey]}`, // skId
Object.keys(args).reduce((result, key) => {
if (Object.keys(props.data).find(datakey => datakey === key) !== undefined) {
result[key] = args[key];
}
return result;
}, {}), // jsonData,
isOffline);
},
deleteEntry: (args, context, tableName, isOffline) => {
setUserIdFromContext(context);
return datalayer_libs_1.deleteEntry(tableName, //"code-architect-dev-data-layer",
props.primaryKey, // schema.Entry.ENTITY, //pkEntity
args[props.primaryKey], // pkId
auth_middleware_1.IC_USER_ID, //schema.Data.ENTITY, // skEntity
`${securedEntryProps.userId}|${props.rangeKey}|${args[props.rangeKey]}`, // skId
isOffline);
},
listEntries: (args, context, tableName, key, isOffline) => {
setUserIdFromContext(context);
const entity = key === "pk" ? props.primaryKey : `${auth_middleware_1.IC_USER_ID}|${securedEntryProps.userId}|${props.rangeKey}`;
const range = key === "pk" ? `${auth_middleware_1.IC_USER_ID}|${securedEntryProps.userId}|${props.rangeKey}` : props.primaryKey;
return datalayer_libs_1.ddbListEntries(tableName, //tablename
key, // key
entity, //entity
args[key === "pk" ? props.primaryKey : props.rangeKey], //value
range, //rangeEntity
isOffline).then(results => {
console.log("promised: ", results);
return results.map(item => {
const data = item.jsonData !== undefined ? JSON.parse(item.jsonData) : {};
data[props.primaryKey] = item.pk.substring(item.pk.lastIndexOf("|") + 1);
data[props.rangeKey] = item.sk.substring(item.sk.lastIndexOf("|") + 1);
return data;
});
});
},
}, mwProps);
// we provide the newly set middleware as last prop to overwrite the other values!
};
exports.isSecuredEntry = (component) => {
return component !== undefined && component.instanceType === entry_component_1.ENTRY_INSTANCE_TYPE;
};
const complementedProps = {
/*
createEntryFields: () => {
const fields = Object.keys(props.data).reduce((result, key)=> {
if (key !== securedEntryProps.origRangeKey) {
result[key] = {type: props.data[key]};
}
return result;
}, {});
fields[props.primaryKey] = {type: GraphQLString};
fields[IC_USER_ID] = {type: GraphQLString};
return fields;
},
createEntryType: (prefix) => {
return new GraphQLObjectType({
name: prefix+props.id,
fields: () => complementedProps.createEntryFields()
})
},
createKeyArgs: () => {
const args = {};
args[props.primaryKey] = {name: props.primaryKey, type: GraphQLString};
args[IC_USER_ID] = {name: IC_USER_ID, type: GraphQLString};
return args;
},* /
getEntryListQuery: (dictKey) => {
const fields = entryProps.createEntryFields();
//console.log("fields: ", fields);
return getEntryListQuery(
props.id,
dictKey,
fields,
{
userId: securedEntryProps.userId
} //context
);
},
setEntryMutation: (values) => {
const fields = entryProps.createEntryFields();
//console.log("fields: ", fields);
return setEntryMutation(
props.id,
values,
fields,
{
userId: securedEntryProps.userId
} //context
);
},
/*
// let's overwrite how the user can get the
getEntryListQuery: (dictKey) => {
const fields = complementedProps.createEntryFields();
//console.log("fields: ", fields);
// TODO, complement dictKey or even change the whole query ...
return getEntryListQuery(
props.id,
Object.keys(dictKey).reduce((res, key) => {
// we replace the rangeKey with the
if (key === securedEntryProps.origRangeKey) {
res[props.rangeKey] = `${securedEntryProps.clientId}|${securedEntryProps.origRangeKey}|${dictKey[key]}`
} else {
res[key] = dictKey[key];
}
return res;
}, {}),
fields
);
},
// this creates the input for the gql-tag: how the query is sent to apollo
setEntryMutation: (values) => {
const fields = complementedProps.createEntryFields();
return setEntryMutation(
props.id,
Object.keys(values).reduce((res, key) => {
// we replace the rangeKey with the
if (key === securedEntryProps.origRangeKey) {
res[props.rangeKey] = `${securedEntryProps.clientId}|${securedEntryProps.origRangeKey}|${values[key]}`
} else {
res[key] = values[key];
}
return res;
}, {}),
fields,
{
// we need to pass the clientId into the context of the gql-query for we don't have the value there yet!
clientId: securedEntryProps.clientId
} //context
);
}*/
};
//# sourceMappingURL=securedentry-component.js.map
;