@eva_solutions/auth-sdk 0.0.0-stage → 3.0.0-dev-20261109133200
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +290 -0
- package/LICENSE +21 -0
- package/README.md +481 -2
- package/dist/admin/index.cjs +4 -0
- package/dist/admin/index.d.cts +2 -0
- package/dist/admin/index.d.ts +2 -0
- package/dist/admin/index.js +1 -0
- package/dist/admin-DjvuvuI8.js +408 -0
- package/dist/admin-DjvuvuI8.js.map +1 -0
- package/dist/admin-Q6lbWqLM.cjs +419 -0
- package/dist/admin-Q6lbWqLM.cjs.map +1 -0
- package/dist/api-path-2Ulruz7R.cjs +34 -0
- package/dist/api-path-2Ulruz7R.cjs.map +1 -0
- package/dist/api-path-B-vSkL2H.js +29 -0
- package/dist/api-path-B-vSkL2H.js.map +1 -0
- package/dist/auth-19r-Q6X2.js +84 -0
- package/dist/auth-19r-Q6X2.js.map +1 -0
- package/dist/auth-DX1N5JA4.cjs +131 -0
- package/dist/auth-DX1N5JA4.cjs.map +1 -0
- package/dist/auth-handlers-B3iJaPln.js +343 -0
- package/dist/auth-handlers-B3iJaPln.js.map +1 -0
- package/dist/auth-handlers-BTbXKJms.d.ts +15 -0
- package/dist/auth-handlers-BTbXKJms.d.ts.map +1 -0
- package/dist/auth-handlers-CDzGFDTu.cjs +404 -0
- package/dist/auth-handlers-CDzGFDTu.cjs.map +1 -0
- package/dist/auth-handlers-DRUUTEtW.d.cts +15 -0
- package/dist/auth-handlers-DRUUTEtW.d.cts.map +1 -0
- package/dist/catalog-CHPqldcj.cjs +172 -0
- package/dist/catalog-CHPqldcj.cjs.map +1 -0
- package/dist/catalog-CIqpzgsM.d.cts +75 -0
- package/dist/catalog-CIqpzgsM.d.cts.map +1 -0
- package/dist/catalog-CIqpzgsM.d.ts +75 -0
- package/dist/catalog-CIqpzgsM.d.ts.map +1 -0
- package/dist/catalog-DqPhtCKZ.js +95 -0
- package/dist/catalog-DqPhtCKZ.js.map +1 -0
- package/dist/config-3avoUa9e.d.cts +95 -0
- package/dist/config-3avoUa9e.d.cts.map +1 -0
- package/dist/config-COX7rGAP.d.ts +95 -0
- package/dist/config-COX7rGAP.d.ts.map +1 -0
- package/dist/constants-BE1_9Tod.cjs +52 -0
- package/dist/constants-BE1_9Tod.cjs.map +1 -0
- package/dist/constants-BY7QZokc.js +29 -0
- package/dist/constants-BY7QZokc.js.map +1 -0
- package/dist/constants-CcbhOaAP.cjs +153 -0
- package/dist/constants-CcbhOaAP.cjs.map +1 -0
- package/dist/constants-rNuD5qJn.js +94 -0
- package/dist/constants-rNuD5qJn.js.map +1 -0
- package/dist/contracts/index.cjs +1006 -0
- package/dist/contracts/index.cjs.map +1 -0
- package/dist/contracts/index.d.cts +488 -0
- package/dist/contracts/index.d.cts.map +1 -0
- package/dist/contracts/index.d.ts +488 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +817 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/cookies-DCIcr7uy.cjs +94 -0
- package/dist/cookies-DCIcr7uy.cjs.map +1 -0
- package/dist/cookies-DKEC7AWv.js +71 -0
- package/dist/cookies-DKEC7AWv.js.map +1 -0
- package/dist/delegated-token-CVNbMNfy.js +426 -0
- package/dist/delegated-token-CVNbMNfy.js.map +1 -0
- package/dist/delegated-token-DHSK4rHI.cjs +461 -0
- package/dist/delegated-token-DHSK4rHI.cjs.map +1 -0
- package/dist/error-helpers-0woh13Wd.d.cts +105 -0
- package/dist/error-helpers-0woh13Wd.d.cts.map +1 -0
- package/dist/error-helpers-Ct3AUK1I.d.ts +105 -0
- package/dist/error-helpers-Ct3AUK1I.d.ts.map +1 -0
- package/dist/error-helpers-XCh4ZJ-g.cjs +282 -0
- package/dist/error-helpers-XCh4ZJ-g.cjs.map +1 -0
- package/dist/error-helpers-lnwgNOw9.js +145 -0
- package/dist/error-helpers-lnwgNOw9.js.map +1 -0
- package/dist/error-messages-CGpW1fsg.d.cts +48 -0
- package/dist/error-messages-CGpW1fsg.d.cts.map +1 -0
- package/dist/error-messages-CGpW1fsg.d.ts +48 -0
- package/dist/error-messages-CGpW1fsg.d.ts.map +1 -0
- package/dist/event-codes-BBJHon-I.cjs +48 -0
- package/dist/event-codes-BBJHon-I.cjs.map +1 -0
- package/dist/event-codes-BgcJWsov.d.cts +42 -0
- package/dist/event-codes-BgcJWsov.d.cts.map +1 -0
- package/dist/event-codes-BgcJWsov.d.ts +42 -0
- package/dist/event-codes-BgcJWsov.d.ts.map +1 -0
- package/dist/event-codes-DR5_VlaR.js +43 -0
- package/dist/event-codes-DR5_VlaR.js.map +1 -0
- package/dist/generic/index.cjs +91 -0
- package/dist/generic/index.cjs.map +1 -0
- package/dist/generic/index.d.cts +27 -0
- package/dist/generic/index.d.cts.map +1 -0
- package/dist/generic/index.d.ts +27 -0
- package/dist/generic/index.d.ts.map +1 -0
- package/dist/generic/index.js +80 -0
- package/dist/generic/index.js.map +1 -0
- package/dist/hono/index.cjs +309 -0
- package/dist/hono/index.cjs.map +1 -0
- package/dist/hono/index.d.cts +272 -0
- package/dist/hono/index.d.cts.map +1 -0
- package/dist/hono/index.d.ts +272 -0
- package/dist/hono/index.d.ts.map +1 -0
- package/dist/hono/index.js +290 -0
- package/dist/hono/index.js.map +1 -0
- package/dist/hono-openapi/index.cjs +326 -0
- package/dist/hono-openapi/index.cjs.map +1 -0
- package/dist/hono-openapi/index.d.cts +14 -0
- package/dist/hono-openapi/index.d.cts.map +1 -0
- package/dist/hono-openapi/index.d.ts +14 -0
- package/dist/hono-openapi/index.d.ts.map +1 -0
- package/dist/hono-openapi/index.js +307 -0
- package/dist/hono-openapi/index.js.map +1 -0
- package/dist/http-client-BVF3iktR.cjs +211 -0
- package/dist/http-client-BVF3iktR.cjs.map +1 -0
- package/dist/http-client-Da0-OMfc.js +206 -0
- package/dist/http-client-Da0-OMfc.js.map +1 -0
- package/dist/index-CIH_2t7Y.d.ts +240 -0
- package/dist/index-CIH_2t7Y.d.ts.map +1 -0
- package/dist/index-CZru7c5T.d.cts +1711 -0
- package/dist/index-CZru7c5T.d.cts.map +1 -0
- package/dist/index-CZru7c5T.d.ts +1711 -0
- package/dist/index-CZru7c5T.d.ts.map +1 -0
- package/dist/index-DMVe5IJA.d.cts +240 -0
- package/dist/index-DMVe5IJA.d.cts.map +1 -0
- package/dist/index-DRWKobSp.d.ts +312 -0
- package/dist/index-DRWKobSp.d.ts.map +1 -0
- package/dist/index-DU9wJ-P2.d.cts +312 -0
- package/dist/index-DU9wJ-P2.d.cts.map +1 -0
- package/dist/index-DbiXllNy.d.cts +66 -0
- package/dist/index-DbiXllNy.d.cts.map +1 -0
- package/dist/index-z9r98qlk.d.ts +66 -0
- package/dist/index-z9r98qlk.d.ts.map +1 -0
- package/dist/index.cjs +89 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +114 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +114 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt-BBNqk0TV.cjs +155 -0
- package/dist/jwt-BBNqk0TV.cjs.map +1 -0
- package/dist/jwt-DhqgH94B.js +150 -0
- package/dist/jwt-DhqgH94B.js.map +1 -0
- package/dist/key-resolver-CESqj4-P.cjs +45 -0
- package/dist/key-resolver-CESqj4-P.cjs.map +1 -0
- package/dist/key-resolver-D56I2Zpz.js +34 -0
- package/dist/key-resolver-D56I2Zpz.js.map +1 -0
- package/dist/parse-error-response-6qOQS5y9.cjs +316 -0
- package/dist/parse-error-response-6qOQS5y9.cjs.map +1 -0
- package/dist/parse-error-response-BM9-kjs0.js +239 -0
- package/dist/parse-error-response-BM9-kjs0.js.map +1 -0
- package/dist/path-segment-C25i6aaH.cjs +29 -0
- package/dist/path-segment-C25i6aaH.cjs.map +1 -0
- package/dist/path-segment-CyqnaFrP.js +24 -0
- package/dist/path-segment-CyqnaFrP.js.map +1 -0
- package/dist/react/index.cjs +336 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +151 -0
- package/dist/react/index.d.cts.map +1 -0
- package/dist/react/index.d.ts +151 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +300 -0
- package/dist/react/index.js.map +1 -0
- package/dist/refresh-dedup-CKaHHe7m.js +14 -0
- package/dist/refresh-dedup-CKaHHe7m.js.map +1 -0
- package/dist/refresh-dedup-CLdACQXR.cjs +19 -0
- package/dist/refresh-dedup-CLdACQXR.cjs.map +1 -0
- package/dist/rolldown-runtime-CmQyd0Gu.cjs +27 -0
- package/dist/routes-DpAzgY1V.cjs +424 -0
- package/dist/routes-DpAzgY1V.cjs.map +1 -0
- package/dist/routes-F1g5aVqP.js +347 -0
- package/dist/routes-F1g5aVqP.js.map +1 -0
- package/dist/s2s/index.cjs +24 -0
- package/dist/s2s/index.d.cts +5 -0
- package/dist/s2s/index.d.ts +5 -0
- package/dist/s2s/index.js +5 -0
- package/dist/s2s-6wbotr78.cjs +926 -0
- package/dist/s2s-6wbotr78.cjs.map +1 -0
- package/dist/s2s-B_0SIQzn.js +897 -0
- package/dist/s2s-B_0SIQzn.js.map +1 -0
- package/dist/sign-C7y6xdvT.cjs +324 -0
- package/dist/sign-C7y6xdvT.cjs.map +1 -0
- package/dist/sign-HFtcYwa-.js +259 -0
- package/dist/sign-HFtcYwa-.js.map +1 -0
- package/dist/tokens-C1nzkn21.cjs +232 -0
- package/dist/tokens-C1nzkn21.cjs.map +1 -0
- package/dist/tokens-C3Z40qd7.js +107 -0
- package/dist/tokens-C3Z40qd7.js.map +1 -0
- package/dist/types-Ai3iIFlB.d.cts +538 -0
- package/dist/types-Ai3iIFlB.d.cts.map +1 -0
- package/dist/types-Bxg4hCMc.d.cts +52 -0
- package/dist/types-Bxg4hCMc.d.cts.map +1 -0
- package/dist/types-CEABh1Zf.d.ts +96 -0
- package/dist/types-CEABh1Zf.d.ts.map +1 -0
- package/dist/types-Ci0Jq0xB.d.cts +96 -0
- package/dist/types-Ci0Jq0xB.d.cts.map +1 -0
- package/dist/types-DXg8BvEh.d.ts +52 -0
- package/dist/types-DXg8BvEh.d.ts.map +1 -0
- package/dist/types-_zY7QbM5.d.ts +538 -0
- package/dist/types-_zY7QbM5.d.ts.map +1 -0
- package/dist/webhooks/index.cjs +8 -0
- package/dist/webhooks/index.d.cts +5 -0
- package/dist/webhooks/index.d.ts +5 -0
- package/dist/webhooks/index.js +4 -0
- package/dist/webhooks-B5sAWC9W.js +74 -0
- package/dist/webhooks-B5sAWC9W.js.map +1 -0
- package/dist/webhooks-Cx11psg1.cjs +79 -0
- package/dist/webhooks-Cx11psg1.cjs.map +1 -0
- package/package.json +192 -3
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { a as HEADERS } from "./constants-rNuD5qJn.js";
|
|
2
|
+
import { d as SESSION_ROUTES, f as USER_ROUTES, i as DIRECTORIO_ROUTES, r as AUTH_ROUTES } from "./routes-F1g5aVqP.js";
|
|
3
|
+
import { t as apiPath } from "./api-path-B-vSkL2H.js";
|
|
4
|
+
import { c as isEvaAuthConfigError, s as getProduct, t as parseErrorResponse } from "./parse-error-response-BM9-kjs0.js";
|
|
5
|
+
import { r as getAuthServiceUrl } from "./constants-BY7QZokc.js";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
// src/http-client.ts
|
|
8
|
+
const AuthServiceResponseSchema = z.object({ data: z.unknown() });
|
|
9
|
+
const AUTH_SERVICE_TIMEOUT = 1e4;
|
|
10
|
+
const extractTokens = (headers) => {
|
|
11
|
+
const accessToken = headers.get(HEADERS.NEW_ACCESS_TOKEN);
|
|
12
|
+
const refreshToken = headers.get(HEADERS.NEW_REFRESH_TOKEN);
|
|
13
|
+
if (!accessToken || !refreshToken) return void 0;
|
|
14
|
+
return {
|
|
15
|
+
accessToken,
|
|
16
|
+
refreshToken
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
const authFetch = async (path, options = {}) => {
|
|
20
|
+
const { method = "GET", accessToken, refreshToken, body } = options;
|
|
21
|
+
const headers = { "content-type": "application/json" };
|
|
22
|
+
if (accessToken) headers[HEADERS.AUTHORIZATION] = `Bearer ${accessToken}`;
|
|
23
|
+
if (refreshToken) headers[HEADERS.REFRESH_TOKEN] = refreshToken;
|
|
24
|
+
try {
|
|
25
|
+
const res = await fetch(`${getAuthServiceUrl()}${path}`, {
|
|
26
|
+
method,
|
|
27
|
+
headers,
|
|
28
|
+
signal: AbortSignal.timeout(AUTH_SERVICE_TIMEOUT),
|
|
29
|
+
...body ? { body: JSON.stringify(body) } : {}
|
|
30
|
+
});
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
const body = await res.json().catch(() => null);
|
|
33
|
+
return {
|
|
34
|
+
ok: false,
|
|
35
|
+
error: parseErrorResponse(res.status, body)
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const json = await res.json();
|
|
39
|
+
const parsed = AuthServiceResponseSchema.safeParse(json);
|
|
40
|
+
if (!parsed.success) return {
|
|
41
|
+
ok: false,
|
|
42
|
+
error: {
|
|
43
|
+
kind: "sdk",
|
|
44
|
+
reason: "malformed",
|
|
45
|
+
message: "Estructura de respuesta inválida",
|
|
46
|
+
status: 502
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const data = parsed.data.data;
|
|
50
|
+
if (Array.isArray(data)) return {
|
|
51
|
+
ok: true,
|
|
52
|
+
data
|
|
53
|
+
};
|
|
54
|
+
if (options.reissuesAccessTokenOnly) {
|
|
55
|
+
const accessToken = res.headers.get(HEADERS.NEW_ACCESS_TOKEN);
|
|
56
|
+
return {
|
|
57
|
+
ok: true,
|
|
58
|
+
data: {
|
|
59
|
+
...data,
|
|
60
|
+
...accessToken ? { accessToken } : {}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const tokens = extractTokens(res.headers);
|
|
65
|
+
return {
|
|
66
|
+
ok: true,
|
|
67
|
+
data: {
|
|
68
|
+
...data,
|
|
69
|
+
...tokens ? { tokens } : {}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
} catch (err) {
|
|
73
|
+
if (isEvaAuthConfigError(err)) throw err;
|
|
74
|
+
return {
|
|
75
|
+
ok: false,
|
|
76
|
+
error: {
|
|
77
|
+
kind: "sdk",
|
|
78
|
+
reason: "network",
|
|
79
|
+
message: err instanceof Error ? err.message : "Error de red",
|
|
80
|
+
status: 0
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Solicita un código OTP. En éxito devuelve `{ message, challengeId }`:
|
|
87
|
+
* `challengeId` es opaco, el caller debe conservarlo (en memoria) y enviarlo a
|
|
88
|
+
* `login`; cada `getCode` nuevo invalida el `challengeId` anterior.
|
|
89
|
+
* El tipo es un cast: la respuesta del Auth Service no se parsea en runtime.
|
|
90
|
+
*/
|
|
91
|
+
const getCode = (params) => authFetch(apiPath(AUTH_ROUTES.getCode), {
|
|
92
|
+
method: "POST",
|
|
93
|
+
body: { phone: params.phone }
|
|
94
|
+
});
|
|
95
|
+
/**
|
|
96
|
+
* Verifica el código OTP. `challengeId` es obligatorio: debe ser el que
|
|
97
|
+
* devolvió el `getCode` que originó el código; sin el desafío vigente el Auth
|
|
98
|
+
* Service responde 401 sin consumir intentos.
|
|
99
|
+
*
|
|
100
|
+
* El `producto` del login sale SIEMPRE de `configureEvaAuth({ product })`, nunca del llamador: el
|
|
101
|
+
* access token queda emitido para ese producto. `empresaId` (opcional) deja esa empresa activa en
|
|
102
|
+
* la sesión si la persona pertenece a ella.
|
|
103
|
+
*
|
|
104
|
+
* @throws Error de configuración (`EvaAuthConfigError`) si falta `configureEvaAuth({ product })`.
|
|
105
|
+
*/
|
|
106
|
+
const login = (params) => {
|
|
107
|
+
const { phone, code, challengeId, empresaId, deviceType, os, browser, userAgent } = params;
|
|
108
|
+
return authFetch(apiPath(AUTH_ROUTES.login), {
|
|
109
|
+
method: "POST",
|
|
110
|
+
body: {
|
|
111
|
+
phone,
|
|
112
|
+
code,
|
|
113
|
+
challengeId,
|
|
114
|
+
producto: getProduct(),
|
|
115
|
+
...empresaId !== void 0 && { empresaId },
|
|
116
|
+
deviceType,
|
|
117
|
+
os,
|
|
118
|
+
browser,
|
|
119
|
+
userAgent
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Cambia la empresa activa de la sesión (`null` la deja sin empresa). Auth reemite SOLO el access
|
|
125
|
+
* token (`x-eva-new-access-token`; el refresh no rota): llega en `accessToken`. Auth valida la
|
|
126
|
+
* pertenencia; si la persona no pertenece, responde error.
|
|
127
|
+
*/
|
|
128
|
+
const setActiveEmpresa = (params) => authFetch(apiPath(AUTH_ROUTES.setActiveEmpresa), {
|
|
129
|
+
method: "POST",
|
|
130
|
+
accessToken: params.accessToken,
|
|
131
|
+
body: { empresaId: params.empresaId },
|
|
132
|
+
reissuesAccessTokenOnly: true
|
|
133
|
+
});
|
|
134
|
+
const refresh = (params) => authFetch(apiPath(AUTH_ROUTES.refresh), {
|
|
135
|
+
method: "POST",
|
|
136
|
+
refreshToken: params.refreshToken
|
|
137
|
+
});
|
|
138
|
+
const logout = (params) => authFetch(apiPath(AUTH_ROUTES.logout), {
|
|
139
|
+
method: "POST",
|
|
140
|
+
refreshToken: params.refreshToken
|
|
141
|
+
});
|
|
142
|
+
const getUser = (params) => authFetch(apiPath(USER_ROUTES.get), { accessToken: params.accessToken });
|
|
143
|
+
const updateUser = (params) => authFetch(apiPath(USER_ROUTES.update), {
|
|
144
|
+
method: "PATCH",
|
|
145
|
+
accessToken: params.accessToken,
|
|
146
|
+
body: params.data
|
|
147
|
+
});
|
|
148
|
+
const deleteUser = (params) => authFetch(apiPath(USER_ROUTES.deactivate), {
|
|
149
|
+
method: "DELETE",
|
|
150
|
+
accessToken: params.accessToken
|
|
151
|
+
});
|
|
152
|
+
const getUserEmpresas = (params) => authFetch(apiPath(USER_ROUTES.listCompanies), { accessToken: params.accessToken });
|
|
153
|
+
/**
|
|
154
|
+
* Busca en el directorio de empresas (solo las activas que optaron por aparecer; solo campos de
|
|
155
|
+
* perfil público; 50 por página). Basta el access token de usuario de CUALQUIER producto habilitado:
|
|
156
|
+
* Auth limita los pedidos por usuario. La siguiente página se pide con el `nextCursor` recibido.
|
|
157
|
+
*/
|
|
158
|
+
const getDirectorio = (params) => {
|
|
159
|
+
const { accessToken, ...filters } = params;
|
|
160
|
+
const query = new URLSearchParams();
|
|
161
|
+
for (const [key, value] of Object.entries(filters)) if (value !== void 0) query.set(key, String(value));
|
|
162
|
+
const qs = query.toString();
|
|
163
|
+
return authFetch(`${apiPath(DIRECTORIO_ROUTES.search)}${qs === "" ? "" : `?${qs}`}`, { accessToken });
|
|
164
|
+
};
|
|
165
|
+
const getSessions = (params) => authFetch(apiPath(SESSION_ROUTES.list), { accessToken: params.accessToken });
|
|
166
|
+
const deleteSession = (params) => {
|
|
167
|
+
if (!/^[\w-]+$/.test(params.sessionId)) return Promise.resolve({
|
|
168
|
+
ok: false,
|
|
169
|
+
error: {
|
|
170
|
+
kind: "sdk",
|
|
171
|
+
reason: "malformed",
|
|
172
|
+
message: "ID de sesión inválido",
|
|
173
|
+
status: 400
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
return authFetch(apiPath(SESSION_ROUTES.deleteOne, { id: params.sessionId }), {
|
|
177
|
+
method: "DELETE",
|
|
178
|
+
accessToken: params.accessToken
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
const deleteAllSessions = (params) => authFetch(apiPath(SESSION_ROUTES.deleteAll), {
|
|
182
|
+
method: "DELETE",
|
|
183
|
+
refreshToken: params.refreshToken
|
|
184
|
+
});
|
|
185
|
+
const health = () => authFetch("/health");
|
|
186
|
+
function createHttpClient() {
|
|
187
|
+
return {
|
|
188
|
+
getCode,
|
|
189
|
+
login,
|
|
190
|
+
setActiveEmpresa,
|
|
191
|
+
refresh,
|
|
192
|
+
logout,
|
|
193
|
+
getUser,
|
|
194
|
+
updateUser,
|
|
195
|
+
deleteUser,
|
|
196
|
+
getUserEmpresas,
|
|
197
|
+
getDirectorio,
|
|
198
|
+
getSessions,
|
|
199
|
+
deleteSession,
|
|
200
|
+
deleteAllSessions,
|
|
201
|
+
health
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
export { createHttpClient as t };
|
|
205
|
+
|
|
206
|
+
//# sourceMappingURL=http-client-Da0-OMfc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client-Da0-OMfc.js","names":[],"sources":["../src/http-client.ts"],"sourcesContent":["import { z } from 'zod'\nimport {\n AUTH_ROUTES,\n DIRECTORIO_ROUTES,\n SESSION_ROUTES,\n USER_ROUTES,\n} from '@eva_solutions/auth-contracts'\nimport type {\n DirectorioQuery,\n DirectorioResponse,\n} from '@eva_solutions/auth-contracts'\nimport { apiPath } from './api-path'\nimport { getProduct, isEvaAuthConfigError } from './config'\nimport { HEADERS, getAuthServiceUrl } from './constants'\nimport { parseErrorResponse } from './parse-error-response'\nimport type {\n EvaUser,\n EvaSession,\n EvaEmpresa,\n Result,\n TokenPair,\n DeviceInfo,\n} from './types'\n\nconst AuthServiceResponseSchema = z.object({\n data: z.unknown(),\n})\n\nconst AUTH_SERVICE_TIMEOUT = 10_000\n\ntype FetchOptions = {\n method?: string\n accessToken?: string\n refreshToken?: string\n body?: unknown\n /** La respuesta reemite solo el access token (`x-eva-new-access-token`); el refresh no rota. */\n reissuesAccessTokenOnly?: boolean\n}\n\nconst extractTokens = (headers: Headers): TokenPair | undefined => {\n const accessToken = headers.get(HEADERS.NEW_ACCESS_TOKEN)\n const refreshToken = headers.get(HEADERS.NEW_REFRESH_TOKEN)\n if (!accessToken || !refreshToken) return undefined\n return { accessToken, refreshToken }\n}\n\nconst authFetch = async <T>(\n path: string,\n options: FetchOptions = {},\n): Promise<Result<T & { tokens?: TokenPair }>> => {\n const { method = 'GET', accessToken, refreshToken, body } = options\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n }\n\n if (accessToken) headers[HEADERS.AUTHORIZATION] = `Bearer ${accessToken}`\n if (refreshToken) headers[HEADERS.REFRESH_TOKEN] = refreshToken\n\n try {\n const res = await fetch(`${getAuthServiceUrl()}${path}`, {\n method,\n headers,\n signal: AbortSignal.timeout(AUTH_SERVICE_TIMEOUT),\n ...(body ? { body: JSON.stringify(body) } : {}),\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => null)\n return { ok: false, error: parseErrorResponse(res.status, body) }\n }\n\n const json: unknown = await res.json()\n const parsed = AuthServiceResponseSchema.safeParse(json)\n if (!parsed.success) {\n return {\n ok: false,\n error: {\n kind: 'sdk',\n reason: 'malformed',\n message: 'Estructura de respuesta inválida',\n status: 502,\n },\n }\n }\n const data = parsed.data.data as T\n // Un array (`/sessions`, `/user/empresas`) se devuelve intacto: esparcirlo en un objeto lo\n // convertiria en `{ \"0\": …, \"1\": … }`. Esos endpoints se piden solo con access token, asi que\n // no hay tokens nuevos que adjuntar.\n if (Array.isArray(data))\n return { ok: true, data: data as T & { tokens?: TokenPair } }\n\n if (options.reissuesAccessTokenOnly) {\n const accessToken = res.headers.get(HEADERS.NEW_ACCESS_TOKEN)\n return {\n ok: true,\n data: { ...data, ...(accessToken ? { accessToken } : {}) },\n }\n }\n\n const tokens = extractTokens(res.headers)\n\n return { ok: true, data: { ...data, ...(tokens ? { tokens } : {}) } }\n } catch (err) {\n // Falta de configuración (authUrl): error del consumidor, no una falla de red.\n if (isEvaAuthConfigError(err)) throw err\n const message = err instanceof Error ? err.message : 'Error de red'\n return {\n ok: false,\n error: { kind: 'sdk', reason: 'network', message, status: 0 },\n }\n }\n}\n\n/**\n * Solicita un código OTP. En éxito devuelve `{ message, challengeId }`:\n * `challengeId` es opaco, el caller debe conservarlo (en memoria) y enviarlo a\n * `login`; cada `getCode` nuevo invalida el `challengeId` anterior.\n * El tipo es un cast: la respuesta del Auth Service no se parsea en runtime.\n */\nconst getCode = (params: {\n phone: string\n}): Promise<Result<{ message: string; challengeId: string }>> =>\n authFetch(apiPath(AUTH_ROUTES.getCode), {\n method: 'POST',\n body: { phone: params.phone },\n })\n\n/**\n * Verifica el código OTP. `challengeId` es obligatorio: debe ser el que\n * devolvió el `getCode` que originó el código; sin el desafío vigente el Auth\n * Service responde 401 sin consumir intentos.\n *\n * El `producto` del login sale SIEMPRE de `configureEvaAuth({ product })`, nunca del llamador: el\n * access token queda emitido para ese producto. `empresaId` (opcional) deja esa empresa activa en\n * la sesión si la persona pertenece a ella.\n *\n * @throws Error de configuración (`EvaAuthConfigError`) si falta `configureEvaAuth({ product })`.\n */\nconst login = (\n params: {\n phone: string\n code: string\n challengeId: string\n empresaId?: string\n } & DeviceInfo,\n): Promise<Result<{ user: { id: string }; tokens?: TokenPair }>> => {\n const {\n phone,\n code,\n challengeId,\n empresaId,\n deviceType,\n os,\n browser,\n userAgent,\n } = params\n return authFetch(apiPath(AUTH_ROUTES.login), {\n method: 'POST',\n body: {\n phone,\n code,\n challengeId,\n producto: getProduct(),\n ...(empresaId !== undefined && { empresaId }),\n deviceType,\n os,\n browser,\n userAgent,\n },\n })\n}\n\n/**\n * Cambia la empresa activa de la sesión (`null` la deja sin empresa). Auth reemite SOLO el access\n * token (`x-eva-new-access-token`; el refresh no rota): llega en `accessToken`. Auth valida la\n * pertenencia; si la persona no pertenece, responde error.\n */\nconst setActiveEmpresa = (params: {\n accessToken: string\n empresaId: string | null\n}): Promise<Result<{ empresaId: string | null; accessToken?: string }>> =>\n authFetch(apiPath(AUTH_ROUTES.setActiveEmpresa), {\n method: 'POST',\n accessToken: params.accessToken,\n body: { empresaId: params.empresaId },\n reissuesAccessTokenOnly: true,\n })\n\nconst refresh = (params: {\n refreshToken: string\n}): Promise<Result<{ user: { id: string }; tokens?: TokenPair }>> =>\n authFetch(apiPath(AUTH_ROUTES.refresh), {\n method: 'POST',\n refreshToken: params.refreshToken,\n })\n\nconst logout = (params: {\n refreshToken: string\n}): Promise<Result<{ message: string }>> =>\n authFetch(apiPath(AUTH_ROUTES.logout), {\n method: 'POST',\n refreshToken: params.refreshToken,\n })\n\nconst getUser = (params: { accessToken: string }): Promise<Result<EvaUser>> =>\n authFetch(apiPath(USER_ROUTES.get), { accessToken: params.accessToken })\n\nconst updateUser = (params: {\n accessToken: string\n data: Record<string, unknown>\n}): Promise<Result<EvaUser>> =>\n authFetch(apiPath(USER_ROUTES.update), {\n method: 'PATCH',\n accessToken: params.accessToken,\n body: params.data,\n })\n\nconst deleteUser = (params: {\n accessToken: string\n}): Promise<Result<{ message: string }>> =>\n authFetch(apiPath(USER_ROUTES.deactivate), {\n method: 'DELETE',\n accessToken: params.accessToken,\n })\n\nconst getUserEmpresas = (params: {\n accessToken: string\n}): Promise<Result<EvaEmpresa[]>> =>\n authFetch(apiPath(USER_ROUTES.listCompanies), {\n accessToken: params.accessToken,\n })\n\n/**\n * Busca en el directorio de empresas (solo las activas que optaron por aparecer; solo campos de\n * perfil público; 50 por página). Basta el access token de usuario de CUALQUIER producto habilitado:\n * Auth limita los pedidos por usuario. La siguiente página se pide con el `nextCursor` recibido.\n */\nconst getDirectorio = (\n params: { accessToken: string } & DirectorioQuery,\n): Promise<Result<DirectorioResponse['data']>> => {\n const { accessToken, ...filters } = params\n const query = new URLSearchParams()\n for (const [key, value] of Object.entries(filters)) {\n if (value !== undefined) query.set(key, String(value))\n }\n const qs = query.toString()\n return authFetch(\n `${apiPath(DIRECTORIO_ROUTES.search)}${qs === '' ? '' : `?${qs}`}`,\n { accessToken },\n )\n}\n\nconst getSessions = (params: {\n accessToken: string\n}): Promise<Result<EvaSession[]>> =>\n authFetch(apiPath(SESSION_ROUTES.list), { accessToken: params.accessToken })\n\nconst deleteSession = (params: {\n accessToken: string\n sessionId: string\n}): Promise<Result<{ message: string }>> => {\n if (!/^[\\w-]+$/.test(params.sessionId)) {\n return Promise.resolve({\n ok: false,\n error: {\n kind: 'sdk',\n reason: 'malformed',\n message: 'ID de sesión inválido',\n status: 400,\n },\n })\n }\n return authFetch(\n apiPath(SESSION_ROUTES.deleteOne, { id: params.sessionId }),\n {\n method: 'DELETE',\n accessToken: params.accessToken,\n },\n )\n}\n\nconst deleteAllSessions = (params: {\n refreshToken: string\n}): Promise<Result<{ message: string; count: number }>> =>\n authFetch(apiPath(SESSION_ROUTES.deleteAll), {\n method: 'DELETE',\n refreshToken: params.refreshToken,\n })\n\n// Every other route is built with `apiPath` (`API_PREFIX + path`); health is an operational probe\n// that the API serves at the root, outside the versioned prefix.\nconst health = (): Promise<Result<{ status: string }>> => authFetch('/health')\n\nexport function createHttpClient() {\n return {\n getCode,\n login,\n setActiveEmpresa,\n refresh,\n logout,\n getUser,\n updateUser,\n deleteUser,\n getUserEmpresas,\n getDirectorio,\n getSessions,\n deleteSession,\n deleteAllSessions,\n health,\n }\n}\n\nexport type EvaHttpClient = ReturnType<typeof createHttpClient>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { d as Result } from "./types-CEABh1Zf.js";
|
|
2
|
+
import { Bn as UpdateServiceClientResponse, Ct as UpdateProductoRequest, D as SetProductoPermisosAutorizablesRequest, E as ProductoPermisosAutorizablesResponse, Fn as ServiceClientGrant$1, Ht as ReassignTitularRequest, In as ServiceClientPublic$1, Ln as SetServiceClientGrantRequest, On as CreateServiceClientRequest, Pn as RotateServiceClientSecretResponse, Pt as EmpresaEstadoResponse, St as ProductoResponse, Ut as ReassignTitularResponse, bt as ListProductosResponse, ct as SetContratacionRequest, f as ListServiceClientDelegationsResponse, gi as ACCOUNT_STATES, jn as ListServiceClientGrantsResponse, kn as CreateServiceClientResponse, m as SetServiceClientDelegationRequest, nr as MaintenanceCleanupResponse, ot as ContratacionResponse, p as ServiceClientDelegation$1, ur as RepublishPendingResponse, yt as CreateProductoRequest, zn as UpdateServiceClientRequest } from "./index-CZru7c5T.js";
|
|
3
|
+
/** Unión de literales de todos los estados de cuenta posibles. */
|
|
4
|
+
type AccountState = (typeof ACCOUNT_STATES)[keyof typeof ACCOUNT_STATES];
|
|
5
|
+
/**
|
|
6
|
+
* Configuración del cliente Admin: las credenciales de un service client con la marca `esAdmin`.
|
|
7
|
+
* Cada request se firma con HMAC S2S; el secret nunca viaja.
|
|
8
|
+
*/
|
|
9
|
+
type AdminClientConfig = {
|
|
10
|
+
/** Slug del service client con la marca `esAdmin` (clientId). */
|
|
11
|
+
clientId: string;
|
|
12
|
+
/** Secret del service client admin en hex (64 chars), el que devuelve su creación o rotación. */
|
|
13
|
+
secretHex: string;
|
|
14
|
+
/**
|
|
15
|
+
* URL base del Auth Service API (sin trailing slash).
|
|
16
|
+
* Validada en `createAdminClient`: se requiere https (o http con host loopback para tests).
|
|
17
|
+
*/
|
|
18
|
+
baseUrl: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Service client público (sin el plaintext del secret).
|
|
22
|
+
* Shape del wire en GET /admin/service-clients/*.
|
|
23
|
+
* Las fechas vienen serializadas como ISO strings en el wire.
|
|
24
|
+
*/
|
|
25
|
+
type ServiceClientPublic = ServiceClientPublic$1;
|
|
26
|
+
/**
|
|
27
|
+
* Input para crear un nuevo service client (alias del request del contrato). Nace sin
|
|
28
|
+
* concesiones: se asignan con `setServiceClientGrant`. `auth-service` es un slug reservado.
|
|
29
|
+
*/
|
|
30
|
+
type CreateServiceClientInput = CreateServiceClientRequest;
|
|
31
|
+
/** Input para crear un producto (alias del request del contrato). `enabled` por defecto es `true`. */
|
|
32
|
+
type CreateProductoInput = CreateProductoRequest;
|
|
33
|
+
/** Input para actualizar un producto (patch parcial; alias del request del contrato). */
|
|
34
|
+
type UpdateProductoInput = UpdateProductoRequest;
|
|
35
|
+
/** Resultado de `listProductos`: `{ productos }`. */
|
|
36
|
+
type ListProductosResult = ListProductosResponse['data'];
|
|
37
|
+
/** Resultado de crear o actualizar un producto: `{ producto }`. */
|
|
38
|
+
type ProductoResult = ProductoResponse['data'];
|
|
39
|
+
/** Concesión de un service client sobre una audiencia: los permisos que puede pedir en su token. */
|
|
40
|
+
type ServiceClientGrant = ServiceClientGrant$1;
|
|
41
|
+
/**
|
|
42
|
+
* Input de `setServiceClientGrant`: audiencia y permisos del catálogo de `auth-contracts`.
|
|
43
|
+
* Un permiso que no es de esa audiencia (p. ej. `admin` en `auth-api`) no compila y el API lo rechaza.
|
|
44
|
+
*/
|
|
45
|
+
type SetServiceClientGrantInput = SetServiceClientGrantRequest;
|
|
46
|
+
/** Resultado de `listServiceClientGrants`. */
|
|
47
|
+
type ListServiceClientGrantsResult = ListServiceClientGrantsResponse['data'];
|
|
48
|
+
/**
|
|
49
|
+
* Resultado de crear un service client.
|
|
50
|
+
* El `secret` solo se devuelve UNA VEZ — guardarlo de inmediato.
|
|
51
|
+
*/
|
|
52
|
+
type CreateServiceClientResult = CreateServiceClientResponse['data'];
|
|
53
|
+
/**
|
|
54
|
+
* Input para actualizar un service client (patch parcial; alias del request del contrato).
|
|
55
|
+
* Al menos un campo debe estar presente.
|
|
56
|
+
*/
|
|
57
|
+
type UpdateServiceClientInput = UpdateServiceClientRequest;
|
|
58
|
+
/**
|
|
59
|
+
* Resultado de actualizar un service client.
|
|
60
|
+
*/
|
|
61
|
+
type UpdateServiceClientResult = UpdateServiceClientResponse['data'];
|
|
62
|
+
/**
|
|
63
|
+
* Resultado de rotar el secret de un service client.
|
|
64
|
+
* El `secret` nuevo solo se devuelve UNA VEZ.
|
|
65
|
+
*/
|
|
66
|
+
type RotateSecretResult = RotateServiceClientSecretResponse['data'];
|
|
67
|
+
/**
|
|
68
|
+
* Resultado de restaurar una cuenta de usuario eliminada.
|
|
69
|
+
* REQ-RESTORE-01 LOCKED.
|
|
70
|
+
*
|
|
71
|
+
* Tipo propio del SDK: `stateAccount` es la unión completa `AccountState`, y en el wire es el único
|
|
72
|
+
* literal `no_verificado`.
|
|
73
|
+
*/
|
|
74
|
+
type RestoreUserResult = {
|
|
75
|
+
userId: string;
|
|
76
|
+
/** Estado de la cuenta tras la restauración. */
|
|
77
|
+
stateAccount: AccountState;
|
|
78
|
+
previouslyDeletedAt: string | null;
|
|
79
|
+
restoredAt: string;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Query de `republishPendingWebhooks`. Tipo propio del SDK (como `ListWebhookDeliveriesQuery`):
|
|
83
|
+
* el query del contrato coacciona strings y su tipo de entrada es `unknown`. Los rangos los valida
|
|
84
|
+
* el API (400).
|
|
85
|
+
*/
|
|
86
|
+
type RepublishPendingWebhooksQuery = {
|
|
87
|
+
/** Antigüedad mínima en minutos de las entregas `pending` a republicar. Default del API: 10. */
|
|
88
|
+
older_than_minutes?: number;
|
|
89
|
+
/** Máximo de entregas por llamada. Default y tope del API: 100. */
|
|
90
|
+
limit?: number;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Resultado de `republishPendingWebhooks`: cuántas entregas se republicaron y si quedan más
|
|
94
|
+
* (`hasMore`: vuelve a llamar). Un 503 `service_unavailable` indica que QStash no aceptó el lote.
|
|
95
|
+
*/
|
|
96
|
+
type RepublishPendingWebhooksResult = RepublishPendingResponse['data'];
|
|
97
|
+
/**
|
|
98
|
+
* Query de `maintenanceCleanup`. Tipo propio del SDK (como {@link RepublishPendingWebhooksQuery}):
|
|
99
|
+
* el rango lo valida el API (400).
|
|
100
|
+
*/
|
|
101
|
+
type MaintenanceCleanupQuery = {
|
|
102
|
+
/** Máximo por lote en cada una de las dos limpiezas. Default y tope del API: 100. */
|
|
103
|
+
limit?: number;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Resultado de `maintenanceCleanup`: cuentas `eliminado` purgadas (ventana de restauración vencida),
|
|
107
|
+
* `webhook_events` sin entregas vivas borrados (fuera de la retención) y si queda más (`hasMore`:
|
|
108
|
+
* vuelve a llamar).
|
|
109
|
+
*/
|
|
110
|
+
type MaintenanceCleanupResult = MaintenanceCleanupResponse['data'];
|
|
111
|
+
/**
|
|
112
|
+
* Arista de delegación de un service client: puede intercambiar tokens hacia `audience` con, como
|
|
113
|
+
* máximo, `scopes`; `requiere_scope_origen` vacío = no admite re-exchange.
|
|
114
|
+
*/
|
|
115
|
+
type ServiceClientDelegation = ServiceClientDelegation$1;
|
|
116
|
+
/**
|
|
117
|
+
* Input de `setServiceClientDelegation`: audiencia delegable y permisos delegables del catálogo
|
|
118
|
+
* (`auth-api` y `admin` no compilan y el API los rechaza). `requiere_scope_origen` es opcional.
|
|
119
|
+
*/
|
|
120
|
+
type SetServiceClientDelegationInput = SetServiceClientDelegationRequest;
|
|
121
|
+
/** Resultado de `listServiceClientDelegations`. */
|
|
122
|
+
type ListServiceClientDelegationsResult = ListServiceClientDelegationsResponse['data'];
|
|
123
|
+
/** Input de `setProductoPermisosAutorizables`: la lista COMPLETA de permisos entre empresas (vacía = ninguno). */
|
|
124
|
+
type SetProductoPermisosAutorizablesInput = SetProductoPermisosAutorizablesRequest;
|
|
125
|
+
/** Permisos entre empresas que un producto puede conceder: `{ producto, permisos }`. */
|
|
126
|
+
type ProductoPermisosAutorizablesResult = ProductoPermisosAutorizablesResponse['data'];
|
|
127
|
+
/**
|
|
128
|
+
* Input de `reassignEmpresaTitular`: la persona que pasa a titular y qué pasa con el titular
|
|
129
|
+
* anterior (`'miembro'` por defecto, o `'fuera'`).
|
|
130
|
+
*/
|
|
131
|
+
type ReassignEmpresaTitularInput = ReassignTitularRequest;
|
|
132
|
+
/** Resultado de la reasignación de titular. */
|
|
133
|
+
type ReassignEmpresaTitularResult = ReassignTitularResponse['data'];
|
|
134
|
+
/** Estado de la empresa tras `bajaEmpresa` / `reactivarEmpresa`. */
|
|
135
|
+
type AdminEmpresaEstadoResult = EmpresaEstadoResponse['data'];
|
|
136
|
+
/** Input de `setContratacion`: estado (`prueba`, `activo`, `suspendido`, `cancelado`) y vencimiento. */
|
|
137
|
+
type AdminSetContratacionInput = SetContratacionRequest;
|
|
138
|
+
/** Contratación de un producto tras escribirla. */
|
|
139
|
+
type AdminContratacionResult = ContratacionResponse['data'];
|
|
140
|
+
/**
|
|
141
|
+
* Tipo del cliente Admin retornado por `createAdminClient`.
|
|
142
|
+
*/
|
|
143
|
+
type AdminClient = {
|
|
144
|
+
createServiceClient(input: CreateServiceClientInput): Promise<Result<CreateServiceClientResult>>;
|
|
145
|
+
listServiceClients(): Promise<Result<{
|
|
146
|
+
clientes: ServiceClientPublic[];
|
|
147
|
+
}>>;
|
|
148
|
+
getServiceClient(slug: string): Promise<Result<{
|
|
149
|
+
cliente: ServiceClientPublic;
|
|
150
|
+
}>>;
|
|
151
|
+
updateServiceClient(slug: string, input: UpdateServiceClientInput): Promise<Result<UpdateServiceClientResult>>;
|
|
152
|
+
deleteServiceClient(slug: string): Promise<Result<void>>;
|
|
153
|
+
rotateServiceClientSecret(slug: string): Promise<Result<RotateSecretResult>>;
|
|
154
|
+
listServiceClientGrants(slug: string): Promise<Result<ListServiceClientGrantsResult>>;
|
|
155
|
+
/** Crea o reemplaza la concesión del client sobre una audiencia. */
|
|
156
|
+
setServiceClientGrant(slug: string, input: SetServiceClientGrantInput): Promise<Result<{
|
|
157
|
+
grant: ServiceClientGrant;
|
|
158
|
+
}>>;
|
|
159
|
+
deleteServiceClientGrant(slug: string, audience: string): Promise<Result<void>>;
|
|
160
|
+
/** Lista las aristas de delegación del client (token exchange). */
|
|
161
|
+
listServiceClientDelegations(slug: string): Promise<Result<ListServiceClientDelegationsResult>>;
|
|
162
|
+
/** Crea o reemplaza la arista del client hacia una audiencia delegable (`scopes`, `requiere_scope_origen`). */
|
|
163
|
+
setServiceClientDelegation(slug: string, input: SetServiceClientDelegationInput): Promise<Result<{
|
|
164
|
+
delegation: ServiceClientDelegation;
|
|
165
|
+
}>>;
|
|
166
|
+
deleteServiceClientDelegation(slug: string, audience: string): Promise<Result<void>>;
|
|
167
|
+
/** Permisos entre empresas que el producto puede conceder en nombre de sus empresas. */
|
|
168
|
+
getProductoPermisosAutorizables(slug: string): Promise<Result<ProductoPermisosAutorizablesResult>>;
|
|
169
|
+
/** Reemplaza la lista de permisos autorizables del producto (vacía = ninguno). */
|
|
170
|
+
setProductoPermisosAutorizables(slug: string, input: SetProductoPermisosAutorizablesInput): Promise<Result<ProductoPermisosAutorizablesResult>>;
|
|
171
|
+
/** Reasigna el titular de una empresa (disputa de RUC o empresa sin titular). */
|
|
172
|
+
reassignEmpresaTitular(empresaId: string, input: ReassignEmpresaTitularInput): Promise<Result<ReassignEmpresaTitularResult>>;
|
|
173
|
+
/** Da de baja una empresa (limpia sus sesiones activas; las autorizaciones y contrataciones dejan de valer). */
|
|
174
|
+
bajaEmpresa(empresaId: string): Promise<Result<AdminEmpresaEstadoResult>>;
|
|
175
|
+
/** Reactiva una empresa de baja. */
|
|
176
|
+
reactivarEmpresa(empresaId: string): Promise<Result<AdminEmpresaEstadoResult>>;
|
|
177
|
+
/** Escribe el estado y el vencimiento de la contratación de un producto por una empresa (hasta que exista facturación, así se activa a mano). */
|
|
178
|
+
setContratacion(empresaId: string, producto: string, input: AdminSetContratacionInput): Promise<Result<AdminContratacionResult>>;
|
|
179
|
+
/** Lista los productos (la audiencia del access token de usuario). */
|
|
180
|
+
listProductos(): Promise<Result<ListProductosResult>>;
|
|
181
|
+
/** Crea un producto (201). 409 si el slug existe; 400 si es una audiencia de servicio. */
|
|
182
|
+
createProducto(input: CreateProductoInput): Promise<Result<ProductoResult>>;
|
|
183
|
+
/** Actualiza `nombre` o `enabled`. 404 si no existe; 400 con body vacío. No hay delete: se deshabilita. */
|
|
184
|
+
updateProducto(slug: string, input: UpdateProductoInput): Promise<Result<ProductoResult>>;
|
|
185
|
+
restoreUser(userId: string): Promise<Result<RestoreUserResult>>;
|
|
186
|
+
republishPendingWebhooks(query?: RepublishPendingWebhooksQuery): Promise<Result<RepublishPendingWebhooksResult>>;
|
|
187
|
+
maintenanceCleanup(query?: MaintenanceCleanupQuery): Promise<Result<MaintenanceCleanupResult>>;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Crea un cliente Admin para provisioning del Auth Service.
|
|
191
|
+
*
|
|
192
|
+
* ADVERTENCIA: solo usar desde backends o herramientas de operador seguras — el secret del
|
|
193
|
+
* service client admin nunca debe exponerse en el cliente/browser.
|
|
194
|
+
*
|
|
195
|
+
* @example
|
|
196
|
+
* ```ts
|
|
197
|
+
* const admin = createAdminClient({
|
|
198
|
+
* clientId: process.env.AUTH_ADMIN_SLUG,
|
|
199
|
+
* secretHex: process.env.AUTH_ADMIN_SECRET,
|
|
200
|
+
* baseUrl: 'https://auth.miapp.com',
|
|
201
|
+
* })
|
|
202
|
+
* const result = await admin.createServiceClient({ slug: 'mi-servicio' })
|
|
203
|
+
* if (!result.ok) return handleError(result.error)
|
|
204
|
+
* console.log('Secret (guardar ahora):', result.data.secret)
|
|
205
|
+
* ```
|
|
206
|
+
*/
|
|
207
|
+
declare function createAdminClient(config: AdminClientConfig): AdminClient;
|
|
208
|
+
/**
|
|
209
|
+
* Códigos de error específicos del módulo Admin.
|
|
210
|
+
*
|
|
211
|
+
* Complementan a `ERROR_CODES` (core) para errores que solo ocurren
|
|
212
|
+
* en operaciones de provisioning de service clients.
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* ```ts
|
|
216
|
+
* import { ADMIN_ERROR_CODES } from '@eva_solutions/auth-sdk/admin'
|
|
217
|
+
*
|
|
218
|
+
* if (!result.ok && result.error.code === ADMIN_ERROR_CODES.service_client_already_exists) {
|
|
219
|
+
* return res.status(409).json({ error: 'El service client ya existe' })
|
|
220
|
+
* }
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
declare const ADMIN_ERROR_CODES: {
|
|
224
|
+
readonly service_client_already_exists: "service_client_already_exists";
|
|
225
|
+
readonly service_client_not_found: "service_client_not_found";
|
|
226
|
+
/**
|
|
227
|
+
* `rotate-secret` perdió contra otra rotación concurrente del mismo service client (409).
|
|
228
|
+
* El perdedor no recibe secret; es reintentable.
|
|
229
|
+
*/
|
|
230
|
+
readonly service_client_secret_rotation_conflict: "service_client_secret_rotation_conflict";
|
|
231
|
+
/**
|
|
232
|
+
* La operación dejaría al sistema sin ningún service client admin habilitado (409): borrar,
|
|
233
|
+
* deshabilitar o quitarle `esAdmin` al último. No se aplica; habilita o crea otro admin.
|
|
234
|
+
*/
|
|
235
|
+
readonly last_admin_client: "last_admin_client";
|
|
236
|
+
};
|
|
237
|
+
/** Unión de literales de los error codes específicos del módulo Admin. */
|
|
238
|
+
type AdminErrorCode = (typeof ADMIN_ERROR_CODES)[keyof typeof ADMIN_ERROR_CODES];
|
|
239
|
+
export { SetServiceClientGrantInput as A, RestoreUserResult as C, ServiceClientPublic as D, ServiceClientGrant as E, UpdateServiceClientInput as M, UpdateServiceClientResult as N, SetProductoPermisosAutorizablesInput as O, AccountState as P, RepublishPendingWebhooksResult as S, ServiceClientDelegation as T, ProductoPermisosAutorizablesResult as _, AdminClientConfig as a, ReassignEmpresaTitularResult as b, AdminSetContratacionInput as c, CreateServiceClientResult as d, ListProductosResult as f, MaintenanceCleanupResult as g, MaintenanceCleanupQuery as h, createAdminClient as i, UpdateProductoInput as j, SetServiceClientDelegationInput as k, CreateProductoInput as l, ListServiceClientGrantsResult as m, AdminErrorCode as n, AdminContratacionResult as o, ListServiceClientDelegationsResult as p, AdminClient as r, AdminEmpresaEstadoResult as s, ADMIN_ERROR_CODES as t, CreateServiceClientInput as u, ProductoResult as v, RotateSecretResult as w, RepublishPendingWebhooksQuery as x, ReassignEmpresaTitularInput as y };
|
|
240
|
+
//# sourceMappingURL=index-CIH_2t7Y.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-CIH_2t7Y.d.ts","names":["ContractServiceClientPublic","ContractServiceClientGrant","ContractServiceClientDelegation"],"sources":["../src/account-states.ts","../src/admin/types.ts","../src/admin/client.ts","../src/admin/error-codes.ts"],"mappings":";;;KAuBY,uBAAuB,6BAA6B;;;;;KCgBpD;;EAEV;;EAEA;;;;;EAKA;;;;;;;KAQU,sBAAsBA;;;;;KAMtB,2BAA2B;;KAG3B,sBAAsB;;KAGtB,sBAAsB;;KAGtB,sBAAsB;;KAGtB,iBAAiB;;KAGjB,qBAAqBC;;;;;KAMrB,6BAA6B;;KAG7B,gCACV;;;;;KAMU,4BAA4B;;;;;KAM5B,2BAA2B;;;;KAK3B,4BAA4B;;;;;KAM5B,qBAAqB;;;;;;;;KASrB;EACV;;EAEA,cAAc;EACd;EACA;;;;;;;KAQU;;EAEV;;EAEA;;;;;;KAOU,iCAAiC;;;;;KAMjC;;EAEV;;;;;;;KAQU,2BAA2B;;;;;KAM3B,0BAA0BC;;;;;KAM1B,kCAAkC;;KAGlC,qCACV;;KAGU,uCACV;;KAGU,qCACV;;;;;KAMU,8BAA8B;;KAG9B,+BAA+B;;KAG/B,2BAA2B;;KAG3B,4BAA4B;;KAG5B,0BAA0B;;;;KClH1B;EACV,oBACE,OAAO,2BACN,QAAQ,OAAO;EAClB,sBAAsB,QAAQ;IAAS,UAAU;;EACjD,iBACE,eACC,QAAQ;IAAS,SAAS;;EAC7B,oBACE,cACA,OAAO,2BACN,QAAQ,OAAO;EAClB,oBAAoB,eAAe,QAAQ;EAC3C,0BAA0B,eAAe,QAAQ,OAAO;EACxD,wBACE,eACC,QAAQ,OAAO;;EAElB,sBACE,cACA,OAAO,6BACN,QAAQ;IAAS,OAAO;;EAC3B,yBACE,cACA,mBACC,QAAQ;;EAEX,6BACE,eACC,QAAQ,OAAO;;EAElB,2BACE,cACA,OAAO,kCACN,QAAQ;IAAS,YAAY;;EAChC,8BACE,cACA,mBACC,QAAQ;;EAEX,gCACE,eACC,QAAQ,OAAO;;EAElB,gCACE,cACA,OAAO,uCACN,QAAQ,OAAO;;EAElB,uBACE,mBACA,OAAO,8BACN,QAAQ,OAAO;;EAElB,YAAY,oBAAoB,QAAQ,OAAO;;EAE/C,iBAAiB,oBAAoB,QAAQ,OAAO;;EAEpD,gBACE,mBACA,kBACA,OAAO,4BACN,QAAQ,OAAO;;EAElB,iBAAiB,QAAQ,OAAO;;EAEhC,eAAe,OAAO,sBAAsB,QAAQ,OAAO;;EAE3D,eACE,cACA,OAAO,sBACN,QAAQ,OAAO;EAClB,YAAY,iBAAiB,QAAQ,OAAO;EAC5C,yBACE,QAAQ,gCACP,QAAQ,OAAO;EAClB,mBACE,QAAQ,0BACP,QAAQ,OAAO;;;;;;;;;;;;;;;;;;;;iBA0HJ,kBAAkB,QAAQ,oBAAoB;;;;;;;;;;;;;;;;cChRjD;;;;;;;;;;;;;;;KAiBD,yBACF,gCAAgC"}
|