streamby-core 0.24.1 → 0.24.3
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/adapters/database/sql.d.ts +4 -4
- package/dist/adapters/database/sql.js +17 -13
- package/dist/middleware/createRouter.js +5 -3
- package/dist/middleware/routes/project.js +2 -2
- package/dist/models/Model.js +13 -12
- package/dist/models/register.d.ts +1 -1
- package/dist/models/register.js +2 -2
- package/dist/models/registry.d.ts +1 -1
- package/dist/models/registry.js +1 -5
- package/dist/pg/setup.js +2 -2
- package/package.json +1 -1
|
@@ -9,9 +9,9 @@ export declare const createSQLRawExportTable: (connection: Pool, projectId: stri
|
|
|
9
9
|
exportId: string;
|
|
10
10
|
}>;
|
|
11
11
|
export declare const sqlAdapter: {
|
|
12
|
-
find: (connection: Pool, tableName: string, filter: any) => Promise<any[]>;
|
|
12
|
+
find: (connection: Pool, tableName: string, filter: any, schema?: string) => Promise<any[]>;
|
|
13
13
|
findOne: (connection: Pool, tableName: string, filter: any, schema?: string) => Promise<any | null>;
|
|
14
|
-
create: (connection: Pool, tableName: string, data: any) => Promise<any>;
|
|
15
|
-
update: (connection: Pool, tableName: string, filter: any, data: any) => Promise<any | null>;
|
|
16
|
-
delete: (connection: Pool, tableName: string, filter: any) => Promise<number>;
|
|
14
|
+
create: (connection: Pool, tableName: string, data: any, schema?: string) => Promise<any>;
|
|
15
|
+
update: (connection: Pool, tableName: string, filter: any, data: any, schema?: string) => Promise<any | null>;
|
|
16
|
+
delete: (connection: Pool, tableName: string, filter: any, schema?: string) => Promise<number>;
|
|
17
17
|
};
|
|
@@ -44,12 +44,13 @@ const createSQLRawExportTable = async (connection, projectId, exportName, jsonDa
|
|
|
44
44
|
};
|
|
45
45
|
exports.createSQLRawExportTable = createSQLRawExportTable;
|
|
46
46
|
exports.sqlAdapter = {
|
|
47
|
-
find: async (connection, tableName, filter) => {
|
|
47
|
+
find: async (connection, tableName, filter, schema) => {
|
|
48
48
|
const keys = Object.keys(filter);
|
|
49
49
|
const values = Object.values(filter);
|
|
50
|
-
|
|
50
|
+
const fullTableName = schema ? `"${schema}"."${tableName}"` : `"${tableName}"`;
|
|
51
|
+
let query = `SELECT * FROM ${fullTableName}`;
|
|
51
52
|
if (keys.length > 0) {
|
|
52
|
-
const where = keys.map((key, i) => `"${key}" =
|
|
53
|
+
const where = keys.map((key, i) => `"${key}" = ${i + 1}`).join(' AND ');
|
|
53
54
|
query += ` WHERE ${where}`;
|
|
54
55
|
}
|
|
55
56
|
const result = await connection.query(query, values);
|
|
@@ -63,27 +64,30 @@ exports.sqlAdapter = {
|
|
|
63
64
|
const result = await connection.query(`SELECT * FROM ${fullTableName} WHERE ${where} LIMIT 1`, values);
|
|
64
65
|
return result.rows[0] || null;
|
|
65
66
|
},
|
|
66
|
-
create: async (connection, tableName, data) => {
|
|
67
|
+
create: async (connection, tableName, data, schema) => {
|
|
67
68
|
const keys = Object.keys(data).map(key => `"${key}"`).join(', ');
|
|
68
69
|
const values = Object.values(data);
|
|
69
|
-
const placeholders = values.map((_, i) =>
|
|
70
|
-
const
|
|
70
|
+
const placeholders = values.map((_, i) => `${i + 1}`).join(', ');
|
|
71
|
+
const fullTableName = schema ? `"${schema}"."${tableName}"` : `"${tableName}"`;
|
|
72
|
+
const result = await connection.query(`INSERT INTO ${fullTableName} (${keys}) VALUES (${placeholders}) RETURNING *`, values);
|
|
71
73
|
return result.rows[0];
|
|
72
74
|
},
|
|
73
|
-
update: async (connection, tableName, filter, data) => {
|
|
75
|
+
update: async (connection, tableName, filter, data, schema) => {
|
|
74
76
|
const dataKeys = Object.keys(data);
|
|
75
77
|
const filterKeys = Object.keys(filter);
|
|
76
78
|
const values = [...Object.values(data), ...Object.values(filter)];
|
|
77
|
-
const setClause = dataKeys.map((key, i) => `"${key}" =
|
|
78
|
-
const whereClause = filterKeys.map((key, i) => `"${key}" =
|
|
79
|
-
const
|
|
79
|
+
const setClause = dataKeys.map((key, i) => `"${key}" = ${i + 1}`).join(', ');
|
|
80
|
+
const whereClause = filterKeys.map((key, i) => `"${key}" = ${dataKeys.length + i + 1}`).join(' AND ');
|
|
81
|
+
const fullTableName = schema ? `"${schema}"."${tableName}"` : `"${tableName}"`;
|
|
82
|
+
const result = await connection.query(`UPDATE ${fullTableName} SET ${setClause} WHERE ${whereClause} RETURNING *`, values);
|
|
80
83
|
return result.rows[0] || null;
|
|
81
84
|
},
|
|
82
|
-
delete: async (connection, tableName, filter) => {
|
|
85
|
+
delete: async (connection, tableName, filter, schema) => {
|
|
83
86
|
const keys = Object.keys(filter);
|
|
84
87
|
const values = Object.values(filter);
|
|
85
|
-
const where = keys.map((key, i) => `"${key}" =
|
|
86
|
-
const
|
|
88
|
+
const where = keys.map((key, i) => `"${key}" = ${i + 1}`).join(' AND ');
|
|
89
|
+
const fullTableName = schema ? `"${schema}"."${tableName}"` : `"${tableName}"`;
|
|
90
|
+
const result = await connection.query(`DELETE FROM ${fullTableName} WHERE ${where}`, values);
|
|
87
91
|
return result.rowCount || 0;
|
|
88
92
|
},
|
|
89
93
|
};
|
|
@@ -20,11 +20,13 @@ function createStreamByRouter(config) {
|
|
|
20
20
|
const adapter = config.adapter || (0, storage_1.createStorageProvider)(config.storageProviders);
|
|
21
21
|
if (config.databases) {
|
|
22
22
|
const allDbIds = config.databases.map(db => db.id);
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
const sqlDbs = config.databases.filter(db => db.type === 'sql');
|
|
24
|
+
const streambySchema = sqlDbs.length > 0 ? 'streamby' : undefined;
|
|
25
|
+
(0, manager_1.registerModel)('projects', allDbIds, 'projects', streambySchema);
|
|
26
|
+
(0, manager_1.registerModel)('exports', allDbIds, 'exports', streambySchema);
|
|
25
27
|
const mainDb = config.databases.find(db => db.main);
|
|
26
28
|
if (mainDb) {
|
|
27
|
-
(0, manager_1.registerModel)('users', [mainDb.id], 'users');
|
|
29
|
+
(0, manager_1.registerModel)('users', [mainDb.id], 'users', 'accounts');
|
|
28
30
|
}
|
|
29
31
|
}
|
|
30
32
|
router.use((0, auth_2.authenticate)(config));
|
|
@@ -58,7 +58,7 @@ function projectRouter(config) {
|
|
|
58
58
|
return res.status(500).json({ message: 'Main database not configured' });
|
|
59
59
|
}
|
|
60
60
|
const userDbType = mainDb.type;
|
|
61
|
-
const User = (0, manager_1.getModel)('users', userDbType
|
|
61
|
+
const User = (0, manager_1.getModel)('users', userDbType);
|
|
62
62
|
const user = await User.findOne({ _id: auth.userId });
|
|
63
63
|
if (!user) {
|
|
64
64
|
return res.status(404).json({ message: 'User not found' });
|
|
@@ -249,7 +249,7 @@ function projectRouter(config) {
|
|
|
249
249
|
return res.status(500).json({ message: 'Main database not configured' });
|
|
250
250
|
}
|
|
251
251
|
const userDbType = mainDb.type;
|
|
252
|
-
const User = (0, manager_1.getModel)('users', userDbType
|
|
252
|
+
const User = (0, manager_1.getModel)('users', userDbType);
|
|
253
253
|
const membersWithUsernames = await Promise.all(project.members.map(async (member) => {
|
|
254
254
|
const user = await User.findOne({ _id: member.userId });
|
|
255
255
|
return {
|
package/dist/models/Model.js
CHANGED
|
@@ -23,7 +23,7 @@ class Model {
|
|
|
23
23
|
const connection = (0, connectionManager_1.getConnection)(id);
|
|
24
24
|
return connection.type === dbType;
|
|
25
25
|
});
|
|
26
|
-
return new Model(filteredConnectionIds, this.tableName);
|
|
26
|
+
return new Model(filteredConnectionIds, this.tableName, this.schema);
|
|
27
27
|
}
|
|
28
28
|
async find(filter) {
|
|
29
29
|
const allResults = [];
|
|
@@ -42,10 +42,11 @@ class Model {
|
|
|
42
42
|
if (this.tableName === 'projects' && processedFilter.members && processedFilter.members.$elemMatch) {
|
|
43
43
|
// Handle members filter for SQL projects
|
|
44
44
|
const userId = processedFilter.members.$elemMatch.userId;
|
|
45
|
+
const schema = this.schema || 'streamby'; // Default to 'streamby' if schema not provided
|
|
45
46
|
const query = `
|
|
46
47
|
SELECT p.*, pm."userId" as memberUserId, pm.archived as memberArchived
|
|
47
|
-
FROM "projects" p
|
|
48
|
-
JOIN "project_members" pm ON p.id = pm."projectId"
|
|
48
|
+
FROM "${schema}"."projects" p
|
|
49
|
+
JOIN "${schema}"."project_members" pm ON p.id = pm."projectId"
|
|
49
50
|
WHERE pm."userId" = $1
|
|
50
51
|
`;
|
|
51
52
|
const result = await connection.query(query, [userId]);
|
|
@@ -60,13 +61,13 @@ class Model {
|
|
|
60
61
|
}
|
|
61
62
|
else {
|
|
62
63
|
// General SQL find
|
|
63
|
-
sqlResults = await sql_1.sqlAdapter.find(connection, this.tableName, processedFilter);
|
|
64
|
+
sqlResults = await sql_1.sqlAdapter.find(connection, this.tableName, processedFilter, this.schema);
|
|
64
65
|
}
|
|
65
66
|
for (const item of sqlResults) {
|
|
66
67
|
const transformedItem = this.transformResult(item);
|
|
67
68
|
if (this.tableName === 'projects' && !transformedItem.members) {
|
|
68
69
|
// For projects, if members not already populated by join, fetch from project_members table
|
|
69
|
-
const projectMembers = await sql_1.sqlAdapter.find(connection, 'project_members', { projectId: transformedItem.id });
|
|
70
|
+
const projectMembers = await sql_1.sqlAdapter.find(connection, 'project_members', { projectId: transformedItem.id }, this.schema);
|
|
70
71
|
transformedItem.members = projectMembers.map((member) => ({
|
|
71
72
|
userId: member.userId,
|
|
72
73
|
role: member.role, // Assuming role is also stored in project_members
|
|
@@ -106,7 +107,7 @@ class Model {
|
|
|
106
107
|
}
|
|
107
108
|
// Special handling for 'users' table with raw query
|
|
108
109
|
if (this.tableName === 'users' && processedFilter.id) {
|
|
109
|
-
const schema = this.schema || '
|
|
110
|
+
const schema = this.schema || 'streamby'; // Default to 'streamby' if schema not provided
|
|
110
111
|
const query = `SELECT * FROM "${schema}"."${this.tableName}" WHERE "id" = $1::uuid LIMIT 1`;
|
|
111
112
|
const result = await connection.query(query, [processedFilter.id]);
|
|
112
113
|
return result.rows[0] || null;
|
|
@@ -116,7 +117,7 @@ class Model {
|
|
|
116
117
|
const transformedResult = this.transformResult(result);
|
|
117
118
|
if (this.tableName === 'projects') {
|
|
118
119
|
// For projects, fetch members from project_members table
|
|
119
|
-
const projectMembers = await sql_1.sqlAdapter.find(connection, 'project_members', { projectId: transformedResult.id });
|
|
120
|
+
const projectMembers = await sql_1.sqlAdapter.find(connection, 'project_members', { projectId: transformedResult.id }, this.schema);
|
|
120
121
|
transformedResult.members = projectMembers.map((member) => ({
|
|
121
122
|
userId: member.userId,
|
|
122
123
|
role: member.role, // Assuming role is also stored in project_members
|
|
@@ -171,7 +172,7 @@ class Model {
|
|
|
171
172
|
dataToInsert[key] = data[key];
|
|
172
173
|
}
|
|
173
174
|
}
|
|
174
|
-
const created = await sql_1.sqlAdapter.create(connection, this.tableName, dataToInsert);
|
|
175
|
+
const created = await sql_1.sqlAdapter.create(connection, this.tableName, dataToInsert, this.schema);
|
|
175
176
|
// Insert members into project_members table for SQL
|
|
176
177
|
if (this.tableName === 'projects' && membersToInsert.length > 0) {
|
|
177
178
|
for (const member of membersToInsert) {
|
|
@@ -180,7 +181,7 @@ class Model {
|
|
|
180
181
|
userId: member.userId,
|
|
181
182
|
role: member.role,
|
|
182
183
|
archived: member.archived || false,
|
|
183
|
-
});
|
|
184
|
+
}, this.schema);
|
|
184
185
|
}
|
|
185
186
|
}
|
|
186
187
|
return created;
|
|
@@ -236,7 +237,7 @@ class Model {
|
|
|
236
237
|
if (dbType === 'sql') {
|
|
237
238
|
// For SQL, directly update the project_members table
|
|
238
239
|
const memberUpdateResult = await sql_1.sqlAdapter.update(connection, 'project_members', { projectId: originalProjectId, userId: userIdToUpdate }, // originalProjectId is fine for SQL
|
|
239
|
-
{ archived: newArchivedStatus, archivedBy: archivedBy, archivedAt: archivedAt });
|
|
240
|
+
{ archived: newArchivedStatus, archivedBy: archivedBy, archivedAt: archivedAt }, this.schema);
|
|
240
241
|
// After updating the member, fetch the full project to return
|
|
241
242
|
if (memberUpdateResult) {
|
|
242
243
|
const updatedProject = await this.findOne({ _id: originalProjectId });
|
|
@@ -267,7 +268,7 @@ class Model {
|
|
|
267
268
|
// General update logic
|
|
268
269
|
// Use the correctly constructed updateFilter
|
|
269
270
|
if (dbType === 'sql') {
|
|
270
|
-
const result = await sql_1.sqlAdapter.update(connection, this.tableName, updateFilter, data);
|
|
271
|
+
const result = await sql_1.sqlAdapter.update(connection, this.tableName, updateFilter, data, this.schema);
|
|
271
272
|
if (result)
|
|
272
273
|
return result;
|
|
273
274
|
}
|
|
@@ -293,7 +294,7 @@ class Model {
|
|
|
293
294
|
delete processedFilter._id;
|
|
294
295
|
}
|
|
295
296
|
console.log(`SQL: Deleting from ${this.tableName} with filter:`, processedFilter);
|
|
296
|
-
const count = await sql_1.sqlAdapter.delete(connection, this.tableName, processedFilter);
|
|
297
|
+
const count = await sql_1.sqlAdapter.delete(connection, this.tableName, processedFilter, this.schema);
|
|
297
298
|
console.log(`SQL: Deleted ${count} rows from ${this.tableName}`);
|
|
298
299
|
deletedCount += count;
|
|
299
300
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const registerModel: (name: string, connectionIds: string[], tableName: string) => void;
|
|
1
|
+
export declare const registerModel: (name: string, connectionIds: string[], tableName: string, schema?: string) => void;
|
package/dist/models/register.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.registerModel = void 0;
|
|
4
4
|
const registry_1 = require("./registry");
|
|
5
|
-
const registerModel = (name, connectionIds, tableName) => {
|
|
6
|
-
(0, registry_1.defineModel)(name, connectionIds, tableName);
|
|
5
|
+
const registerModel = (name, connectionIds, tableName, schema) => {
|
|
6
|
+
(0, registry_1.defineModel)(name, connectionIds, tableName, schema);
|
|
7
7
|
};
|
|
8
8
|
exports.registerModel = registerModel;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { Model } from './Model';
|
|
2
2
|
export declare const defineModel: (name: string, connectionIds: string[], tableName: string, schema?: string) => void;
|
|
3
|
-
export declare const getModel: (name: string, dbType?: string
|
|
3
|
+
export declare const getModel: (name: string, dbType?: string) => Model<any>;
|
package/dist/models/registry.js
CHANGED
|
@@ -7,15 +7,11 @@ const defineModel = (name, connectionIds, tableName, schema) => {
|
|
|
7
7
|
models[name] = new Model_1.Model(connectionIds, tableName, schema);
|
|
8
8
|
};
|
|
9
9
|
exports.defineModel = defineModel;
|
|
10
|
-
const getModel = (name, dbType
|
|
10
|
+
const getModel = (name, dbType) => {
|
|
11
11
|
const model = models[name];
|
|
12
12
|
if (!model) {
|
|
13
13
|
throw new Error(`Model ${name} not defined.`);
|
|
14
14
|
}
|
|
15
|
-
// If a schema is provided, create a new Model instance with the specified schema
|
|
16
|
-
if (schema) {
|
|
17
|
-
return new Model_1.Model(model.getConnectionIds(), model.getTableName(), schema); // Use getters
|
|
18
|
-
}
|
|
19
15
|
if (dbType) {
|
|
20
16
|
return model.useDbType(dbType);
|
|
21
17
|
}
|
package/dist/pg/setup.js
CHANGED
|
@@ -32,7 +32,7 @@ async function setupStreambyPg({ pool, schema = 'streamby', reset = false, allow
|
|
|
32
32
|
// Read and append reset SQL if reset is true
|
|
33
33
|
if (reset) {
|
|
34
34
|
console.log(`[StreamByPgSetup] Resetting schema "${schema}"...`);
|
|
35
|
-
const resetSqlPath = (0, node_path_1.join)(
|
|
35
|
+
const resetSqlPath = (0, node_path_1.join)(process.cwd(), 'src/sql/reset.sql');
|
|
36
36
|
const resetSql = await node_fs_1.promises.readFile(resetSqlPath, 'utf8');
|
|
37
37
|
fullSql += resetSql;
|
|
38
38
|
result.didReset = true;
|
|
@@ -46,7 +46,7 @@ async function setupStreambyPg({ pool, schema = 'streamby', reset = false, allow
|
|
|
46
46
|
}
|
|
47
47
|
// Read and append setup SQL
|
|
48
48
|
console.log(`[StreamByPgSetup] Creating/updating tables and indexes in schema "${schema}"...`);
|
|
49
|
-
const setupSqlPath = (0, node_path_1.join)(
|
|
49
|
+
const setupSqlPath = (0, node_path_1.join)(process.cwd(), 'src/sql/setup.sql');
|
|
50
50
|
const setupSql = await node_fs_1.promises.readFile(setupSqlPath, 'utf8');
|
|
51
51
|
fullSql += setupSql;
|
|
52
52
|
result.didCreateTables = true; // Assuming if setup.sql runs, tables are handled
|