102 lines
4.0 KiB
JavaScript
102 lines
4.0 KiB
JavaScript
'use strict';
|
|
const express = require('express');
|
|
|
|
/**
|
|
* Ponshu Room ライセンス管理ルーター
|
|
*
|
|
* エンドポイント:
|
|
* POST /ponshu/license/validate (認証不要 — モバイルアプリから直接呼ぶ)
|
|
* POST /ponshu/admin/license/revoke (認証必須)
|
|
*/
|
|
module.exports = function createPonshuRouter(pool, authMiddleware) {
|
|
const router = express.Router();
|
|
const APP_SUPPORT_EMAIL = process.env.APP_SUPPORT_EMAIL || 'support@posimai.soar-enrich.com';
|
|
|
|
// POST /ponshu/license/validate — 認証不要
|
|
router.post('/ponshu/license/validate', async (req, res) => {
|
|
const { license_key, device_id } = req.body;
|
|
|
|
if (!license_key || !device_id) {
|
|
return res.status(400).json({ valid: false, error: 'Missing parameters' });
|
|
}
|
|
|
|
try {
|
|
const result = await pool.query(
|
|
`SELECT license_key, plan, status, device_id FROM ponshu_licenses WHERE license_key = $1`,
|
|
[license_key]
|
|
);
|
|
|
|
if (result.rows.length === 0) {
|
|
return res.json({ valid: false, error: 'ライセンスキーが見つかりません' });
|
|
}
|
|
|
|
const license = result.rows[0];
|
|
|
|
if (license.status === 'revoked') {
|
|
return res.json({
|
|
valid: false,
|
|
error: 'このライセンスは無効化されています。サポートにお問い合わせください。',
|
|
supportEmail: APP_SUPPORT_EMAIL,
|
|
});
|
|
}
|
|
|
|
// 初回アクティベート
|
|
if (!license.device_id) {
|
|
await pool.query(
|
|
`UPDATE ponshu_licenses SET device_id = $1, activated_at = NOW() WHERE license_key = $2`,
|
|
[device_id, license_key]
|
|
);
|
|
console.log(`[Ponshu] License activated: ${license_key.substring(0, 12)}... -> Device: ${device_id.substring(0, 8)}...`);
|
|
return res.json({ valid: true, plan: license.plan, activated: true });
|
|
}
|
|
|
|
// 既存デバイスの照合
|
|
if (license.device_id !== device_id) {
|
|
console.log(`[Ponshu] Device mismatch for license: ${license_key.substring(0, 12)}...`);
|
|
return res.json({
|
|
valid: false,
|
|
error: '別のデバイスで登録済みです。端末変更の場合はサポートまでご連絡ください。',
|
|
supportEmail: APP_SUPPORT_EMAIL,
|
|
});
|
|
}
|
|
|
|
return res.json({ valid: true, plan: license.plan });
|
|
|
|
} catch (err) {
|
|
console.error('[Ponshu] License validate error:', err.message);
|
|
return res.status(500).json({ valid: false, error: 'サーバーエラーが発生しました' });
|
|
}
|
|
});
|
|
|
|
// POST /ponshu/admin/license/revoke — 認証必須
|
|
router.post('/ponshu/admin/license/revoke', authMiddleware, async (req, res) => {
|
|
const { license_key } = req.body;
|
|
|
|
if (!license_key) {
|
|
return res.status(400).json({ success: false, error: 'license_key required' });
|
|
}
|
|
|
|
try {
|
|
const result = await pool.query(
|
|
`UPDATE ponshu_licenses SET status = 'revoked', revoked_at = NOW()
|
|
WHERE license_key = $1 AND status != 'revoked'
|
|
RETURNING license_key`,
|
|
[license_key]
|
|
);
|
|
|
|
if (result.rowCount === 0) {
|
|
return res.json({ success: false, error: 'License not found or already revoked' });
|
|
}
|
|
|
|
console.log(`[Ponshu] License revoked: ${license_key.substring(0, 12)}...`);
|
|
return res.json({ success: true, message: `License ${license_key} has been revoked` });
|
|
|
|
} catch (err) {
|
|
console.error('[Ponshu] Revoke error:', err.message);
|
|
return res.status(500).json({ success: false, error: 'Server error' });
|
|
}
|
|
});
|
|
|
|
return router;
|
|
};
|