Files
scoreodonto.com/backend/dist/modules/pair/pair.routes.js
T

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);
}
});