import { v4 as uuidv4 } from "uuid"; import { getAdapter } from "../driver.js"; import { parseJson, stringifyJson } from "../helpers/jsonCol.js"; function rowToPool(row) { if (!row) return null; const extra = parseJson(row.data, {}); return { ...extra, id: row.id, isActive: row.isActive === 1 || row.isActive === true, testStatus: row.testStatus, createdAt: row.createdAt, updatedAt: row.updatedAt, }; } function poolToRow(p) { const { id, isActive, testStatus, createdAt, updatedAt, ...rest } = p; return { id, isActive: isActive === false ? 0 : 1, testStatus: testStatus ?? null, data: stringifyJson(rest), createdAt, updatedAt, }; } function upsert(db, p) { const r = poolToRow(p); db.run( `INSERT INTO proxyPools(id, isActive, testStatus, data, createdAt, updatedAt) VALUES(?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET isActive=excluded.isActive, testStatus=excluded.testStatus, data=excluded.data, updatedAt=excluded.updatedAt`, [r.id, r.isActive, r.testStatus, r.data, r.createdAt, r.updatedAt] ); } export async function getProxyPools(filter = {}) { const db = await getAdapter(); const where = []; const params = []; if (filter.isActive !== undefined) { where.push("isActive = ?"); params.push(filter.isActive ? 1 : 0); } if (filter.testStatus) { where.push("testStatus = ?"); params.push(filter.testStatus); } const sql = `SELECT * FROM proxyPools${where.length ? ` WHERE ${where.join(" AND ")}` : ""}`; const list = db.all(sql, params).map(rowToPool); list.sort((a, b) => new Date(b.updatedAt || 0) - new Date(a.updatedAt || 0)); return list; } export async function getProxyPoolById(id) { const db = await getAdapter(); return rowToPool(db.get(`SELECT * FROM proxyPools WHERE id = ?`, [id])); } export async function createProxyPool(data) { const db = await getAdapter(); const now = new Date().toISOString(); const pool = { id: data.id || uuidv4(), name: data.name, proxyUrl: data.proxyUrl, noProxy: data.noProxy || "", type: data.type || "http", isActive: data.isActive !== undefined ? data.isActive : true, strictProxy: data.strictProxy === true, testStatus: data.testStatus || "unknown", lastTestedAt: data.lastTestedAt || null, lastError: data.lastError || null, createdAt: now, updatedAt: now, }; upsert(db, pool); return pool; } export async function updateProxyPool(id, data) { const db = await getAdapter(); let result = null; db.transaction(() => { const row = db.get(`SELECT * FROM proxyPools WHERE id = ?`, [id]); if (!row) return; const merged = { ...rowToPool(row), ...data, updatedAt: new Date().toISOString() }; upsert(db, merged); result = merged; }); return result; } export async function deleteProxyPool(id) { const db = await getAdapter(); let removed = null; db.transaction(() => { const row = db.get(`SELECT * FROM proxyPools WHERE id = ?`, [id]); if (!row) return; removed = rowToPool(row); db.run(`DELETE FROM proxyPools WHERE id = ?`, [id]); }); return removed; }