UNPKG

@opra/sqb

Version:

Opra SQB adapter package

142 lines (141 loc) 6.29 kB
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 = {}));