dataflow/api/routes/records.js

112 lines
3.1 KiB
JavaScript

/**
* Records Routes
* Query and manage imported records
*/
const express = require('express');
module.exports = (pool) => {
const router = express.Router();
// List records for a source
router.get('/source/:source_name', async (req, res, next) => {
try {
const { limit = 100, offset = 0, transformed_only } = req.query;
let query = 'SELECT * FROM records WHERE source_name = $1';
const params = [req.params.source_name];
if (transformed_only === 'true') {
query += ' AND transformed IS NOT NULL';
}
query += ' ORDER BY id DESC LIMIT $2 OFFSET $3';
params.push(parseInt(limit), parseInt(offset));
const result = await pool.query(query, params);
res.json(result.rows);
} catch (err) {
next(err);
}
});
// Get single record
router.get('/:id', async (req, res, next) => {
try {
const result = await pool.query(
'SELECT * FROM records WHERE id = $1',
[req.params.id]
);
if (result.rows.length === 0) {
return res.status(404).json({ error: 'Record not found' });
}
res.json(result.rows[0]);
} catch (err) {
next(err);
}
});
// Search records
router.post('/search', async (req, res, next) => {
try {
const { source_name, query, limit = 100 } = req.body;
if (!source_name || !query) {
return res.status(400).json({
error: 'Missing required fields: source_name, query'
});
}
// Search in both data and transformed fields
const result = await pool.query(
`SELECT * FROM records
WHERE source_name = $1
AND (data @> $2 OR transformed @> $2)
ORDER BY id DESC
LIMIT $3`,
[source_name, JSON.stringify(query), parseInt(limit)]
);
res.json(result.rows);
} catch (err) {
next(err);
}
});
// Delete record
router.delete('/:id', async (req, res, next) => {
try {
const result = await pool.query(
'DELETE FROM records WHERE id = $1 RETURNING id',
[req.params.id]
);
if (result.rows.length === 0) {
return res.status(404).json({ error: 'Record not found' });
}
res.json({ success: true, deleted: result.rows[0].id });
} catch (err) {
next(err);
}
});
// Delete all records for a source
router.delete('/source/:source_name/all', async (req, res, next) => {
try {
const result = await pool.query(
'DELETE FROM records WHERE source_name = $1',
[req.params.source_name]
);
res.json({ success: true, deleted_count: result.rowCount });
} catch (err) {
next(err);
}
});
return router;
};