Files
dashboard/backend/models/Kandang.js
T
Alberto-Audrix 32a36cceff
CI / lint-and-test (push) Canceled after 0s
first commit
2026-07-28 08:55:05 +07:00

104 lines
3.4 KiB
JavaScript

const { query } = require('../database/db');
class Kandang {
static async getAll() {
const result = await query('SELECT * FROM kandangs ORDER BY id');
return result.rows.map(this.formatKandang);
}
static async getById(id) {
const result = await query('SELECT * FROM kandangs WHERE id = $1', [id]);
if (result.rows.length === 0) return null;
return this.formatKandang(result.rows[0]);
}
static async create(name) {
const result = await query(
'INSERT INTO kandangs (name) VALUES ($1) RETURNING *',
[name]
);
return this.formatKandang(result.rows[0]);
}
static async update(id, name) {
const result = await query(
'UPDATE kandangs SET name = $1 WHERE id = $2 RETURNING *',
[name, id]
);
if (result.rows.length === 0) return null;
return this.formatKandang(result.rows[0]);
}
static async delete(id) {
const result = await query('DELETE FROM kandangs WHERE id = $1', [id]);
return result.rowCount > 0;
}
// Get kandangs with their doc_in_count for a specific cycle
static async getByCycle(cycleId) {
const result = await query(`
SELECT k.*, kc.doc_in_count
FROM kandangs k
LEFT JOIN kandang_cycles kc ON k.id = kc.kandang_id AND kc.cycle_id = $1
ORDER BY k.id
`, [cycleId]);
return result.rows.map(row => ({
...this.formatKandang(row),
docInCount: parseInt(row.doc_in_count) || 0
}));
}
// Set doc_in_count for a kandang in a specific cycle (upsert)
static async setDocInCount(kandangId, cycleId, docInCount) {
await query(`
INSERT INTO kandang_cycles (kandang_id, cycle_id, doc_in_count)
VALUES ($1, $2, $3)
ON CONFLICT (kandang_id, cycle_id)
DO UPDATE SET doc_in_count = EXCLUDED.doc_in_count
`, [kandangId, cycleId, docInCount]);
}
// Copy DOC counts from one cycle to another (useful when starting new cycle)
static async copyDocCountsToCycle(fromCycleId, toCycleId) {
await query(`
INSERT INTO kandang_cycles (kandang_id, cycle_id, doc_in_count)
SELECT kandang_id, $2, doc_in_count
FROM kandang_cycles
WHERE cycle_id = $1
ON CONFLICT (kandang_id, cycle_id) DO NOTHING
`, [fromCycleId, toCycleId]);
}
// Get kandang by cage UUID
static async getByCageUuid(cageUuid) {
const result = await query(
'SELECT * FROM kandangs WHERE cage_uuid = $1',
[cageUuid]
);
if (result.rows.length === 0) return null;
return this.formatKandang(result.rows[0]);
}
// Update cage UUID for a kandang
static async updateCageUuid(id, cageUuid) {
const result = await query(
'UPDATE kandangs SET cage_uuid = $1, updated_at = CURRENT_TIMESTAMP WHERE id = $2 RETURNING *',
[cageUuid, id]
);
if (result.rows.length === 0) return null;
return this.formatKandang(result.rows[0]);
}
static formatKandang(record) {
return {
id: record.id,
name: record.name,
cageUuid: record.cage_uuid || null,
createdAt: record.created_at,
updatedAt: record.updated_at
};
}
}
module.exports = Kandang;