@peers-app/peers-sdk 0.7.2 → 0.7.5
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/dist/context/data-context.d.ts +1 -1
- package/dist/context/data-context.js +2 -3
- package/dist/context/user-context-singleton.js +13 -31
- package/dist/context/user-context.d.ts +2 -5
- package/dist/context/user-context.js +20 -15
- package/dist/data/assistants.d.ts +1 -1
- package/dist/data/change-tracking.d.ts +16 -16
- package/dist/data/channels.d.ts +1 -1
- package/dist/data/data-locks.d.ts +2 -2
- package/dist/data/data-locks.test.js +3 -0
- package/dist/data/devices.d.ts +4 -4
- package/dist/data/embeddings.d.ts +1 -1
- package/dist/data/group-members.d.ts +7 -4
- package/dist/data/group-members.js +98 -32
- package/dist/data/groups.d.ts +7 -3
- package/dist/data/groups.js +91 -30
- package/dist/data/index.d.ts +1 -0
- package/dist/data/index.js +1 -0
- package/dist/data/knowledge/knowledge-frames.d.ts +1 -1
- package/dist/data/knowledge/knowledge-links.d.ts +1 -1
- package/dist/data/knowledge/knowledge-values.d.ts +1 -1
- package/dist/data/knowledge/peer-types.d.ts +1 -1
- package/dist/data/knowledge/predicates.d.ts +1 -1
- package/dist/data/messages.d.ts +4 -4
- package/dist/data/orm/client-proxy.data-source.js +8 -18
- package/dist/data/orm/decorators.d.ts +1 -1
- package/dist/data/orm/decorators.js +7 -6
- package/dist/data/packages.d.ts +2 -1
- package/dist/data/packages.js +90 -40
- package/dist/data/peer-events/peer-event-handlers.d.ts +1 -1
- package/dist/data/peer-events/peer-event-types.d.ts +1 -1
- package/dist/data/persistent-vars.js +124 -119
- package/dist/data/tool-tests.d.ts +1 -1
- package/dist/data/tools.d.ts +1 -1
- package/dist/data/user-permissions.test.js +7 -10
- package/dist/data/user-trust-levels.d.ts +42 -0
- package/dist/data/user-trust-levels.js +60 -0
- package/dist/data/users.d.ts +7 -7
- package/dist/data/users.js +86 -27
- package/dist/data/workflow-logs.d.ts +1 -1
- package/dist/data/workflow-runs.js +1 -1
- package/dist/data/workflows.d.ts +1 -1
- package/dist/device/connection.js +2 -2
- package/dist/device/get-trust-level.js +10 -6
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/logging/console-logger.d.ts +10 -0
- package/dist/logging/console-logger.js +206 -0
- package/dist/logging/console-logs.table.d.ts +48 -0
- package/dist/logging/console-logs.table.js +140 -0
- package/dist/logging/index.d.ts +2 -0
- package/dist/logging/index.js +18 -0
- package/dist/rpc-types.d.ts +0 -11
- package/dist/rpc-types.js +0 -8
- package/dist/types/peer-device.d.ts +10 -0
- package/dist/users.query.d.ts +3 -1
- package/dist/users.query.js +39 -11
- package/package.json +1 -1
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
3
|
+
var useValue = arguments.length > 2;
|
|
4
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
5
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
6
|
+
}
|
|
7
|
+
return useValue ? value : void 0;
|
|
8
|
+
};
|
|
9
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
10
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
11
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
12
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
13
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
14
|
+
var _, done = false;
|
|
15
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
16
|
+
var context = {};
|
|
17
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
18
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
19
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
20
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
21
|
+
if (kind === "accessor") {
|
|
22
|
+
if (result === void 0) continue;
|
|
23
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
24
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
25
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
26
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
27
|
+
}
|
|
28
|
+
else if (_ = accept(result)) {
|
|
29
|
+
if (kind === "field") initializers.unshift(_);
|
|
30
|
+
else descriptor[key] = _;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
34
|
+
done = true;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.ConsoleLogsTable = exports.consoleLogSchema = void 0;
|
|
38
|
+
exports.ConsoleLogs = ConsoleLogs;
|
|
39
|
+
const zod_1 = require("zod");
|
|
40
|
+
const zod_types_1 = require("../types/zod-types");
|
|
41
|
+
const types_1 = require("../data/orm/types");
|
|
42
|
+
const user_context_singleton_1 = require("../context/user-context-singleton");
|
|
43
|
+
const table_definitions_system_1 = require("../data/orm/table-definitions.system");
|
|
44
|
+
const utils_1 = require("../utils");
|
|
45
|
+
const orm_1 = require("../data/orm");
|
|
46
|
+
exports.consoleLogSchema = zod_1.z.object({
|
|
47
|
+
logId: zod_types_1.zodPeerId,
|
|
48
|
+
timestamp: zod_1.z.number().default(() => (0, utils_1.getTimestamp)()).describe('The timestamp the log was created created'),
|
|
49
|
+
level: zod_1.z.enum(['debug', 'info', 'log', 'warn', 'error']).describe('The log level'),
|
|
50
|
+
process: zod_1.z.string().describe('The process that generated the log (e.g., main, renderer, worker)'),
|
|
51
|
+
processInstanceId: zod_1.z.string().describe('Unique ID for this process instance to filter own logs'),
|
|
52
|
+
source: zod_1.z.string().optional().describe('The source file or module that generated the log'),
|
|
53
|
+
message: zod_1.z.string().describe('The log message'),
|
|
54
|
+
context: zod_types_1.zodAnyObject.optional().describe('Additional structured context data'),
|
|
55
|
+
stackTrace: zod_1.z.string().optional().describe('Stack trace for errors'),
|
|
56
|
+
});
|
|
57
|
+
const metaData = {
|
|
58
|
+
name: 'ConsoleLogs',
|
|
59
|
+
description: 'System-wide console log entries with cross-process visibility.',
|
|
60
|
+
primaryKeyName: 'logId',
|
|
61
|
+
fields: (0, types_1.schemaToFields)(exports.consoleLogSchema),
|
|
62
|
+
localOnly: true, // Don't sync logs between devices
|
|
63
|
+
indexes: [
|
|
64
|
+
{ fields: ['timestamp'] },
|
|
65
|
+
{ fields: ['level'] },
|
|
66
|
+
{ fields: ['process'] },
|
|
67
|
+
{ fields: ['processInstanceId'] },
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
let ConsoleLogsTable = (() => {
|
|
71
|
+
let _classSuper = orm_1.Table;
|
|
72
|
+
let _instanceExtraInitializers = [];
|
|
73
|
+
let _initializeLogCleanup_decorators;
|
|
74
|
+
let _deleteOldLogs_decorators;
|
|
75
|
+
return class ConsoleLogsTable extends _classSuper {
|
|
76
|
+
static {
|
|
77
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
78
|
+
_initializeLogCleanup_decorators = [(0, orm_1.ProxyClientTableMethodCalls)()];
|
|
79
|
+
_deleteOldLogs_decorators = [(0, orm_1.ProxyClientTableMethodCalls)()];
|
|
80
|
+
__esDecorate(this, null, _initializeLogCleanup_decorators, { kind: "method", name: "initializeLogCleanup", static: false, private: false, access: { has: obj => "initializeLogCleanup" in obj, get: obj => obj.initializeLogCleanup }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
81
|
+
__esDecorate(this, null, _deleteOldLogs_decorators, { kind: "method", name: "deleteOldLogs", static: false, private: false, access: { has: obj => "deleteOldLogs" in obj, get: obj => obj.deleteOldLogs }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
82
|
+
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
83
|
+
}
|
|
84
|
+
LOG_TTL = (__runInitializers(this, _instanceExtraInitializers), 7 * 24 * 60 * 60 * 1000); // 7 days
|
|
85
|
+
LOG_CLEANUP_INTERVAL = 24 * 60 * 60 * 1000; // 1 day
|
|
86
|
+
constructor(metaData, deps) {
|
|
87
|
+
super(metaData, deps);
|
|
88
|
+
if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {
|
|
89
|
+
this.initializeLogCleanup();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
logCleanupInitialized = false;
|
|
93
|
+
async initializeLogCleanup() {
|
|
94
|
+
if (this.logCleanupInitialized) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this.logCleanupInitialized = true;
|
|
98
|
+
// always cleanup old logs on startup - randomly spread out of the first 60 seconds to not slam the db
|
|
99
|
+
setTimeout(() => this.deleteOldLogs(), 60_000 * Math.random());
|
|
100
|
+
// regularly clean up logs
|
|
101
|
+
// TODO - consider doing this as a workflow
|
|
102
|
+
setInterval(() => this.deleteOldLogs(), this.LOG_CLEANUP_INTERVAL);
|
|
103
|
+
}
|
|
104
|
+
async deleteOldLogs(cutoffTimestamp = Date.now() - 7 * 24 * 60 * 60 * 1000) {
|
|
105
|
+
const count = await this.count({ timestamp: { $lt: cutoffTimestamp } });
|
|
106
|
+
if (count === 0) {
|
|
107
|
+
console.log(`No old logs to clean up older than ${new Date(cutoffTimestamp).toISOString()}`);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
let ds = this.dataSource;
|
|
111
|
+
while (!(ds instanceof orm_1.SQLDataSource) && ds.dataSource) {
|
|
112
|
+
ds = ds.dataSource;
|
|
113
|
+
}
|
|
114
|
+
if (ds instanceof orm_1.SQLDataSource) {
|
|
115
|
+
const db = ds.db;
|
|
116
|
+
await db.exec(`delete from ConsoleLogs where timestamp < $timestamp`, { timestamp: cutoffTimestamp });
|
|
117
|
+
console.log(`bulk deleted ${count} logs`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const cursor = this.cursor({ timestamp: { $lt: cutoffTimestamp } }, { sortBy: ['-timestamp'] });
|
|
121
|
+
let count2 = 0;
|
|
122
|
+
for await (const log of cursor) {
|
|
123
|
+
this.delete(log.logId);
|
|
124
|
+
}
|
|
125
|
+
console.log(`cursor deleted ${count2} logs`);
|
|
126
|
+
}
|
|
127
|
+
console.log(`cleaned up console logs`, { expectedCount: count });
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
})();
|
|
131
|
+
exports.ConsoleLogsTable = ConsoleLogsTable;
|
|
132
|
+
(0, table_definitions_system_1.registerSystemTableDefinition)(metaData, exports.consoleLogSchema, ConsoleLogsTable);
|
|
133
|
+
/**
|
|
134
|
+
* We always use the user's personal data context so all logs are written to the same place. This requires
|
|
135
|
+
* that the table be accessed in an asynchronous way
|
|
136
|
+
*/
|
|
137
|
+
async function ConsoleLogs() {
|
|
138
|
+
const userContext = await (0, user_context_singleton_1.getUserContext)();
|
|
139
|
+
return (0, user_context_singleton_1.getTableContainer)(userContext.userDataContext).getTable(metaData, exports.consoleLogSchema, ConsoleLogsTable);
|
|
140
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./console-logger"), exports);
|
|
18
|
+
__exportStar(require("./console-logs.table"), exports);
|
package/dist/rpc-types.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { DataFilter, IDataQueryParams, ISaveOptions } from "./data/orm";
|
|
2
1
|
export interface IEventData<T = any> {
|
|
3
2
|
name: string;
|
|
4
3
|
data: T;
|
|
@@ -17,16 +16,6 @@ export declare const rpcServerCalls: {
|
|
|
17
16
|
setUserIdAndSecretKey: ((userId: string, secretKey: string) => Promise<void>);
|
|
18
17
|
getUserId: () => Promise<string | undefined>;
|
|
19
18
|
encryptData: ((value: string, groupId?: string) => Promise<string>);
|
|
20
|
-
tableGet: (dataContextId: string, tableName: string, id: string, opts?: {
|
|
21
|
-
useCache?: boolean;
|
|
22
|
-
cacheTtlMs?: number;
|
|
23
|
-
}) => Promise<any>;
|
|
24
|
-
tableList: ((dataContextId: string, tableName: string, filter?: DataFilter<any>, opts?: IDataQueryParams<any>) => Promise<any[]>);
|
|
25
|
-
tableCount: ((dataContextId: string, tableName: string, filter?: DataFilter<any>) => Promise<number>);
|
|
26
|
-
tableSave: ((dataContextId: string, tableName: string, record: any, opts?: ISaveOptions) => Promise<any>);
|
|
27
|
-
tableInsert: ((dataContextId: string, tableName: string, record: any) => Promise<any>);
|
|
28
|
-
tableUpdate: ((dataContextId: string, tableName: string, record: any) => Promise<any>);
|
|
29
|
-
tableDelete: ((dataContextId: string, tableName: string, recordOrId: any) => Promise<any>);
|
|
30
19
|
tableMethodCall: ((dataContextId: string, tableName: string, methodName: string, ...args: any[]) => Promise<any>);
|
|
31
20
|
getFileContents: ((fileId: string, encoding?: BufferEncoding) => Promise<string>);
|
|
32
21
|
resetAllDeviceSyncInfo: (() => Promise<void>);
|
package/dist/rpc-types.js
CHANGED
|
@@ -16,14 +16,6 @@ exports.rpcServerCalls = {
|
|
|
16
16
|
setUserIdAndSecretKey: rpcStub('setUserIdAndSecretKey'),
|
|
17
17
|
getUserId: rpcStub('getUserId'),
|
|
18
18
|
encryptData: rpcStub('encryptData'),
|
|
19
|
-
// TODO collapse these all down to just tableMethodCall
|
|
20
|
-
tableGet: rpcStub('tableGet'),
|
|
21
|
-
tableList: rpcStub('tableList'),
|
|
22
|
-
tableCount: rpcStub('tableCount'),
|
|
23
|
-
tableSave: rpcStub('tableSave'),
|
|
24
|
-
tableInsert: rpcStub('tableInsert'),
|
|
25
|
-
tableUpdate: rpcStub('tableUpdate'),
|
|
26
|
-
tableDelete: rpcStub('tableDelete'),
|
|
27
19
|
tableMethodCall: rpcStub('tableMethodCall'),
|
|
28
20
|
// TODO lock this down so not all code can get any file contents
|
|
29
21
|
getFileContents: rpcStub('getFileContents'),
|
|
@@ -7,6 +7,16 @@ export interface IPeerDevice {
|
|
|
7
7
|
listChanges(filter?: DataFilter<IChange>, opts?: IDataQueryParams<IChange>): Promise<IChange[]>;
|
|
8
8
|
getNetworkInfo(): Promise<INetworkInfo>;
|
|
9
9
|
notifyOfChanges(deviceId: string, timestampLastApplied: number): Promise<void>;
|
|
10
|
+
sendDeviceMessage(message: IDeviceMessage): Promise<any>;
|
|
11
|
+
}
|
|
12
|
+
export interface IDeviceMessage {
|
|
13
|
+
deviceMessageId: string;
|
|
14
|
+
fromDeviceId: string;
|
|
15
|
+
toDeviceId: string;
|
|
16
|
+
dataContextId: string;
|
|
17
|
+
ttl: number;
|
|
18
|
+
payload: any;
|
|
19
|
+
signature: string;
|
|
10
20
|
}
|
|
11
21
|
export interface INetworkInfo {
|
|
12
22
|
deviceId: string;
|
package/dist/users.query.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import { DataContext, DataFilter, ICursorIterable, IUser } from "./index";
|
|
1
|
+
import { DataContext, DataFilter, ICursorIterable, IUser, TrustLevel } from "./index";
|
|
2
2
|
export interface IUsersQueryOpts {
|
|
3
3
|
currentDataContext?: DataContext;
|
|
4
4
|
includeCurrentDataContext?: boolean;
|
|
5
5
|
includeUserDataContext?: boolean;
|
|
6
6
|
includeOtherDataContexts?: boolean;
|
|
7
|
+
includeTrustLevel?: boolean;
|
|
7
8
|
}
|
|
8
9
|
export type IUserSource = 'currentDataContext' | 'userDataContext' | 'otherDataContexts';
|
|
9
10
|
export interface IUserWithSource extends IUser {
|
|
10
11
|
source: IUserSource;
|
|
12
|
+
trustLevel?: TrustLevel;
|
|
11
13
|
}
|
|
12
14
|
export declare function usersCursor(filter: DataFilter<IUser>, opts?: IUsersQueryOpts): Promise<ICursorIterable<IUserWithSource>>;
|
|
13
15
|
export declare function getUserById(userId: string, opts?: IUsersQueryOpts): Promise<IUserWithSource | undefined>;
|
package/dist/users.query.js
CHANGED
|
@@ -4,7 +4,7 @@ exports.usersCursor = usersCursor;
|
|
|
4
4
|
exports.getUserById = getUserById;
|
|
5
5
|
const index_1 = require("./index");
|
|
6
6
|
async function usersCursor(filter, opts = {}) {
|
|
7
|
-
const { currentDataContext, includeCurrentDataContext = true, includeUserDataContext = true, includeOtherDataContexts = true } = opts;
|
|
7
|
+
const { currentDataContext, includeCurrentDataContext = true, includeUserDataContext = true, includeOtherDataContexts = true, includeTrustLevel = true, } = opts;
|
|
8
8
|
const userContext = await (0, index_1.getUserContext)();
|
|
9
9
|
const contextToUse = currentDataContext || userContext.defaultDataContext();
|
|
10
10
|
let finalCursor = null;
|
|
@@ -13,10 +13,12 @@ async function usersCursor(filter, opts = {}) {
|
|
|
13
13
|
const primaryTable = (0, index_1.Users)(contextToUse);
|
|
14
14
|
const primarySource = (contextToUse === userContext.userDataContext) ? 'userDataContext' : 'currentDataContext';
|
|
15
15
|
const primaryCursor = index_1.Cursor.fromDataSource(primaryTable, filter)
|
|
16
|
-
.map(user => {
|
|
16
|
+
.map(async (user) => {
|
|
17
|
+
const trustLevel = includeTrustLevel ? await (0, index_1.getUserTrustLevel)(contextToUse, user.userId) : undefined;
|
|
17
18
|
const userWithSource = {
|
|
18
19
|
...user,
|
|
19
20
|
source: primarySource,
|
|
21
|
+
trustLevel,
|
|
20
22
|
};
|
|
21
23
|
return userWithSource;
|
|
22
24
|
});
|
|
@@ -26,10 +28,12 @@ async function usersCursor(filter, opts = {}) {
|
|
|
26
28
|
if (includeUserDataContext && contextToUse !== userContext.userDataContext) {
|
|
27
29
|
const userDataContextTable = (0, index_1.Users)(userContext.userDataContext);
|
|
28
30
|
const userDataContextCursor = index_1.Cursor.fromDataSource(userDataContextTable, filter)
|
|
29
|
-
.map(user => {
|
|
31
|
+
.map(async (user) => {
|
|
32
|
+
const trustLevel = includeTrustLevel ? await (0, index_1.getUserTrustLevel)(userContext.userDataContext, user.userId) : undefined;
|
|
30
33
|
const userWithSource = {
|
|
31
34
|
...user,
|
|
32
|
-
source: 'userDataContext'
|
|
35
|
+
source: 'userDataContext',
|
|
36
|
+
trustLevel,
|
|
33
37
|
};
|
|
34
38
|
return userWithSource;
|
|
35
39
|
});
|
|
@@ -44,12 +48,26 @@ async function usersCursor(filter, opts = {}) {
|
|
|
44
48
|
}
|
|
45
49
|
}
|
|
46
50
|
if (otherDataContexts.length > 0) {
|
|
51
|
+
// For trust levels from multiple contexts, we'll use the first context we find the user in
|
|
52
|
+
// This is a simplification - in reality, each group might have different trust levels
|
|
47
53
|
const otherDataContextTables = otherDataContexts.map(dataContext => (0, index_1.Users)(dataContext));
|
|
48
54
|
const otherDataContextsCursor = index_1.Cursor.fromDataSources(otherDataContextTables, filter)
|
|
49
|
-
.map(user => {
|
|
55
|
+
.map(async (user) => {
|
|
56
|
+
// Try to get trust level from the first group context that has this user
|
|
57
|
+
let trustLevel = undefined;
|
|
58
|
+
if (includeTrustLevel) {
|
|
59
|
+
for (const dataContext of otherDataContexts) {
|
|
60
|
+
const contextUser = await (0, index_1.Users)(dataContext).get(user.userId).catch(() => null);
|
|
61
|
+
if (contextUser) {
|
|
62
|
+
trustLevel = await (0, index_1.getUserTrustLevel)(dataContext, user.userId);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
50
67
|
const userWithSource = {
|
|
51
68
|
...user,
|
|
52
|
-
source: 'otherDataContexts'
|
|
69
|
+
source: 'otherDataContexts',
|
|
70
|
+
trustLevel,
|
|
53
71
|
};
|
|
54
72
|
return userWithSource;
|
|
55
73
|
});
|
|
@@ -59,7 +77,11 @@ async function usersCursor(filter, opts = {}) {
|
|
|
59
77
|
// If no cursor was created, return empty cursor
|
|
60
78
|
if (!finalCursor) {
|
|
61
79
|
return index_1.Cursor.fromDataSource((0, index_1.Users)(contextToUse), { userId: { $eq: '__non_existent__' } })
|
|
62
|
-
.map(user => ({
|
|
80
|
+
.map(async (user) => ({
|
|
81
|
+
...user,
|
|
82
|
+
source: 'userDataContext',
|
|
83
|
+
trustLevel: includeTrustLevel ? await (0, index_1.getUserTrustLevel)(userContext.userDataContext, user.userId) : undefined
|
|
84
|
+
}));
|
|
63
85
|
}
|
|
64
86
|
// Deduplication by userId
|
|
65
87
|
// TODO: Push deduplication logic down into the queries for better performance
|
|
@@ -73,7 +95,7 @@ async function usersCursor(filter, opts = {}) {
|
|
|
73
95
|
});
|
|
74
96
|
}
|
|
75
97
|
async function getUserById(userId, opts = {}) {
|
|
76
|
-
const { currentDataContext, includeCurrentDataContext = true, includeUserDataContext = true, includeOtherDataContexts = true } = opts;
|
|
98
|
+
const { currentDataContext, includeCurrentDataContext = true, includeUserDataContext = true, includeOtherDataContexts = true, includeTrustLevel = true } = opts;
|
|
77
99
|
const userContext = await (0, index_1.getUserContext)();
|
|
78
100
|
const contextToUse = currentDataContext || userContext.defaultDataContext();
|
|
79
101
|
// Try current data context first
|
|
@@ -83,9 +105,11 @@ async function getUserById(userId, opts = {}) {
|
|
|
83
105
|
const user = await primaryTable.get(userId);
|
|
84
106
|
if (user) {
|
|
85
107
|
const source = (contextToUse === userContext.userDataContext) ? 'userDataContext' : 'currentDataContext';
|
|
108
|
+
const trustLevel = includeTrustLevel ? await (0, index_1.getUserTrustLevel)(contextToUse, user.userId) : undefined;
|
|
86
109
|
return {
|
|
87
110
|
...user,
|
|
88
|
-
source
|
|
111
|
+
source,
|
|
112
|
+
trustLevel,
|
|
89
113
|
};
|
|
90
114
|
}
|
|
91
115
|
}
|
|
@@ -99,9 +123,11 @@ async function getUserById(userId, opts = {}) {
|
|
|
99
123
|
const userDataContextTable = (0, index_1.Users)(userContext.userDataContext);
|
|
100
124
|
const user = await userDataContextTable.get(userId);
|
|
101
125
|
if (user) {
|
|
126
|
+
const trustLevel = includeTrustLevel ? await (0, index_1.getUserTrustLevel)(userContext.userDataContext, user.userId) : undefined;
|
|
102
127
|
return {
|
|
103
128
|
...user,
|
|
104
|
-
source: 'userDataContext'
|
|
129
|
+
source: 'userDataContext',
|
|
130
|
+
trustLevel,
|
|
105
131
|
};
|
|
106
132
|
}
|
|
107
133
|
}
|
|
@@ -117,9 +143,11 @@ async function getUserById(userId, opts = {}) {
|
|
|
117
143
|
const table = (0, index_1.Users)(dataContext);
|
|
118
144
|
const user = await table.get(userId);
|
|
119
145
|
if (user) {
|
|
146
|
+
const trustLevel = includeTrustLevel ? await (0, index_1.getUserTrustLevel)(dataContext, user.userId) : undefined;
|
|
120
147
|
return {
|
|
121
148
|
...user,
|
|
122
|
-
source: 'otherDataContexts'
|
|
149
|
+
source: 'otherDataContexts',
|
|
150
|
+
trustLevel,
|
|
123
151
|
};
|
|
124
152
|
}
|
|
125
153
|
}
|