{"record":{"id":"769fe9072e215f5c","repo":"hcengineering/platform","slug":"no-adaptermanager","errorCode":null,"errorMessage":"No AdapterManager","messagePattern":"No AdapterManager","errorType":"error_code","errorClass":"PlatformError","httpStatus":null,"severity":"error","filePath":"foundations/server/packages/middleware/src/lowLevel.ts","lineNumber":42,"sourceCode":"  type Ref,\n  type StorageIterator\n} from '@hcengineering/core'\nimport { PlatformError, unknownStatus } from '@hcengineering/platform'\nimport type { Middleware, PipelineContext } from '@hcengineering/server-core'\nimport { BaseMiddleware } from '@hcengineering/server-core'\n\n/**\n * Will perform a find inside adapters\n * @public\n */\nexport class LowLevelMiddleware extends BaseMiddleware implements Middleware {\n  static async create (\n    ctx: MeasureContext,\n    context: PipelineContext,\n    next: Middleware | undefined\n  ): Promise<Middleware | undefined> {\n    if (context.adapterManager == null) {\n      throw new PlatformError(unknownStatus('No AdapterManager'))\n    }\n    const adapterManager = context.adapterManager\n    context.lowLevelStorage = {\n      find (ctx: MeasureContext, domain: Domain): StorageIterator {\n        return adapterManager.getAdapter(domain, false).find(ctx, domain)\n      },\n\n      load (ctx: MeasureContext, domain: Domain, docs: Ref<Doc>[]): Promise<Doc[]> {\n        return adapterManager.getAdapter(domain, false).load(ctx, domain, docs)\n      },\n\n      upload (ctx: MeasureContext, domain: Domain, docs: Doc[]): Promise<void> {\n        return adapterManager.getAdapter(domain, true).upload(ctx, domain, docs)\n      },\n\n      clean (ctx: MeasureContext, domain: Domain, docs: Ref<Doc>[]): Promise<void> {\n        return adapterManager.getAdapter(domain, true).clean(ctx, domain, docs)\n      },","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/hcengineering/platform/blob/63e28dc96483967b2fc21c881b3f1023c1de7718/foundations/server/packages/middleware/src/lowLevel.ts#L24-L60","documentation":"LowLevel middleware's static create() requires an AdapterManager on the pipeline context because it builds low-level storage access (find/insert/delete across domain adapters) from it. If context.adapterManager is null/undefined it throws a PlatformError with the unknownStatus 'No AdapterManager'.","triggerScenarios":"Constructing the pipeline with LowLevel.create() while the PipelineContext was built without an adapterManager (e.g. adapter manager middleware not added or context assembled manually).","commonSituations":"Missing configuration when assembling the middleware pipeline; forgetting to register the adapterManager middleware before lowLevel; custom pipeline construction that omits context.adapterManager; service bootstrap missing DB adapter configuration.","solutions":["Configure context.adapterManager (add the adapter-manager middleware) before LowLevel.create() in the pipeline","Check the pipeline factory/order so the AdapterManager middleware runs before LowLevel","Verify server configuration supplies the storage/adapter settings used to build the AdapterManager"],"exampleFix":"// before\nconst pipeline = await Pipeline.create(ctx, context, [LowLevel.create, ...]) // context.adapterManager undefined\n// after\ncontext.adapterManager = new AdapterManager(ctx, storageConfig)\nconst pipeline = await Pipeline.create(ctx, context, [AdapterManager.create, LowLevel.create, ...])","handlingStrategy":"validation","validationCode":"if (context.adapterManager == null) {\n  throw new Error('AdapterManager must be configured before LowLevel.create')\n}","typeGuard":"function hasAdapterManager(ctx: PipelineContext): ctx is PipelineContext & { adapterManager: AdapterManager } {\n  return ctx.adapterManager != null\n}","tryCatchPattern":"try {\n  await LowLevel.create(ctx, context, next)\n} catch (err) {\n  if (isPlatformErrorWith(err, 'No AdapterManager')) {\n    throw new Error('pipeline misconfigured: register AdapterManager middleware')\n  }\n  throw err\n}","preventionTips":["Always include the AdapterManager middleware before LowLevel in the pipeline","Validate the full PipelineContext before pipeline creation","Use the standard pipeline factory instead of hand-rolled middleware lists","Add a startup assertion that adapterManager exists"],"tags":["configuration","middleware","storage"],"backgroundTag":"missing-pipeline-dependency","analyzedSha":"63e28dc96483967b2fc21c881b3f1023c1de7718","analyzedAt":"2026-08-29T15:21:27.377Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}