ble-server/route/dashboard.js

140 lines
3.4 KiB
JavaScript

/* eslint-disable no-throw-literal */
/* eslint-disable */
const KoaRouter = require('koa-router')
const router = new KoaRouter()
const fs = require('fs')
const path = require('path')
const Printer = require('../PrinterDev')
const KoaBody = require('koa-body')
const uuid = require('uuid')
const config = require('../config.json')
/* eslint-enable */
router.use(async (c, n) => {
c.data = {
title: 'Printer System Dashboard'
}
let status = 1
try {
await n()
} catch (err) {
status = 0
if (typeof err === 'string') {
c.body = err
} else {
c.body = err.toString()
}
}
if (c.async) {
c.body = {
status,
msg: c.body
}
}
})
router.get('/', async (c, n) => {
c.data.route = 'index'
await c.render('dashboard/index', c.data)
})
router.get('/setting', async (c, n) => {
c.data.route = 'setting'
let ttys = await new Promise((resolve, reject) => {
fs.readdir(path.resolve('/dev'), (err, list) => {
if (err) return resolve([])
let arr = []
for (let it of list) {
if (/^tty[A-z]/.test(it)) {
arr.push(path.resolve('/dev', it))
}
}
resolve(arr)
})
})
c.data.ttys = ttys
c.data.defConfig = config
await c.render('dashboard/index', c.data)
})
router.post('/api/print', KoaBody(), async (c, n) => {
c.async = true
let arr = c.request.body
if (!arr.data) throw 'print data empty'
if (config.api.secret && !arr.key) throw 'access key enpty'
if (config.api.secret !== arr.key.trim()) throw 'access key error'
let status = await Printer.printerString(arr.data)
if (!status) throw 'printer fail'
c.body = 'print success'
})
.post('/api/printer_test', KoaBody(), async (c, n) => {
c.async = true
let arr = c.request.body
if (!arr.device) throw '請輸入印表機連接埠'
let device = arr.device
let feed = arr.feed || 8
if (!isFinite(feed) || feed < 0) throw '切紙前換行必須是整數'
feed = typeof feed !== 'number' ? Math.floor(parseInt(feed)) : feed
let oriDev = Printer.serial
let oriFeed = Printer.feed
if (Printer.isOpen) {
await Printer.close()
}
Printer.serial = device
Printer.feed = feed
let status = await Printer.printTestPage()
if (!status) c.body = '測試失敗'
else c.body = '測試成功'
Printer.serial = oriDev
Printer.feed = oriFeed
await Printer.connect()
})
.post('/api/write_config', KoaBody(), async (c, n) => {
c.async = true
let arr = c.request.body
if (!arr.tty) throw '請輸入印表機連接埠'
if (!arr.ble || (arr.ble !== 'yes' && arr.ble !== 'no')) throw '請輸入藍牙啟用設定'
let feed = arr.feed || 8
if (!isFinite(feed) || feed < 0) throw '切紙前換行必須是整數'
feed = typeof feed !== 'number' ? Math.floor(parseInt(feed)) : feed
let json = Object.assign({}, config)
json.ble.enable = arr.ble === 'yes'
json.printer.serial = arr.tty
json.printer.feed = feed
json.api.secret = arr.secret || ''
let wconfig = await new Promise((resolve, reject) => {
fs.writeFile(path.resolve(process.env.PROJECT_ROOT, 'config.json'), JSON.stringify(json, null, 2), {
mode: 0o664,
encoding: 'utf8',
flag: 'w'
}, err => {
if (err) return resolve(false)
return resolve(true)
})
})
if (!wconfig) throw '設定檔寫入失敗'
c.body = '設定檔寫入成功'
})
module.exports = router