112 lines
3.1 KiB
JavaScript
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;
|
|
};
|