117 lines
3.9 KiB
JavaScript
117 lines
3.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.pairRouter = void 0;
|
|
const express_1 = require("express");
|
|
const zod_1 = require("zod");
|
|
const pair_service_1 = require("./pair.service");
|
|
const auth_middleware_1 = require("../../shared/middlewares/auth.middleware");
|
|
const service = new pair_service_1.PairService();
|
|
function handleError(res, err) {
|
|
if (err instanceof zod_1.z.ZodError) {
|
|
res.status(400).json({ error: 'Dados inválidos', details: err.flatten().fieldErrors });
|
|
return;
|
|
}
|
|
const e = err;
|
|
res.status(e.statusCode ?? 500).json({ error: e.message ?? 'Erro interno' });
|
|
}
|
|
// ─── Schemas ──────────────────────────────────────────────────────────────────
|
|
const requestSchema = zod_1.z.object({
|
|
email: zod_1.z.string().email(),
|
|
clientSystem: zod_1.z.string().min(1).max(100),
|
|
clientName: zod_1.z.string().min(1).max(200),
|
|
clientUrl: zod_1.z.string().url().nullable().optional(),
|
|
});
|
|
const confirmSchema = zod_1.z.object({
|
|
email: zod_1.z.string().email(),
|
|
code: zod_1.z.string().length(6),
|
|
clientSystem: zod_1.z.string().min(1).max(100),
|
|
clientName: zod_1.z.string().min(1).max(200),
|
|
clientUrl: zod_1.z.string().url().nullable().optional(),
|
|
});
|
|
// ─── Router ───────────────────────────────────────────────────────────────────
|
|
exports.pairRouter = (0, express_1.Router)();
|
|
/**
|
|
* POST /api/pair/request
|
|
* Inicia pareamento: gera OTP e envia por e-mail.
|
|
* Público (chamado pelo sistema cliente).
|
|
*/
|
|
exports.pairRouter.post('/request', async (req, res) => {
|
|
try {
|
|
const body = requestSchema.parse(req.body);
|
|
const result = await service.request({
|
|
...body,
|
|
clientUrl: body.clientUrl ?? null,
|
|
});
|
|
res.json(result);
|
|
}
|
|
catch (err) {
|
|
handleError(res, err);
|
|
}
|
|
});
|
|
/**
|
|
* POST /api/pair/confirm
|
|
* Confirma o OTP e retorna a integration_key.
|
|
* Público (chamado pelo sistema cliente com o código que o usuário digitou).
|
|
*/
|
|
exports.pairRouter.post('/confirm', async (req, res) => {
|
|
try {
|
|
const body = confirmSchema.parse(req.body);
|
|
const result = await service.confirm({
|
|
...body,
|
|
clientUrl: body.clientUrl ?? null,
|
|
});
|
|
res.json(result);
|
|
}
|
|
catch (err) {
|
|
handleError(res, err);
|
|
}
|
|
});
|
|
/**
|
|
* GET /api/pair/verify
|
|
* Verifica se uma integration_key é válida.
|
|
* Público — autenticado pelo header x-nw-key.
|
|
*/
|
|
exports.pairRouter.get('/verify', async (req, res) => {
|
|
try {
|
|
const raw = req.headers['x-nw-key'];
|
|
const key = Array.isArray(raw) ? raw[0] : raw;
|
|
if (!key) {
|
|
res.status(401).json({ error: 'Header x-nw-key ausente' });
|
|
return;
|
|
}
|
|
const result = await service.verify(key);
|
|
res.json(result);
|
|
}
|
|
catch (err) {
|
|
handleError(res, err);
|
|
}
|
|
});
|
|
/**
|
|
* GET /api/pair/connections
|
|
* Lista pares ativos do usuário autenticado.
|
|
* Protegido — requer JWT via authMiddleware.
|
|
*/
|
|
exports.pairRouter.get('/connections', auth_middleware_1.authMiddleware, async (req, res) => {
|
|
try {
|
|
const pairs = await service.list(req.tenantId);
|
|
res.json(pairs);
|
|
}
|
|
catch (err) {
|
|
handleError(res, err);
|
|
}
|
|
});
|
|
/**
|
|
* DELETE /api/pair/connections/:id
|
|
* Revoga um par do usuário autenticado.
|
|
* Protegido — requer JWT via authMiddleware.
|
|
*/
|
|
exports.pairRouter.delete('/connections/:id', auth_middleware_1.authMiddleware, async (req, res) => {
|
|
try {
|
|
const result = await service.revoke(req.tenantId, String(req.params.id));
|
|
res.json(result);
|
|
}
|
|
catch (err) {
|
|
handleError(res, err);
|
|
}
|
|
});
|