diff --git a/fems-realtime-api/src/models/SensorData.js b/fems-realtime-api/src/models/SensorData.js index 668a7fa..f2c467b 100644 --- a/fems-realtime-api/src/models/SensorData.js +++ b/fems-realtime-api/src/models/SensorData.js @@ -6,41 +6,79 @@ class SensorDataModel { async initialize() { await this.pool.query(` - CREATE TABLE IF NOT EXISTS sensor_data ( - time TIMESTAMPTZ NOT NULL, - company_id UUID NOT NULL, - device_id VARCHAR(50) NOT NULL, - data_type VARCHAR(50) NOT NULL, - value DOUBLE PRECISION NOT NULL, - metadata JSONB, - CONSTRAINT sensor_data_pk PRIMARY KEY (time, company_id, device_id) - ); - - SELECT create_hypertable('sensor_data', 'time', - chunk_time_interval => INTERVAL '1 day', - if_not_exists => TRUE - ); - - CREATE INDEX IF NOT EXISTS idx_sensor_company_device - ON sensor_data (company_id, device_id, time DESC); - `); + CREATE TABLE IF NOT EXISTS sensor_data ( + time TIMESTAMPTZ NOT NULL, + companyId UUID NOT NULL, + branchId UUID NOT NULL, + deviceId VARCHAR(50) NOT NULL, + data_type VARCHAR(50) NOT NULL, + value DOUBLE PRECISION NOT NULL, + metadata JSONB, + CONSTRAINT sensor_data_pk PRIMARY KEY (time, companyId, branchId, deviceId) + ); + + SELECT create_hypertable('sensor_data', 'time', + chunk_time_interval => INTERVAL '1 day', + if_not_exists => TRUE + ); + + CREATE INDEX IF NOT EXISTS idx_sensor_company_branch_device + ON sensor_data (companyId, branchId, deviceId, time DESC); + `); } async insert(data) { const query = ` - INSERT INTO sensor_data (time, company_id, device_id, data_type, value, metadata) - VALUES ($1, $2, $3, $4, $5, $6) - `; - + INSERT INTO sensor_data (time, companyId, branchId, deviceId, data_type, value, metadata) + VALUES ($1, $2, $3, $4, $5, $6, $7) + `; + // 매개변수 개수를 7개로 수정 await this.pool.query(query, [ data.time, data.companyId, + data.branchId, data.deviceId, data.dataType, data.value, data.metadata, ]); } + + // 데이터 조회 메서드 추가 + async getLatestByDevice(companyId, branchId, deviceId) { + const query = ` + SELECT * FROM sensor_data + WHERE companyId = $1 AND branchId = $2 AND deviceId = $3 + ORDER BY time DESC + LIMIT 1 + `; + const result = await this.pool.query(query, [ + companyId, + branchId, + deviceId, + ]); + return result.rows[0]; + } + + // 기간별 데이터 조회 + async getDataByTimeRange(companyId, branchId, deviceId, startTime, endTime) { + const query = ` + SELECT * FROM sensor_data + WHERE companyId = $1 + AND branchId = $2 + AND deviceId = $3 + AND time BETWEEN $4 AND $5 + ORDER BY time DESC + `; + const result = await this.pool.query(query, [ + companyId, + branchId, + deviceId, + startTime, + endTime, + ]); + return result.rows; + } } module.exports = SensorDataModel;