-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
79 lines (69 loc) · 2.87 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import { serve } from "https://deno.land/[email protected]/http/server.ts";
import { Pool } from "https://deno.land/x/[email protected]/mod.ts";
const pool = new Pool({
tls: { caCertificates: [`YOUR_CERTIFICATE`] },
hostname: "HOST_NAME",
port: 12691,
password: "YOUR_PASSWORD",
database: "defaultdb",
user: "avnadmin",
}, 1);
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
'Content-Type': 'application/json'
};
serve(async (req) => {
// Handle CORS preflight requests
if (req.method === 'OPTIONS') {
return new Response(null, { headers: corsHeaders });
}
try {
const connection = await pool.connect();
const { operation, table, query, columns } = await req.json();
if (!operation) throw new Error('Operation required');
let sql = '', params = [];
console.log('Received request:', { operation, table, query, columns });
if (operation === 'CREATE_TABLE' && table && columns) {
const columnDefs = columns.map(({ name, type, nullable, default: def, isPrimary }) =>
`${name} ${type}${isPrimary ? ' PRIMARY KEY' : ''}${nullable === false ? ' NOT NULL' : ''}${def !== undefined ? ` DEFAULT ${def}` : ''}`
).join(', ');
sql = `CREATE TABLE IF NOT EXISTS ${table} (${columnDefs})`;
console.log('Creating table with SQL:', sql);
} else if (operation === 'QUERY' && query?.type) {
switch (query.type) {
case 'SELECT':
const fields = Array.isArray(query.fields) ? query.fields.join(', ') : '*';
sql = `SELECT ${fields} FROM ${query.table}`;
break;
case 'INSERT':
const cols = Object.keys(query.values);
sql = `INSERT INTO ${query.table} (${cols.join(', ')}) VALUES (${cols.map((_, i) => `$${i + 1}`).join(', ')}) RETURNING *`;
params = Object.values(query.values);
break;
case 'UPDATE':
const set = Object.keys(query.values).map((k, i) => `${k}=$${i + 1}`).join(', ');
sql = `UPDATE ${query.table} SET ${set} RETURNING *`;
params = Object.values(query.values);
break;
case 'DELETE':
sql = `DELETE FROM ${query.table} RETURNING *`;
break;
}
console.log('Executing query:', sql, 'with params:', params);
} else if (operation === 'RAW_SQL') {
sql = query.rawSql;
console.log('Executing raw SQL:', sql);
}
const result = await connection.queryObject({ text: sql, args: params });
connection.release();
console.log('Query result:', result.rows);
return new Response(JSON.stringify(result.rows), { headers: corsHeaders });
} catch (error) {
console.error('Error executing query:', error);
return new Response(JSON.stringify({ error: error.message }), {
status: 400,
headers: corsHeaders
});
}
});