@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 ADDED
@@ -0,0 +1,3 @@
1
+ # @dyrected/db-postgres
2
+
3
+ This is the db-postgres package/app for the Dyrected ecosystem.
@@ -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
+ }