var db = require('../../common/db') var auth = require('../../common/auth') var RESPONSE = require('../../common/response').RESPONSE var ERROR_CODES = require('../../common/response').ERROR_CODES exports.main_handler = async function (event) { try { var method = event.httpMethod || 'GET' var path = event.path || '' var body = parseBody(event) if (method === 'POST' && path === '/api/v1/treatment/sync') { return await syncRecord(event, body) } if (method === 'GET' && path === '/api/v1/treatment/history') { return await getHistory(event, body) } return RESPONSE.error(ERROR_CODES.PARAM_ERROR.code, 'unknown route') } catch (err) { console.error('treatment error:', err) return RESPONSE.error(ERROR_CODES.SERVER_ERROR.code, err.message) } } async function syncRecord(event, body) { var user = auth.extractUser(event) if (!user) return RESPONSE.error(ERROR_CODES.INVALID_TOKEN.code, ERROR_CODES.INVALID_TOKEN.message) if (!body.session_id || !body.device_id) { return RESPONSE.error(ERROR_CODES.PARAM_ERROR.code, 'missing session_id or device_id') } var devices = await db.query( 'SELECT id FROM devices WHERE device_id = ? AND deleted_at IS NULL LIMIT 1', [body.device_id] ) if (devices.length === 0) { return RESPONSE.error(ERROR_CODES.DEVICE_NOT_FOUND.code, ERROR_CODES.DEVICE_NOT_FOUND.message) } var devicePkId = devices[0].id var existingSession = await db.query( 'SELECT id FROM sessions WHERE session_id = ? LIMIT 1', [body.session_id] ) if (existingSession.length === 0) { await db.insert( 'INSERT INTO sessions (session_id, user_id, device_id, status, started_at, ended_at) VALUES (?, ?, ?, 2, ?, ?)', [ body.session_id, user.user_id, devicePkId, body.start_time ? new Date(body.start_time).toISOString().slice(0, 19).replace('T', ' ') : null, body.end_time ? new Date(body.end_time).toISOString().slice(0, 19).replace('T', ' ') : null ] ) } var existingRecord = await db.query( 'SELECT id FROM treatment_records WHERE session_id = ? LIMIT 1', [body.session_id] ) if (existingRecord.length > 0) { return RESPONSE.success({ record_id: existingRecord[0].id }) } var result = await db.insert( 'INSERT INTO treatment_records (session_id, user_id, device_id, regions, total_duration_ms, mode, avg_pd, sync_status, synced_at, started_at, ended_at) ' + 'VALUES (?, ?, ?, ?, ?, ?, ?, 2, NOW(), ?, ?)', [ body.session_id, user.user_id, devicePkId, body.regions || null, body.total_duration_ms || null, body.mode !== undefined ? body.mode : null, body.avg_pd || null, body.start_time ? new Date(body.start_time).toISOString().slice(0, 19).replace('T', ' ') : null, body.end_time ? new Date(body.end_time).toISOString().slice(0, 19).replace('T', ' ') : null ] ) if (body.pd_data && Array.isArray(body.pd_data)) { for (var i = 0; i < body.pd_data.length; i++) { var pd = body.pd_data[i] await db.insert( 'INSERT INTO pd_data (session_id, device_id, region_name, pd_value, recorded_at) VALUES (?, ?, ?, ?, ?)', [body.session_id, devicePkId, pd.name, pd.pd || null, new Date().toISOString().slice(0, 19).replace('T', ' ')] ) } } return RESPONSE.success({ record_id: result.insertId }) } async function getHistory(event, body) { var user = auth.extractUser(event) if (!user) return RESPONSE.error(ERROR_CODES.INVALID_TOKEN.code, ERROR_CODES.INVALID_TOKEN.message) var page = parseInt(body.page) || 1 var pageSize = parseInt(body.page_size) || 20 var offset = (page - 1) * pageSize var totalResult = await db.query( 'SELECT COUNT(*) AS cnt FROM treatment_records WHERE user_id = ?', [user.user_id] ) var total = totalResult[0].cnt var records = await db.query( 'SELECT tr.id AS record_id, tr.session_id, tr.regions, tr.total_duration_ms, tr.mode, tr.avg_pd, tr.started_at AS start_time, tr.ended_at AS end_time, d.device_id, d.device_name ' + 'FROM treatment_records tr ' + 'JOIN devices d ON tr.device_id = d.id ' + 'WHERE tr.user_id = ? ' + 'ORDER BY tr.started_at DESC LIMIT ? OFFSET ?', [user.user_id, pageSize, offset] ) return RESPONSE.paginate(records, total, page, pageSize) } function parseBody(event) { if (event.body) { try { return JSON.parse(event.body) } catch (e) { return {} } } return event.queryStringParameters || {} }