@opra/sqb
Version:
Opra SQB adapter package
142 lines (141 loc) • 6.29 kB
JavaScript
import { EntityMetadata } from '@sqb/connect';
import _prepareFilter from './adapter-utils/prepare-filter.js';
/**
* SQBAdapter namespace provides types and utility functions for integrating SQB with Opra.
*/
export var SQBAdapter;
(function (SQBAdapter) {
/**
* Parses the given filter input into a SQB filter expression.
* @deprecated Use {@link prepareFilter} instead.
*/
SQBAdapter.parseFilter = _prepareFilter;
/**
* Prepares the given filter input into a SQB filter expression.
*/
SQBAdapter.prepareFilter = _prepareFilter;
/**
* Parses an execution context and transforms it into a SQB-compatible request.
*
* @param context - The execution context to parse.
* @returns A promise that resolves to the transformed request.
* @throws {TypeError} If the context transport is not 'http'.
* @throws {Error} If the operation is not compatible with SQB Adapter.
*/
async function parseRequest(context) {
if (context.transport !== 'http') {
throw new TypeError('SQBAdapter can parse only HttpContext');
}
const ctx = context;
const { __oprDef } = ctx;
if (__oprDef?.composition?.startsWith('Entity.') &&
__oprDef.compositionOptions?.type) {
const dataType = ctx.__docNode.getComplexType(__oprDef.compositionOptions?.type);
const entityMetadata = EntityMetadata.get(dataType.ctor);
if (!entityMetadata)
throw new Error(`Type class "${dataType.ctor}" is not an SQB entity`);
const controller = __oprDef.owner;
switch (__oprDef.composition) {
case 'Entity.Create': {
const data = await ctx.getBody();
const options = {
projection: ctx.queryParams.projection,
};
return {
method: 'create',
data,
options,
};
}
case 'Entity.Delete': {
const keyParam = __oprDef.parameters.find(p => p.keyParam) ||
controller.parameters.find(p => p.keyParam);
const key = keyParam && ctx.pathParams[String(keyParam.name)];
const options = {
filter: SQBAdapter.prepareFilter(ctx.queryParams.filter),
};
return {
method: 'delete',
key,
options,
};
}
case 'Entity.DeleteMany': {
const options = {
filter: SQBAdapter.prepareFilter(ctx.queryParams.filter),
};
return { method: 'deleteMany', options };
}
case 'Entity.FindMany': {
const options = {
count: ctx.queryParams.count,
filter: SQBAdapter.prepareFilter(ctx.queryParams.filter),
projection: ctx.queryParams.projection ||
__oprDef.compositionOptions.defaultProjection,
limit: ctx.queryParams.limit || __oprDef.compositionOptions.defaultLimit,
skip: ctx.queryParams.skip,
sort: ctx.queryParams.sort || __oprDef.compositionOptions.defaultSort,
};
return { method: 'findMany', options };
}
case 'Entity.Get': {
const keyParam = __oprDef.parameters.find(p => p.keyParam) ||
controller.parameters.find(p => p.keyParam);
const key = keyParam && ctx.pathParams[String(keyParam.name)];
const options = {
projection: ctx.queryParams.projection,
filter: SQBAdapter.parseFilter(ctx.queryParams.filter),
};
return { method: 'get', key, options };
}
case 'Entity.Replace': {
const data = await ctx.getBody();
const keyParam = __oprDef.parameters.find(p => p.keyParam) ||
controller.parameters.find(p => p.keyParam);
const key = keyParam && ctx.pathParams[String(keyParam.name)];
const options = {
projection: ctx.queryParams.projection,
filter: ctx.queryParams.filter,
};
return {
method: 'replace',
key,
data,
options,
};
}
case 'Entity.Update': {
const data = await ctx.getBody();
const keyParam = __oprDef.parameters.find(p => p.keyParam) ||
controller.parameters.find(p => p.keyParam);
const key = keyParam && ctx.pathParams[String(keyParam.name)];
const options = {
projection: ctx.queryParams.projection,
filter: SQBAdapter.prepareFilter(ctx.queryParams.filter),
};
return {
method: 'update',
key,
data,
options,
};
}
case 'Entity.UpdateMany': {
const data = await ctx.getBody();
const options = {
filter: SQBAdapter.prepareFilter(ctx.queryParams.filter),
};
return {
method: 'updateMany',
data,
options,
};
}
default:
break;
}
}
throw new Error(`This operation is not compatible to SQB Adapter`);
}
SQBAdapter.parseRequest = parseRequest;
})(SQBAdapter || (SQBAdapter = {}));