@dyrected/db-postgres 0.0.1
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/README.md +3 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +111 -0
- package/dist/index.js.map +1 -0
- package/package.json +22 -0
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { DatabaseAdapter, PaginatedResult } from '@dyrected/core';
|
|
2
|
+
export interface PostgresAdapterConfig {
|
|
3
|
+
url: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class PostgresAdapter implements DatabaseAdapter {
|
|
6
|
+
private db;
|
|
7
|
+
private sql;
|
|
8
|
+
constructor(config: PostgresAdapterConfig);
|
|
9
|
+
private initInternalTables;
|
|
10
|
+
private getTableName;
|
|
11
|
+
private ensureTable;
|
|
12
|
+
find(params: {
|
|
13
|
+
collection: string;
|
|
14
|
+
where?: any;
|
|
15
|
+
limit?: number;
|
|
16
|
+
page?: number;
|
|
17
|
+
}): Promise<PaginatedResult>;
|
|
18
|
+
findOne(params: {
|
|
19
|
+
collection: string;
|
|
20
|
+
id: string;
|
|
21
|
+
}): Promise<any>;
|
|
22
|
+
create(params: {
|
|
23
|
+
collection: string;
|
|
24
|
+
data: any;
|
|
25
|
+
}): Promise<any>;
|
|
26
|
+
update(params: {
|
|
27
|
+
collection: string;
|
|
28
|
+
id: string;
|
|
29
|
+
data: any;
|
|
30
|
+
}): Promise<any>;
|
|
31
|
+
delete(params: {
|
|
32
|
+
collection: string;
|
|
33
|
+
id: string;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
getGlobal(params: {
|
|
36
|
+
slug: string;
|
|
37
|
+
}): Promise<any>;
|
|
38
|
+
updateGlobal(params: {
|
|
39
|
+
slug: string;
|
|
40
|
+
data: any;
|
|
41
|
+
}): Promise<any>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKlE,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,GAAG,CAAe;gBAEd,MAAM,EAAE,qBAAqB;YAM3B,kBAAkB;IAShC,OAAO,CAAC,YAAY;YAIN,WAAW;IAYnB,IAAI,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC;IAqC1G,OAAO,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;IASlD,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE;IAYhD,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE;IAO5D,MAAM,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE;IAMjD,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;IAOlC,YAAY,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,GAAG,CAAA;KAAE;CAQvD"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import postgres from 'postgres';
|
|
2
|
+
import { drizzle } from 'drizzle-orm/postgres-js';
|
|
3
|
+
export class PostgresAdapter {
|
|
4
|
+
db;
|
|
5
|
+
sql;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.sql = postgres(config.url);
|
|
8
|
+
this.db = drizzle(this.sql);
|
|
9
|
+
this.initInternalTables();
|
|
10
|
+
}
|
|
11
|
+
async initInternalTables() {
|
|
12
|
+
await this.sql `
|
|
13
|
+
CREATE TABLE IF NOT EXISTS dyrected_internal (
|
|
14
|
+
key TEXT PRIMARY KEY,
|
|
15
|
+
value JSONB
|
|
16
|
+
)
|
|
17
|
+
`;
|
|
18
|
+
}
|
|
19
|
+
getTableName(slug) {
|
|
20
|
+
return `collection_${slug}`;
|
|
21
|
+
}
|
|
22
|
+
async ensureTable(slug) {
|
|
23
|
+
const tableName = this.getTableName(slug);
|
|
24
|
+
await this.sql `
|
|
25
|
+
CREATE TABLE IF NOT EXISTS ${this.sql(tableName)} (
|
|
26
|
+
id TEXT PRIMARY KEY,
|
|
27
|
+
data JSONB,
|
|
28
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
29
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
|
|
30
|
+
)
|
|
31
|
+
`;
|
|
32
|
+
}
|
|
33
|
+
async find(params) {
|
|
34
|
+
await this.ensureTable(params.collection);
|
|
35
|
+
const tableName = this.getTableName(params.collection);
|
|
36
|
+
const limit = params.limit || 10;
|
|
37
|
+
const page = params.page || 1;
|
|
38
|
+
const offset = (page - 1) * limit;
|
|
39
|
+
let whereClause = this.sql ``;
|
|
40
|
+
if (params.where) {
|
|
41
|
+
const conditions = Object.entries(params.where).map(([key, value]) => {
|
|
42
|
+
if (key === 'id')
|
|
43
|
+
return this.sql `id = ${value}`;
|
|
44
|
+
return this.sql `data->>${key} = ${value}`;
|
|
45
|
+
});
|
|
46
|
+
if (conditions.length > 0) {
|
|
47
|
+
whereClause = this.sql `WHERE ${conditions.reduce((acc, curr) => this.sql `${acc} AND ${curr}`)}`;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Fetch total count
|
|
51
|
+
const countRes = await this.sql `SELECT count(*) as total FROM ${this.sql(tableName)} ${whereClause}`;
|
|
52
|
+
const total = parseInt(countRes[0].total);
|
|
53
|
+
// Fetch data
|
|
54
|
+
const rows = await this.sql `
|
|
55
|
+
SELECT * FROM ${this.sql(tableName)}
|
|
56
|
+
${whereClause}
|
|
57
|
+
LIMIT ${limit} OFFSET ${offset}
|
|
58
|
+
`;
|
|
59
|
+
return {
|
|
60
|
+
docs: rows.map(r => ({ id: r.id, ...r.data })),
|
|
61
|
+
total,
|
|
62
|
+
limit,
|
|
63
|
+
page
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async findOne(params) {
|
|
67
|
+
await this.ensureTable(params.collection);
|
|
68
|
+
const tableName = this.getTableName(params.collection);
|
|
69
|
+
const rows = await this.sql `SELECT * FROM ${this.sql(tableName)} WHERE id = ${params.id}`;
|
|
70
|
+
const row = rows[0];
|
|
71
|
+
if (!row)
|
|
72
|
+
return null;
|
|
73
|
+
return { id: row.id, ...row.data };
|
|
74
|
+
}
|
|
75
|
+
async create(params) {
|
|
76
|
+
await this.ensureTable(params.collection);
|
|
77
|
+
const tableName = this.getTableName(params.collection);
|
|
78
|
+
const id = params.data.id || Math.random().toString(36).substring(7);
|
|
79
|
+
const data = { ...params.data };
|
|
80
|
+
delete data.id;
|
|
81
|
+
await this.sql `INSERT INTO ${this.sql(tableName)} (id, data) VALUES (${id}, ${data})`;
|
|
82
|
+
return { id, ...data };
|
|
83
|
+
}
|
|
84
|
+
async update(params) {
|
|
85
|
+
await this.ensureTable(params.collection);
|
|
86
|
+
const tableName = this.getTableName(params.collection);
|
|
87
|
+
await this.sql `UPDATE ${this.sql(tableName)} SET data = ${params.data}, updated_at = CURRENT_TIMESTAMP WHERE id = ${params.id}`;
|
|
88
|
+
return { id: params.id, ...params.data };
|
|
89
|
+
}
|
|
90
|
+
async delete(params) {
|
|
91
|
+
await this.ensureTable(params.collection);
|
|
92
|
+
const tableName = this.getTableName(params.collection);
|
|
93
|
+
await this.sql `DELETE FROM ${this.sql(tableName)} WHERE id = ${params.id}`;
|
|
94
|
+
}
|
|
95
|
+
async getGlobal(params) {
|
|
96
|
+
const rows = await this.sql `SELECT value FROM dyrected_internal WHERE key = ${`global_${params.slug}`}`;
|
|
97
|
+
const row = rows[0];
|
|
98
|
+
if (!row)
|
|
99
|
+
return {};
|
|
100
|
+
return row.value;
|
|
101
|
+
}
|
|
102
|
+
async updateGlobal(params) {
|
|
103
|
+
await this.sql `
|
|
104
|
+
INSERT INTO dyrected_internal (key, value)
|
|
105
|
+
VALUES (${`global_${params.slug}`}, ${params.data})
|
|
106
|
+
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value
|
|
107
|
+
`;
|
|
108
|
+
return params.data;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dyrected/db-postgres",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"postgres": "^3.4.4",
|
|
12
|
+
"drizzle-orm": "^0.30.0",
|
|
13
|
+
"@dyrected/core": "0.0.1"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"typescript": "^5.4.5"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"dev": "tsc --watch"
|
|
21
|
+
}
|
|
22
|
+
}
|