feat: add MariaDB schema and connection pool

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-29 14:09:46 +02:00
co-authored by Claude Sonnet 5
parent 378ca762a2
commit a5ab05303f
3 changed files with 68 additions and 0 deletions
+19
View File
@@ -0,0 +1,19 @@
CREATE TABLE IF NOT EXISTS conversion_jobs (
id CHAR(36) NOT NULL PRIMARY KEY,
status ENUM('pending', 'processing', 'done', 'failed') NOT NULL DEFAULT 'pending',
family VARCHAR(32) NOT NULL,
source_format VARCHAR(16) NOT NULL,
target_format VARCHAR(16) NOT NULL,
original_filename VARCHAR(255) NOT NULL,
input_path VARCHAR(255) NOT NULL,
output_path VARCHAR(255) NULL,
input_mime_type VARCHAR(128) NOT NULL,
output_mime_type VARCHAR(128) NULL,
error_message VARCHAR(255) NULL,
error_log TEXT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
expires_at DATETIME NOT NULL,
INDEX idx_status (status),
INDEX idx_expires_at (expires_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+23
View File
@@ -0,0 +1,23 @@
import mariadb from 'mariadb';
let pool;
export function getPool(config) {
if (!pool) {
pool = mariadb.createPool({
host: config.db.host,
user: config.db.user,
password: config.db.password,
database: config.db.database,
connectionLimit: 10,
});
}
return pool;
}
export async function closePool() {
if (pool) {
await pool.end();
pool = undefined;
}
}
+26
View File
@@ -0,0 +1,26 @@
import { describe, it, expect, afterAll } from 'vitest';
import { getPool, closePool } from '../src/db.js';
import { loadConfig } from '../src/config.js';
describe('getPool', () => {
afterAll(async () => {
await closePool();
});
it('returns a working pool that can run a query', async () => {
const config = loadConfig();
const pool = getPool(config);
const rows = await pool.query('SELECT 1 AS value');
expect(Number(rows[0].value)).toBe(1);
});
it('returns the same pool instance on repeated calls', () => {
const config = loadConfig();
const poolA = getPool(config);
const poolB = getPool(config);
expect(poolA).toBe(poolB);
});
});