@altostra/core
Version:
Core library for shared types and logic
1 lines • 4.72 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0}),exports.getWebApiEndpointUtils=exports.getWebApiResourceUtils=void 0;const Errors_1=require("../../../../aws/Transformer/Errors"),Errors_2=require("../../../../common/Errors"),some_1=require("../../../../common/Iterable/Operators/some"),from_1=require("@reactivex/ix-es2015-cjs/iterable/from"),filter_1=require("@reactivex/ix-es2015-cjs/iterable/operators/filter"),map_1=require("@reactivex/ix-es2015-cjs/iterable/operators/map"),Connections_1=require("../../../Connections");function getWebApiResourceUtils({blueprint:e,api:r,endpointTypes:t,endpointsValidation:o}){const{ResourceHelper:i}=require("../../ResourceHelper"),{assertResourceType:n}=require("../../ResourceCollection");return{validateEndpoint(){if(!(0,some_1.some)(r.resourceUtils.getEndpoints(),e=>"resource.api.proxy-endpoint"===e.type||(0,some_1.some)(e.outgoingConnections)))throw new Errors_1.TransformError(`Api must have at least one method which triggers another resource;\nBut '${r.resource.name}' (${r.id}) has no such endpoint.`,{api:r.resource});const i=()=>(0,from_1.from)(r.resource.endpoints).pipe((0,map_1.map)(t=>{const o=e.resources.get(t.id);if(!o)throw new Errors_1.BlueprintResourceNotFoundError(t.id,{api:r,endpointRef:t});return o}),n(...t),(0,map_1.map)(e=>e.resource));structureValidation(e,r,t,i),o(e,r,i)},getEndpoints(){const o=new Set(r.resource.endpoints.map(e=>e.id));return e.resources.pipe((0,filter_1.filter)(e=>o.has(e.id)),n(...t))},removeWithEndpoints(){const t=r.resourceUtils.getEndpoints();for(const r of t)e.resources.delete(r);e.resources.delete(r)},addEndpoint:t=>(t instanceof i?e.resources.get(t.id)||(t=e.resources.add(t.resource)):t=e.resources.add(t),r.resource.endpoints.push({type:"ref",id:t.id}),t),updateDefaultAuthorizer(){if(void 0===r.resource.defaultAuthorizer){const[e]=r.outgoingConnections.ofType("connection.api.authorizer");r.resource.defaultAuthorizer=null==e?void 0:e.targetId}else if(null!==r.resource.defaultAuthorizer){const e=r.outgoingConnections.get(new Connections_1.ConnectionId(r.id,r.resource.defaultAuthorizer));e&&e.is("connection.api.authorizer")||(r.resource.defaultAuthorizer=void 0,r.resourceUtils.updateDefaultAuthorizer())}},connectAuthorizer(t,o){const i=e.resources.get(t);if(!i)throw Errors_2.AltoError.create("Could not find authorizer function",{data:{missingTarget:t}});if(!i.is("resource.compute.function"))throw Errors_2.AltoError.create("API authorizer must be a function",{data:{targetId:t,resource:i.resource}});const[n]=r.outgoingConnections.ofType("connection.api.authorizer").pipe((0,filter_1.filter)(e=>e.targetId===t));if(n)return o&&n.edit(o),n;{const i=e.connections.add(Object.assign({from:r.id,to:t,type:"connection.api.authorizer"},o));return i.assertType("connection.api.authorizer"),r.resourceUtils.updateDefaultAuthorizer(),i}},disconnectAuthorizer(t){if(!t)return;const o=r.resourceUtils.getEndpoints().pipe((0,filter_1.filter)(e=>e.resource.authorizer===t.targetId));for(const e of o)e.resource.authorizer=void 0;e.connections.delete(t),r.resourceUtils.updateDefaultAuthorizer()},getDefaultAuthorizer(){if(null===r.resource.defaultAuthorizer)return;let e=r.outgoingConnections.ofType("connection.api.authorizer");r.resource.defaultAuthorizer&&(e=e.pipe((0,filter_1.filter)(e=>e.targetId===r.resource.defaultAuthorizer)));const[t]=e;return t}}}function getWebApiEndpointUtils(e,r,t){return{removeEndpoint(){const t=r.resourceUtils.getApi();t.resource.endpoints=t.resource.endpoints.filter(e=>e.id!==r.id),e.resources.delete(r)},getApi(){const o=e.resources.get(r.resource.api.id);if(!o)throw Errors_2.AltoError.create({message:"Cannot find blueprint API for ApiEndpoint",data:{apiEndpoint:r}});if(!o.is(t))throw Errors_2.AltoError.create({message:"Invalid Api resource type for ApiEndpoint",data:{apiEndpoint:r,api:o}});return o},registerOnApi(){const e=r.resourceUtils.getApi();e.resource.endpoints.some(e=>e.id===r.id)||e.resource.endpoints.push({type:"ref",id:r.id})},getAuthorizer(){if(null===r.resource.authorizer)return;const t=r.resourceUtils.getApi();if(void 0===r.resource.authorizer)return t.resourceUtils.getDefaultAuthorizer();const o=r.resource.authorizer,i=e.connections.get(new Connections_1.ConnectionId(t.id,o));return null==i||i.assertType("connection.api.authorizer"),i}}}function structureValidation(e,r,t,o){const i=[...o().pipe((0,filter_1.filter)(e=>e.api.id!==r.id),(0,filter_1.filter)(e=>!t.includes(e.type)))];if(i.length>0)throw new Errors_1.TransformError("Api endpoints are connected to the wrong API",{parentApi:r.resource,invalidEndpoints:i})}exports.getWebApiResourceUtils=getWebApiResourceUtils,exports.getWebApiEndpointUtils=getWebApiEndpointUtils;