@pipeline-builder/api-server 4.1.5 → 4.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/api/tenant-context.js +28 -3
- package/package.json +4 -4
|
@@ -1,8 +1,33 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { isSystemAdmin } from '@pipeline-builder/api-core';
|
|
4
|
-
import { runWithTenantContext } from '@pipeline-builder/pipeline-data';
|
|
3
|
+
import { isSystemAdmin, setLogContextProvider } from '@pipeline-builder/api-core';
|
|
4
|
+
import { getTenantContext, runWithTenantContext } from '@pipeline-builder/pipeline-data';
|
|
5
5
|
import { getContext } from './get-context.js';
|
|
6
|
+
/**
|
|
7
|
+
* Teach the logger where the ambient org/user identity lives — the SINGLE wire
|
|
8
|
+
* point for log tenancy across every service.
|
|
9
|
+
*
|
|
10
|
+
* `api-core` (which owns the logger) has no internal dependencies, and the
|
|
11
|
+
* request scope lives in `pipeline-data`, which depends on it — so the logger
|
|
12
|
+
* takes a provider rather than importing the AsyncLocalStorage directly. This
|
|
13
|
+
* module is the natural place to register: it already bridges both packages,
|
|
14
|
+
* and every service that opens a tenant scope does so through the
|
|
15
|
+
* `withTenantContext` exported below (platform included, via its own pre-auth
|
|
16
|
+
* resolver). Registering here rather than in each service's bootstrap means a
|
|
17
|
+
* new service cannot forget to do it.
|
|
18
|
+
*
|
|
19
|
+
* Module-scope on purpose: idempotent, and it must be in place before the first
|
|
20
|
+
* request is logged.
|
|
21
|
+
*/
|
|
22
|
+
setLogContextProvider(() => {
|
|
23
|
+
const ctx = getTenantContext();
|
|
24
|
+
if (!ctx)
|
|
25
|
+
return undefined;
|
|
26
|
+
// Empty-string orgId (the pre-auth default for unauthenticated endpoints) is
|
|
27
|
+
// NOT an org — leave the field off so the line is routed as unattributed
|
|
28
|
+
// rather than to a tenant named "".
|
|
29
|
+
return { orgId: ctx.orgId || undefined, userId: ctx.userId };
|
|
30
|
+
});
|
|
6
31
|
/** Default resolver: the authenticated identity's org + super-admin flag, plus
|
|
7
32
|
* the active-org parent (org → team hierarchy) so downstream side-effects can
|
|
8
33
|
* reach it without a request, and the caller's user id for the app-layer
|
|
@@ -45,4 +70,4 @@ export function withTenantContext(resolve = identityScope) {
|
|
|
45
70
|
runWithTenantContext(scope, () => next());
|
|
46
71
|
};
|
|
47
72
|
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3RlbmFudC1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFBc0IsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFOUM7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gscUJBQXFCLENBQUMsR0FBRyxFQUFFO0lBQ3pCLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDL0IsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMzQiw2RUFBNkU7SUFDN0UseUVBQXlFO0lBQ3pFLG9DQUFvQztJQUNwQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLElBQUksU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDL0QsQ0FBQyxDQUFDLENBQUM7QUFZSDs7OzZDQUc2QztBQUM3QyxNQUFNLGFBQWEsR0FBd0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbkQsd0VBQXdFO0lBQ3hFLDBFQUEwRTtJQUMxRSx1RUFBdUU7SUFDdkUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSztJQUNyQyxNQUFNLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksU0FBUztJQUNwRCxZQUFZLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQztJQUNoQyxXQUFXLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxvQkFBb0I7Q0FDNUMsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQU8sR0FBd0IsYUFBYTtJQUM1RSxPQUFPLENBQUMsR0FBWSxFQUFFLElBQWMsRUFBRSxJQUFrQixFQUFRLEVBQUU7UUFDaEUsSUFBSSxLQUFvQixDQUFDO1FBQ3pCLElBQUksQ0FBQztZQUNILEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixPQUFPO1FBQ1QsQ0FBQztRQUNELG9CQUFvQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgaXNTeXN0ZW1BZG1pbiwgc2V0TG9nQ29udGV4dFByb3ZpZGVyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgZ2V0VGVuYW50Q29udGV4dCwgcnVuV2l0aFRlbmFudENvbnRleHQsIHR5cGUgVGVuYW50Q29udGV4dCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBnZXRDb250ZXh0IH0gZnJvbSAnLi9nZXQtY29udGV4dC5qcyc7XG5cbi8qKlxuICogVGVhY2ggdGhlIGxvZ2dlciB3aGVyZSB0aGUgYW1iaWVudCBvcmcvdXNlciBpZGVudGl0eSBsaXZlcyDigJQgdGhlIFNJTkdMRSB3aXJlXG4gKiBwb2ludCBmb3IgbG9nIHRlbmFuY3kgYWNyb3NzIGV2ZXJ5IHNlcnZpY2UuXG4gKlxuICogYGFwaS1jb3JlYCAod2hpY2ggb3ducyB0aGUgbG9nZ2VyKSBoYXMgbm8gaW50ZXJuYWwgZGVwZW5kZW5jaWVzLCBhbmQgdGhlXG4gKiByZXF1ZXN0IHNjb3BlIGxpdmVzIGluIGBwaXBlbGluZS1kYXRhYCwgd2hpY2ggZGVwZW5kcyBvbiBpdCDigJQgc28gdGhlIGxvZ2dlclxuICogdGFrZXMgYSBwcm92aWRlciByYXRoZXIgdGhhbiBpbXBvcnRpbmcgdGhlIEFzeW5jTG9jYWxTdG9yYWdlIGRpcmVjdGx5LiBUaGlzXG4gKiBtb2R1bGUgaXMgdGhlIG5hdHVyYWwgcGxhY2UgdG8gcmVnaXN0ZXI6IGl0IGFscmVhZHkgYnJpZGdlcyBib3RoIHBhY2thZ2VzLFxuICogYW5kIGV2ZXJ5IHNlcnZpY2UgdGhhdCBvcGVucyBhIHRlbmFudCBzY29wZSBkb2VzIHNvIHRocm91Z2ggdGhlXG4gKiBgd2l0aFRlbmFudENvbnRleHRgIGV4cG9ydGVkIGJlbG93IChwbGF0Zm9ybSBpbmNsdWRlZCwgdmlhIGl0cyBvd24gcHJlLWF1dGhcbiAqIHJlc29sdmVyKS4gUmVnaXN0ZXJpbmcgaGVyZSByYXRoZXIgdGhhbiBpbiBlYWNoIHNlcnZpY2UncyBib290c3RyYXAgbWVhbnMgYVxuICogbmV3IHNlcnZpY2UgY2Fubm90IGZvcmdldCB0byBkbyBpdC5cbiAqXG4gKiBNb2R1bGUtc2NvcGUgb24gcHVycG9zZTogaWRlbXBvdGVudCwgYW5kIGl0IG11c3QgYmUgaW4gcGxhY2UgYmVmb3JlIHRoZSBmaXJzdFxuICogcmVxdWVzdCBpcyBsb2dnZWQuXG4gKi9cbnNldExvZ0NvbnRleHRQcm92aWRlcigoKSA9PiB7XG4gIGNvbnN0IGN0eCA9IGdldFRlbmFudENvbnRleHQoKTtcbiAgaWYgKCFjdHgpIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIEVtcHR5LXN0cmluZyBvcmdJZCAodGhlIHByZS1hdXRoIGRlZmF1bHQgZm9yIHVuYXV0aGVudGljYXRlZCBlbmRwb2ludHMpIGlzXG4gIC8vIE5PVCBhbiBvcmcg4oCUIGxlYXZlIHRoZSBmaWVsZCBvZmYgc28gdGhlIGxpbmUgaXMgcm91dGVkIGFzIHVuYXR0cmlidXRlZFxuICAvLyByYXRoZXIgdGhhbiB0byBhIHRlbmFudCBuYW1lZCBcIlwiLlxuICByZXR1cm4geyBvcmdJZDogY3R4Lm9yZ0lkIHx8IHVuZGVmaW5lZCwgdXNlcklkOiBjdHgudXNlcklkIH07XG59KTtcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgUkxTIHRlbmFudCBzY29wZSBmb3IgYSByZXF1ZXN0LiBUaGUgZGVmYXVsdCByZWFkcyB0aGUgQ0FMTEVSJ3NcbiAqIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkgb3JnIChgY3R4LmlkZW50aXR5Lm9yZ0lkYCwgdmFsaWRhdGVkIGJ5IHJlcXVpcmVPcmdJZCkg4oCUIE5PVFxuICogYGdldE9yZ0lkKHJlcSlgLCB3aGljaCBwcmVmZXJzIHJvdXRlIHBhcmFtcyAodGhlIHF1ZXJpZWQgc2NvcGUpLCB0aGUgd3JvbmcgdGVuYW50IGZvclxuICogUkxTLiBTZXJ2aWNlcyB3aXRoIGEgZGlmZmVyZW50IHJlcXVlc3QgYm91bmRhcnkgc3VwcGx5IHRoZWlyIG93biByZXNvbHZlciAoZS5nLiBwbGF0Zm9ybVxuICogc2V0cyB0aGUgc2NvcGUgcHJlLWF1dGggZnJvbSBhbiB1bnZlcmlmaWVkIEpXVCBwZWVrIHNvIHVuYXV0aGVudGljYXRlZCBlbmRwb2ludHMgc3RpbGxcbiAqIGdldCBhIHNhbmUgZGVmYXVsdCkuXG4gKi9cbmV4cG9ydCB0eXBlIFRlbmFudFNjb3BlUmVzb2x2ZXIgPSAocmVxOiBSZXF1ZXN0KSA9PiBUZW5hbnRDb250ZXh0O1xuXG4vKiogRGVmYXVsdCByZXNvbHZlcjogdGhlIGF1dGhlbnRpY2F0ZWQgaWRlbnRpdHkncyBvcmcgKyBzdXBlci1hZG1pbiBmbGFnLCBwbHVzXG4gKiAgdGhlIGFjdGl2ZS1vcmcgcGFyZW50IChvcmcg4oaSIHRlYW0gaGllcmFyY2h5KSBzbyBkb3duc3RyZWFtIHNpZGUtZWZmZWN0cyBjYW5cbiAqICByZWFjaCBpdCB3aXRob3V0IGEgcmVxdWVzdCwgYW5kIHRoZSBjYWxsZXIncyB1c2VyIGlkIGZvciB0aGUgYXBwLWxheWVyXG4gKiAgcHJlZGljYXRlcyB0aGF0IGNhcnJ5IGEgcGVyLXVzZXIgcnVuZy4gKi9cbmNvbnN0IGlkZW50aXR5U2NvcGU6IFRlbmFudFNjb3BlUmVzb2x2ZXIgPSAocmVxKSA9PiAoe1xuICAvLyBgaWRlbnRpdHkub3JnSWRgIGlzIGFscmVhZHkgbm9ybWFsaXplZCAodHJpbW1lZCArIGxvd2VyY2FzZWQpIG9uY2UgYXRcbiAgLy8gcmVzb2x1dGlvbiBpbiBhcGktY29yZSdzIGBnZXRJZGVudGl0eWAsIHNvIHRoZSBHVUMgc2V0IGhlcmUgbWF0Y2hlcyB0aGVcbiAgLy8gYXBwLWxheWVyIFdIRVJFIGNsYXVzZXMgZXhhY3RseSDigJQgbm8gYWQtaG9jIHJlLW5vcm1hbGl6YXRpb24gbmVlZGVkLlxuICBvcmdJZDogZ2V0Q29udGV4dChyZXEpLmlkZW50aXR5Lm9yZ0lkLFxuICB1c2VySWQ6IGdldENvbnRleHQocmVxKS5pZGVudGl0eS51c2VySWQgfHwgdW5kZWZpbmVkLFxuICBpc1N1cGVyQWRtaW46IGlzU3lzdGVtQWRtaW4ocmVxKSxcbiAgcGFyZW50T3JnSWQ6IHJlcS51c2VyPy5wYXJlbnRPcmdhbml6YXRpb25JZCxcbn0pO1xuXG4vKipcbiAqIEVzdGFibGlzaCB0aGUgcmVxdWVzdCdzIHJvdy1sZXZlbC1zZWN1cml0eSB0ZW5hbnQgc2NvcGUuXG4gKlxuICogUnVucyB0aGUgcmVzdCBvZiB0aGUgcmVxdWVzdCBpbnNpZGUgYHJ1bldpdGhUZW5hbnRDb250ZXh0KHsgb3JnSWQsIGlzU3VwZXJBZG1pbiB9KWAgKGFuXG4gKiBBc3luY0xvY2FsU3RvcmFnZSBzY29wZSkgc28gZXZlcnkgYHdpdGhUZW5hbnRUeGAgcXVlcnkgZG93bnN0cmVhbSBjYW4gYFNFVCBMT0NBTGAgdGhlXG4gKiBQb3N0Z3JlcyBHVUNzIHRoYXQgUkxTIHBvbGljaWVzIHJlYWQuIFdpdGhvdXQgdGhpcywgcmVhZHMgYWdhaW5zdCBGT1JDRS1STFMgdGFibGVzIChlLmcuXG4gKiBgcGx1Z2luc2AsIGBwaXBlbGluZXNgKSBydW4gd2l0aCBlbXB0eSBHVUNzIGFuZCBzaWxlbnRseSByZXR1cm4gbm8gcm93cyDigJQgdGhlIFwic2V0IG9uY2VcbiAqIGF0IHRoZSByZXF1ZXN0IGJvdW5kYXJ5XCIgYm9va2VuZCB0aGUgUkxTIGVuZm9yY2VtZW50IHBsYW4gY2FsbHMgZm9yLlxuICpcbiAqIERlZmF1bHQgcGxhY2VtZW50IGlzIEFGVEVSIGByZXF1aXJlQXV0aGAgKyBgcmVxdWlyZU9yZ0lkYCAodGhlIHJvdXRlIGZhY3RvcmllcyBkbyB0aGlzKTtcbiAqIHBhc3MgYSBjdXN0b20gYHJlc29sdmVgIGZvciBhIGRpZmZlcmVudCBib3VuZGFyeS4gQSB0aHJvd24gcmVzb2x2ZXIgbWVhbnMgdGVuYW50IGlkZW50aXR5XG4gKiBjb3VsZCBOT1QgYmUgZXN0YWJsaXNoZWQgKGEgd2lyaW5nIGJ1ZyDigJQgdGhpcyBydW5zIGFmdGVyIGF1dGgpIOKAlCB3ZSBoYXJkLUZBSUwgdGhlIHJlcXVlc3RcbiAqICg1MDAgdmlhIG5leHQoZXJyKSkgcmF0aGVyIHRoYW4gcHJvY2VlZC4gUHJvY2VlZGluZyB3b3VsZCBydW4gcXVlcmllcyB3aXRoIGVtcHR5IFJMUyBHVUNzO1xuICogdW5kZXIgRk9SQ0UgUkxTIHRoYXQgaGlkZXMgcm93cywgYnV0IHdoaWxlIFJMUyBpcyBpbiBvd25lci1ieXBhc3MgbW9kZSB0aGUgYXBwLWxheWVyIFdIRVJFXG4gKiBjbGF1c2UgaXMgdGhlIG9ubHkgdGVuYW50IGdhdGUsIHNvIGEgc2NvcGVsZXNzIHJlcXVlc3QgbXVzdCBub3Qgc2lsZW50bHkgY29udGludWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoVGVuYW50Q29udGV4dChyZXNvbHZlOiBUZW5hbnRTY29wZVJlc29sdmVyID0gaWRlbnRpdHlTY29wZSkge1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgX3JlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGxldCBzY29wZTogVGVuYW50Q29udGV4dDtcbiAgICB0cnkge1xuICAgICAgc2NvcGUgPSByZXNvbHZlKHJlcSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBuZXh0KGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJ1bldpdGhUZW5hbnRDb250ZXh0KHNjb3BlLCAoKSA9PiBuZXh0KCkpO1xuICB9O1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
"rate-limit-redis": "6.0.0",
|
|
44
44
|
"swagger-ui-express": "5.0.1",
|
|
45
45
|
"uuid": "14.0.1",
|
|
46
|
-
"@pipeline-builder/api-core": "4.1.
|
|
47
|
-
"@pipeline-builder/pipeline-
|
|
48
|
-
"@pipeline-builder/pipeline-
|
|
46
|
+
"@pipeline-builder/api-core": "4.1.5",
|
|
47
|
+
"@pipeline-builder/pipeline-core": "4.1.6",
|
|
48
|
+
"@pipeline-builder/pipeline-data": "4.1.6"
|
|
49
49
|
},
|
|
50
50
|
"keywords": [
|
|
51
51
|
"ci-cd",
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"access": "public",
|
|
102
102
|
"registry": "https://registry.npmjs.org/"
|
|
103
103
|
},
|
|
104
|
-
"version": "4.1.
|
|
104
|
+
"version": "4.1.6",
|
|
105
105
|
"bugs": {
|
|
106
106
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
107
107
|
},
|