zustand-storage
Version:
A universal solution combining @aivron/sync-storage and zust-api for React (web & desktop). It merges local persistence with a Zustand-inspired API to provide core storage operations, bulk actions, JSON support, TTL, and integrated React hooks.
105 lines (91 loc) • 3.4 kB
text/typescript
// src/database/PostgreSQLClient.ts
import { Client, QueryResult } from 'pg';
import { DatabaseClient } from './IDatabaseClient';
export class PostgreSQLClient implements DatabaseClient {
private client: Client;
constructor(private connectionString: string) {
this.client = new Client({ connectionString });
}
async connect(): Promise<void> {
try {
await this.client.connect();
} catch (error) {
console.error("PostgreSQL connection error:", error);
throw error;
}
}
async disconnect(): Promise<void> {
try {
await this.client.end();
} catch (error) {
console.error("PostgreSQL disconnection error:", error);
throw error;
}
}
async find(table: string, query: object): Promise<any[]> {
const keys = Object.keys(query);
const conditions = keys
.map((key, index) => `${key} = $${index + 1}`)
.join(" AND ");
const values = keys.map((key) => (query as Record<string, any>)[key]);
const sql = `SELECT * FROM ${table} WHERE ${conditions}`;
try {
const result: QueryResult = await this.client.query(sql, values);
return result.rows;
} catch (error) {
console.error("PostgreSQL find error:", error);
throw error;
}
}
async insert(table: string, data: object): Promise<any> {
const keys = Object.keys(data);
const columns = keys.join(", ");
const placeholders = keys.map((_, index) => `$${index + 1}`).join(", ");
const values = keys.map((key) => (data as Record<string, any>)[key]);
const sql = `INSERT INTO ${table} (${columns}) VALUES (${placeholders}) RETURNING *`;
try {
const result: QueryResult = await this.client.query(sql, values);
return result.rows[0];
} catch (error) {
console.error("PostgreSQL insert error:", error);
throw error;
}
}
async update(table: string, query: object, update: object): Promise<any> {
const queryKeys = Object.keys(query);
const updateKeys = Object.keys(update);
const setClause = updateKeys
.map((key, index) => `${key} = $${index + 1}`)
.join(", ");
const whereClause = queryKeys
.map((key, index) => `${key} = $${updateKeys.length + index + 1}`)
.join(" AND ");
const values = [
...updateKeys.map((key) => (update as Record<string, any>)[key]),
...queryKeys.map((key) => (query as Record<string, any>)[key])
];
const sql = `UPDATE ${table} SET ${setClause} WHERE ${whereClause} RETURNING *`;
try {
const result: QueryResult = await this.client.query(sql, values);
return result.rows;
} catch (error) {
console.error("PostgreSQL update error:", error);
throw error;
}
}
async delete(table: string, query: object): Promise<any> {
const keys = Object.keys(query);
const conditions = keys
.map((key, index) => `${key} = $${index + 1}`)
.join(" AND ");
const values = keys.map((key) => (query as Record<string, any>)[key]);
const sql = `DELETE FROM ${table} WHERE ${conditions} RETURNING *`;
try {
const result: QueryResult = await this.client.query(sql, values);
return result.rows;
} catch (error) {
console.error("PostgreSQL delete error:", error);
throw error;
}
}
}