131 行
4.4 KiB
JavaScript
131 行
4.4 KiB
JavaScript
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 || {}
|
|
}
|