@zentto/platform-client 0.1.0 → 0.3.0
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/README.md +89 -2
- package/dist/auth/client.d.ts +132 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +157 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/client.d.ts +113 -0
- package/dist/cache/client.d.ts.map +1 -0
- package/dist/cache/client.js +87 -0
- package/dist/cache/client.js.map +1 -0
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +2 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/events/client.d.ts +94 -0
- package/dist/events/client.d.ts.map +1 -0
- package/dist/events/client.js +208 -0
- package/dist/events/client.js.map +1 -0
- package/dist/events/envelope.d.ts +28 -0
- package/dist/events/envelope.d.ts.map +1 -0
- package/dist/events/envelope.js +38 -0
- package/dist/events/envelope.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -6
- package/dist/index.js.map +1 -1
- package/dist/internal/circuit.d.ts +33 -0
- package/dist/internal/circuit.d.ts.map +1 -0
- package/dist/internal/circuit.js +73 -0
- package/dist/internal/circuit.js.map +1 -0
- package/dist/internal/errors.d.ts +57 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +96 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/http.d.ts +59 -0
- package/dist/internal/http.d.ts.map +1 -0
- package/dist/internal/http.js +95 -0
- package/dist/internal/http.js.map +1 -0
- package/dist/landing/client.d.ts +50 -0
- package/dist/landing/client.d.ts.map +1 -0
- package/dist/landing/client.js +46 -0
- package/dist/landing/client.js.map +1 -0
- package/dist/landing/index.d.ts +2 -0
- package/dist/landing/index.d.ts.map +1 -0
- package/dist/landing/index.js +2 -0
- package/dist/landing/index.js.map +1 -0
- package/package.json +27 -2
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# @zentto/platform-client
|
|
2
2
|
|
|
3
|
-
Cliente oficial tipado para los servicios de plataforma Zentto: **notify**, **
|
|
3
|
+
Cliente oficial tipado para los servicios de plataforma Zentto: **notify**, **auth**, **cache**, **landing**, **events**.
|
|
4
|
+
|
|
5
|
+
Incluye circuit breaker, auto-refresh de JWT, errores tipados (AuthError, RateLimitedError, ServiceError, etc.) y event bus sobre Kafka.
|
|
4
6
|
|
|
5
7
|
Úsalo desde el ERP, cualquier vertical (hotel, medical, tickets, rental, education, inmobiliario…) o un sitio externo de un tenant cliente.
|
|
6
8
|
|
|
@@ -40,7 +42,92 @@ Variables de entorno:
|
|
|
40
42
|
| `NOTIFY_API_KEY` | — | Master key del servicio (server-to-server) |
|
|
41
43
|
| `API_MASTER_KEY` | — | Fallback legacy |
|
|
42
44
|
|
|
43
|
-
###
|
|
45
|
+
### Auth (zentto-auth)
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import { authFromEnv, AuthClient } from "@zentto/platform-client/auth";
|
|
49
|
+
|
|
50
|
+
// Service-to-service (backend) — provisioning de owners desde el ERP
|
|
51
|
+
const svc = authFromEnv(); // lee AUTH_SERVICE_URL + AUTH_SERVICE_KEY
|
|
52
|
+
await svc.admin.provisionOwner({
|
|
53
|
+
email, fullName, companyId, companyCode, sendMagicLink: true,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// User-facing (con JWT del usuario)
|
|
57
|
+
const user = new AuthClient({ accessToken: jwt });
|
|
58
|
+
const me = await user.me();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Cache (zentto-cache)
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { cacheFromEnv } from "@zentto/platform-client/cache";
|
|
65
|
+
const c = cacheFromEnv(); // lee CACHE_URL + CACHE_APP_KEY
|
|
66
|
+
|
|
67
|
+
await c.gridLayouts.put("invoices-list", layoutJson, { companyId, userId });
|
|
68
|
+
const res = await c.gridLayouts.get("invoices-list", { companyId, userId });
|
|
69
|
+
// res.data.layout → layout guardado
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Events (bus Kafka)
|
|
73
|
+
|
|
74
|
+
Requiere `kafkajs` como peer dependency (opcional):
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm install kafkajs
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import { EventBusClient } from "@zentto/platform-client/events";
|
|
82
|
+
|
|
83
|
+
const bus = new EventBusClient({
|
|
84
|
+
brokers: ["kafka:9092"],
|
|
85
|
+
source: "zentto-hotel",
|
|
86
|
+
tenantCode: "ACME",
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
await bus.connect();
|
|
90
|
+
|
|
91
|
+
// Producer
|
|
92
|
+
await bus.publish({
|
|
93
|
+
eventType: "hotel.reservation.confirmed",
|
|
94
|
+
data: { reservationId: 42, guest: "Juan" },
|
|
95
|
+
correlationId: req.headers["x-request-id"],
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// Consumer (otro proceso)
|
|
99
|
+
bus.on(/^crm\..+/, async (evt) => {
|
|
100
|
+
console.log("got", evt.eventType, evt.data);
|
|
101
|
+
});
|
|
102
|
+
await bus.start();
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Topic: `zentto.acme.hotel.reservation.confirmed`. Envelope estándar con `eventId` (dedup automática), `timestamp`, `source`, `correlationId`, `version`.
|
|
106
|
+
|
|
107
|
+
### Errores tipados
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
import { AuthError, RateLimitedError, ServiceError } from "@zentto/platform-client";
|
|
111
|
+
|
|
112
|
+
const r = await notify.email.send(...);
|
|
113
|
+
if (!r.ok && r.errorInstance instanceof RateLimitedError) {
|
|
114
|
+
await wait(r.errorInstance.retryAfterSec ?? 30);
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Landing (leads de tenants clientes)
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
import { LandingClient } from "@zentto/platform-client/landing";
|
|
122
|
+
const landing = new LandingClient({ tenantKey: "zk_<prefix>_<secret>" });
|
|
123
|
+
|
|
124
|
+
await landing.registerLead({
|
|
125
|
+
email, name, phone, topic: "sales", message, source: "acme.com",
|
|
126
|
+
});
|
|
127
|
+
// Cae en el crm.Lead del tenant dueño de la key.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Construcción manual
|
|
44
131
|
|
|
45
132
|
```ts
|
|
46
133
|
import { notify } from "@zentto/platform-client";
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuthClient — cliente tipado para zentto-auth (sso.zentto.net / auth.zentto.net).
|
|
3
|
+
*
|
|
4
|
+
* Expone dos modos:
|
|
5
|
+
* - Cliente user-facing (frontend): cookies httpOnly + Bearer JWT.
|
|
6
|
+
* Métodos: login, refresh, logout, me.
|
|
7
|
+
* - Cliente service-to-service (backend): header `x-service-key`.
|
|
8
|
+
* Métodos: admin.provisionOwner, admin.createMagicLink.
|
|
9
|
+
*
|
|
10
|
+
* setPassword es público (magic-link consumo), no requiere auth.
|
|
11
|
+
*/
|
|
12
|
+
import { type HttpConfig, type HttpResult } from "../internal/http.js";
|
|
13
|
+
export interface AuthConfig {
|
|
14
|
+
baseUrl?: string;
|
|
15
|
+
/** Bearer JWT para llamadas user-facing. Opcional — algunos métodos no requieren. */
|
|
16
|
+
accessToken?: string;
|
|
17
|
+
/** Service key (`x-service-key`) para llamadas admin/provisioning. */
|
|
18
|
+
serviceKey?: string;
|
|
19
|
+
timeoutMs?: number;
|
|
20
|
+
retries?: number;
|
|
21
|
+
onError?: HttpConfig["onError"];
|
|
22
|
+
}
|
|
23
|
+
export interface AuthUser {
|
|
24
|
+
userId?: number;
|
|
25
|
+
username?: string;
|
|
26
|
+
email?: string;
|
|
27
|
+
displayName?: string;
|
|
28
|
+
isAdmin?: boolean;
|
|
29
|
+
mfaEnabled?: boolean;
|
|
30
|
+
[k: string]: unknown;
|
|
31
|
+
}
|
|
32
|
+
export interface LoginResponse {
|
|
33
|
+
user: AuthUser;
|
|
34
|
+
accessToken: string;
|
|
35
|
+
refreshToken?: string;
|
|
36
|
+
mfaChallengeToken?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface MeResponse {
|
|
39
|
+
user: AuthUser;
|
|
40
|
+
modulos?: unknown[];
|
|
41
|
+
permisos?: unknown[];
|
|
42
|
+
companyAccesses?: unknown[];
|
|
43
|
+
defaultCompany?: unknown;
|
|
44
|
+
}
|
|
45
|
+
export interface ProvisionOwnerParams {
|
|
46
|
+
email: string;
|
|
47
|
+
fullName: string;
|
|
48
|
+
companyId: number;
|
|
49
|
+
companyCode: string;
|
|
50
|
+
tenantSubdomain?: string;
|
|
51
|
+
role?: string;
|
|
52
|
+
sendMagicLink?: boolean;
|
|
53
|
+
locale?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface ProvisionOwnerResponse {
|
|
56
|
+
userId: number;
|
|
57
|
+
email: string;
|
|
58
|
+
magicLinkUrl?: string;
|
|
59
|
+
alreadyExisted?: boolean;
|
|
60
|
+
}
|
|
61
|
+
export interface MagicLinkParams {
|
|
62
|
+
email: string;
|
|
63
|
+
companyId: number;
|
|
64
|
+
purpose: "set_password" | "reset_password";
|
|
65
|
+
tenantSubdomain?: string;
|
|
66
|
+
ttlMinutes?: number;
|
|
67
|
+
}
|
|
68
|
+
export interface MagicLinkResponse {
|
|
69
|
+
url: string;
|
|
70
|
+
expiresAt: string;
|
|
71
|
+
}
|
|
72
|
+
export declare class AuthClient {
|
|
73
|
+
private readonly cfg;
|
|
74
|
+
private readonly serviceKey?;
|
|
75
|
+
private accessToken?;
|
|
76
|
+
private refreshInFlight?;
|
|
77
|
+
constructor(opts: AuthConfig);
|
|
78
|
+
setAccessToken(token: string | undefined): void;
|
|
79
|
+
private bearer;
|
|
80
|
+
/**
|
|
81
|
+
* Refresh coalescido: si varios requests 401 caen a la vez, solo uno
|
|
82
|
+
* llama a /auth/refresh y los demás esperan el mismo resultado.
|
|
83
|
+
*/
|
|
84
|
+
private tryRefresh;
|
|
85
|
+
private service;
|
|
86
|
+
login(params: {
|
|
87
|
+
username: string;
|
|
88
|
+
password: string;
|
|
89
|
+
appId?: string;
|
|
90
|
+
}): Promise<HttpResult<LoginResponse>>;
|
|
91
|
+
loginMfa(params: {
|
|
92
|
+
mfaChallengeToken: string;
|
|
93
|
+
mfaToken: string;
|
|
94
|
+
}): Promise<HttpResult<LoginResponse>>;
|
|
95
|
+
refresh(): Promise<HttpResult<{
|
|
96
|
+
ok: boolean;
|
|
97
|
+
accessToken: string;
|
|
98
|
+
}>>;
|
|
99
|
+
logout(): Promise<HttpResult<{
|
|
100
|
+
ok: boolean;
|
|
101
|
+
}>>;
|
|
102
|
+
me(appId?: string): Promise<HttpResult<MeResponse>>;
|
|
103
|
+
registerForApp(params: {
|
|
104
|
+
email: string;
|
|
105
|
+
password: string;
|
|
106
|
+
displayName?: string;
|
|
107
|
+
appId: string;
|
|
108
|
+
role: string;
|
|
109
|
+
metadata?: Record<string, unknown>;
|
|
110
|
+
}): Promise<HttpResult<LoginResponse>>;
|
|
111
|
+
/** Consumo de magic-link (público). */
|
|
112
|
+
setPassword(params: {
|
|
113
|
+
token: string;
|
|
114
|
+
newPassword: string;
|
|
115
|
+
}): Promise<HttpResult<{
|
|
116
|
+
ok: boolean;
|
|
117
|
+
email: string;
|
|
118
|
+
}>>;
|
|
119
|
+
readonly admin: {
|
|
120
|
+
provisionOwner: (params: ProvisionOwnerParams) => Promise<HttpResult<ProvisionOwnerResponse>>;
|
|
121
|
+
createMagicLink: (params: MagicLinkParams) => Promise<HttpResult<MagicLinkResponse>>;
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Factory desde env vars estándar:
|
|
126
|
+
* AUTH_SERVICE_URL / AUTH_URL — default https://auth.zentto.net
|
|
127
|
+
* AUTH_SERVICE_KEY — para llamadas admin (backend)
|
|
128
|
+
*
|
|
129
|
+
* Para user-facing, construí manualmente con `new AuthClient({ accessToken })`.
|
|
130
|
+
*/
|
|
131
|
+
export declare function authFromEnv(overrides?: Partial<AuthConfig>): AuthClient;
|
|
132
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AuthClient — cliente tipado para zentto-auth (sso.zentto.net / auth.zentto.net).
|
|
3
|
+
*
|
|
4
|
+
* Expone dos modos:
|
|
5
|
+
* - Cliente user-facing (frontend): cookies httpOnly + Bearer JWT.
|
|
6
|
+
* Métodos: login, refresh, logout, me.
|
|
7
|
+
* - Cliente service-to-service (backend): header `x-service-key`.
|
|
8
|
+
* Métodos: admin.provisionOwner, admin.createMagicLink.
|
|
9
|
+
*
|
|
10
|
+
* setPassword es público (magic-link consumo), no requiere auth.
|
|
11
|
+
*/
|
|
12
|
+
import { defaultHttpConfig, httpRequest } from "../internal/http.js";
|
|
13
|
+
// ── Client ──────────────────────────────────────────────────────────────────
|
|
14
|
+
export class AuthClient {
|
|
15
|
+
cfg;
|
|
16
|
+
serviceKey;
|
|
17
|
+
accessToken;
|
|
18
|
+
refreshInFlight;
|
|
19
|
+
constructor(opts) {
|
|
20
|
+
this.cfg = defaultHttpConfig({
|
|
21
|
+
baseUrl: opts.baseUrl ?? "https://auth.zentto.net",
|
|
22
|
+
timeoutMs: opts.timeoutMs,
|
|
23
|
+
retries: opts.retries,
|
|
24
|
+
onError: opts.onError,
|
|
25
|
+
// Intercepta 401 → intenta refresh + reintenta UNA vez con el nuevo Bearer.
|
|
26
|
+
// Evita que cada caller tenga que saber manejar expiración de tokens.
|
|
27
|
+
beforeRetry: async (err, ctx) => {
|
|
28
|
+
if (err.name !== "AuthError")
|
|
29
|
+
return { retry: false };
|
|
30
|
+
if (ctx.path === "/auth/refresh")
|
|
31
|
+
return { retry: false }; // no refresh durante refresh
|
|
32
|
+
const newToken = await this.tryRefresh();
|
|
33
|
+
if (!newToken)
|
|
34
|
+
return { retry: false };
|
|
35
|
+
return { retry: true, headers: { Authorization: `Bearer ${newToken}` } };
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
this.accessToken = opts.accessToken;
|
|
39
|
+
this.serviceKey = opts.serviceKey;
|
|
40
|
+
}
|
|
41
|
+
setAccessToken(token) {
|
|
42
|
+
this.accessToken = token;
|
|
43
|
+
}
|
|
44
|
+
bearer() {
|
|
45
|
+
return this.accessToken ? { Authorization: `Bearer ${this.accessToken}` } : {};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Refresh coalescido: si varios requests 401 caen a la vez, solo uno
|
|
49
|
+
* llama a /auth/refresh y los demás esperan el mismo resultado.
|
|
50
|
+
*/
|
|
51
|
+
async tryRefresh() {
|
|
52
|
+
if (!this.refreshInFlight) {
|
|
53
|
+
this.refreshInFlight = (async () => {
|
|
54
|
+
const res = await this.refresh();
|
|
55
|
+
const newToken = res.ok ? res.data?.accessToken : undefined;
|
|
56
|
+
if (newToken)
|
|
57
|
+
this.accessToken = newToken;
|
|
58
|
+
return newToken;
|
|
59
|
+
})().finally(() => {
|
|
60
|
+
// Limpiar tras la resolución (con un tick de margen).
|
|
61
|
+
setTimeout(() => { this.refreshInFlight = undefined; }, 0);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return this.refreshInFlight;
|
|
65
|
+
}
|
|
66
|
+
service() {
|
|
67
|
+
if (!this.serviceKey)
|
|
68
|
+
throw new Error("AuthClient: serviceKey no configurada para este método");
|
|
69
|
+
return { "x-service-key": this.serviceKey };
|
|
70
|
+
}
|
|
71
|
+
// ── User-facing ──────────────────────────────────────────────────────────
|
|
72
|
+
async login(params) {
|
|
73
|
+
return httpRequest(this.cfg, {
|
|
74
|
+
method: "POST",
|
|
75
|
+
path: "/auth/login",
|
|
76
|
+
body: params,
|
|
77
|
+
credentials: "include",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async loginMfa(params) {
|
|
81
|
+
return httpRequest(this.cfg, {
|
|
82
|
+
method: "POST",
|
|
83
|
+
path: "/auth/login/mfa",
|
|
84
|
+
body: params,
|
|
85
|
+
credentials: "include",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async refresh() {
|
|
89
|
+
return httpRequest(this.cfg, {
|
|
90
|
+
method: "POST",
|
|
91
|
+
path: "/auth/refresh",
|
|
92
|
+
credentials: "include",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async logout() {
|
|
96
|
+
return httpRequest(this.cfg, {
|
|
97
|
+
method: "POST",
|
|
98
|
+
path: "/auth/logout",
|
|
99
|
+
credentials: "include",
|
|
100
|
+
headers: this.bearer(),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async me(appId) {
|
|
104
|
+
return httpRequest(this.cfg, {
|
|
105
|
+
method: "GET",
|
|
106
|
+
path: "/auth/me",
|
|
107
|
+
query: { appId },
|
|
108
|
+
headers: this.bearer(),
|
|
109
|
+
credentials: "include",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
async registerForApp(params) {
|
|
113
|
+
return httpRequest(this.cfg, {
|
|
114
|
+
method: "POST",
|
|
115
|
+
path: "/auth/register-for-app",
|
|
116
|
+
body: params,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/** Consumo de magic-link (público). */
|
|
120
|
+
async setPassword(params) {
|
|
121
|
+
return httpRequest(this.cfg, {
|
|
122
|
+
method: "POST",
|
|
123
|
+
path: "/auth/set-password",
|
|
124
|
+
body: params,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// ── Service-to-service ───────────────────────────────────────────────────
|
|
128
|
+
admin = {
|
|
129
|
+
provisionOwner: (params) => httpRequest(this.cfg, {
|
|
130
|
+
method: "POST",
|
|
131
|
+
path: "/admin/users/provision-owner",
|
|
132
|
+
body: params,
|
|
133
|
+
headers: this.service(),
|
|
134
|
+
}),
|
|
135
|
+
createMagicLink: (params) => httpRequest(this.cfg, {
|
|
136
|
+
method: "POST",
|
|
137
|
+
path: "/admin/users/magic-link",
|
|
138
|
+
body: params,
|
|
139
|
+
headers: this.service(),
|
|
140
|
+
}),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Factory desde env vars estándar:
|
|
145
|
+
* AUTH_SERVICE_URL / AUTH_URL — default https://auth.zentto.net
|
|
146
|
+
* AUTH_SERVICE_KEY — para llamadas admin (backend)
|
|
147
|
+
*
|
|
148
|
+
* Para user-facing, construí manualmente con `new AuthClient({ accessToken })`.
|
|
149
|
+
*/
|
|
150
|
+
export function authFromEnv(overrides) {
|
|
151
|
+
return new AuthClient({
|
|
152
|
+
baseUrl: process.env.AUTH_SERVICE_URL ?? process.env.AUTH_URL,
|
|
153
|
+
serviceKey: process.env.AUTH_SERVICE_KEY,
|
|
154
|
+
...overrides,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/auth/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAoC,MAAM,qBAAqB,CAAC;AAsEvG,+EAA+E;AAC/E,MAAM,OAAO,UAAU;IACJ,GAAG,CAAa;IAChB,UAAU,CAAU;IAC7B,WAAW,CAAU;IACrB,eAAe,CAA+B;IAEtD,YAAY,IAAgB;QAC1B,IAAI,CAAC,GAAG,GAAG,iBAAiB,CAAC;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,yBAAyB;YAClD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,4EAA4E;YAC5E,sEAAsE;YACtE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC9B,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;oBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBACtD,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe;oBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,6BAA6B;gBACxF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzC,IAAI,CAAC,QAAQ;oBAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBACvC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,QAAQ,EAAE,EAAE,EAAE,CAAC;YAC3E,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACpC,CAAC;IAED,cAAc,CAAC,KAAyB;QACtC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAEO,MAAM;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;gBACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC5D,IAAI,QAAQ;oBAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;gBAC1C,OAAO,QAAQ,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBAChB,sDAAsD;gBACtD,UAAU,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QAChG,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC9C,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,KAAK,CAAC,MAA8D;QACxE,OAAO,WAAW,CAAgB,IAAI,CAAC,GAAG,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAuD;QACpE,OAAO,WAAW,CAAgB,IAAI,CAAC,GAAG,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM;QACV,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,SAAS;YACtB,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,EAAE,CAAC,KAAc;QACrB,OAAO,WAAW,CAAa,IAAI,CAAC,GAAG,EAAE;YACvC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,EAAE,KAAK,EAAE;YAChB,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;YACtB,WAAW,EAAE,SAAS;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAOpB;QACC,OAAO,WAAW,CAAgB,IAAI,CAAC,GAAG,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,wBAAwB;YAC9B,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,WAAW,CAAC,MAA8C;QAC9D,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IACnE,KAAK,GAAG;QACf,cAAc,EAAE,CAAC,MAA4B,EAA+C,EAAE,CAC5F,WAAW,CAAyB,IAAI,CAAC,GAAG,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,8BAA8B;YACpC,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;SACxB,CAAC;QAEJ,eAAe,EAAE,CAAC,MAAuB,EAA0C,EAAE,CACnF,WAAW,CAAoB,IAAI,CAAC,GAAG,EAAE;YACvC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,yBAAyB;YAC/B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;SACxB,CAAC;KACL,CAAC;CACH;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,SAA+B;IACzD,OAAO,IAAI,UAAU,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAC7D,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;QACxC,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CacheClient — cliente tipado para zentto-cache (cache.zentto.net).
|
|
3
|
+
*
|
|
4
|
+
* Estandariza el header `x-client-key`. Cada recurso (grid-layouts,
|
|
5
|
+
* report-templates, studio-schemas, blog-posts) expone list/get/put/delete
|
|
6
|
+
* con la misma forma.
|
|
7
|
+
*
|
|
8
|
+
* Identidad del dueño del dato: `companyId` + (`userId` | `email`).
|
|
9
|
+
*/
|
|
10
|
+
import { type HttpConfig, type HttpResult } from "../internal/http.js";
|
|
11
|
+
export interface CacheConfig {
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
/** Header `x-client-key` — identifica la app consumidora. */
|
|
14
|
+
clientKey: string;
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
retries?: number;
|
|
17
|
+
onError?: HttpConfig["onError"];
|
|
18
|
+
}
|
|
19
|
+
export interface CacheIdentity {
|
|
20
|
+
companyId: number;
|
|
21
|
+
userId?: number | string;
|
|
22
|
+
email?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class CacheClient {
|
|
25
|
+
private readonly cfg;
|
|
26
|
+
private readonly clientKey;
|
|
27
|
+
constructor(opts: CacheConfig);
|
|
28
|
+
private headers;
|
|
29
|
+
private resource;
|
|
30
|
+
readonly gridLayouts: {
|
|
31
|
+
list: (id: CacheIdentity) => Promise<HttpResult<{
|
|
32
|
+
ok: boolean;
|
|
33
|
+
} & Record<string, string[]>>>;
|
|
34
|
+
get: (itemId: string, id: CacheIdentity) => Promise<HttpResult<{
|
|
35
|
+
ok: boolean;
|
|
36
|
+
layout?: unknown;
|
|
37
|
+
template?: unknown;
|
|
38
|
+
schema?: unknown;
|
|
39
|
+
post?: unknown;
|
|
40
|
+
updatedAt?: string;
|
|
41
|
+
}>>;
|
|
42
|
+
put: (itemId: string, value: unknown, id: CacheIdentity) => Promise<HttpResult<{
|
|
43
|
+
ok: boolean;
|
|
44
|
+
}>>;
|
|
45
|
+
delete: (itemId: string, id: CacheIdentity) => Promise<HttpResult<{
|
|
46
|
+
ok: boolean;
|
|
47
|
+
}>>;
|
|
48
|
+
};
|
|
49
|
+
readonly reportTemplates: {
|
|
50
|
+
list: (id: CacheIdentity) => Promise<HttpResult<{
|
|
51
|
+
ok: boolean;
|
|
52
|
+
} & Record<string, string[]>>>;
|
|
53
|
+
get: (itemId: string, id: CacheIdentity) => Promise<HttpResult<{
|
|
54
|
+
ok: boolean;
|
|
55
|
+
layout?: unknown;
|
|
56
|
+
template?: unknown;
|
|
57
|
+
schema?: unknown;
|
|
58
|
+
post?: unknown;
|
|
59
|
+
updatedAt?: string;
|
|
60
|
+
}>>;
|
|
61
|
+
put: (itemId: string, value: unknown, id: CacheIdentity) => Promise<HttpResult<{
|
|
62
|
+
ok: boolean;
|
|
63
|
+
}>>;
|
|
64
|
+
delete: (itemId: string, id: CacheIdentity) => Promise<HttpResult<{
|
|
65
|
+
ok: boolean;
|
|
66
|
+
}>>;
|
|
67
|
+
};
|
|
68
|
+
readonly studioSchemas: {
|
|
69
|
+
list: (id: CacheIdentity) => Promise<HttpResult<{
|
|
70
|
+
ok: boolean;
|
|
71
|
+
} & Record<string, string[]>>>;
|
|
72
|
+
get: (itemId: string, id: CacheIdentity) => Promise<HttpResult<{
|
|
73
|
+
ok: boolean;
|
|
74
|
+
layout?: unknown;
|
|
75
|
+
template?: unknown;
|
|
76
|
+
schema?: unknown;
|
|
77
|
+
post?: unknown;
|
|
78
|
+
updatedAt?: string;
|
|
79
|
+
}>>;
|
|
80
|
+
put: (itemId: string, value: unknown, id: CacheIdentity) => Promise<HttpResult<{
|
|
81
|
+
ok: boolean;
|
|
82
|
+
}>>;
|
|
83
|
+
delete: (itemId: string, id: CacheIdentity) => Promise<HttpResult<{
|
|
84
|
+
ok: boolean;
|
|
85
|
+
}>>;
|
|
86
|
+
};
|
|
87
|
+
readonly blogPosts: {
|
|
88
|
+
list: (id: CacheIdentity) => Promise<HttpResult<{
|
|
89
|
+
ok: boolean;
|
|
90
|
+
} & Record<string, string[]>>>;
|
|
91
|
+
get: (itemId: string, id: CacheIdentity) => Promise<HttpResult<{
|
|
92
|
+
ok: boolean;
|
|
93
|
+
layout?: unknown;
|
|
94
|
+
template?: unknown;
|
|
95
|
+
schema?: unknown;
|
|
96
|
+
post?: unknown;
|
|
97
|
+
updatedAt?: string;
|
|
98
|
+
}>>;
|
|
99
|
+
put: (itemId: string, value: unknown, id: CacheIdentity) => Promise<HttpResult<{
|
|
100
|
+
ok: boolean;
|
|
101
|
+
}>>;
|
|
102
|
+
delete: (itemId: string, id: CacheIdentity) => Promise<HttpResult<{
|
|
103
|
+
ok: boolean;
|
|
104
|
+
}>>;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Factory desde env vars:
|
|
109
|
+
* CACHE_URL — default https://cache.zentto.net
|
|
110
|
+
* CACHE_APP_KEY — header x-client-key (obligatoria)
|
|
111
|
+
*/
|
|
112
|
+
export declare function cacheFromEnv(overrides?: Partial<CacheConfig>): CacheClient;
|
|
113
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cache/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAkC,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvG,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAYD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,IAAI,EAAE,WAAW;IAU7B,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,QAAQ;IA6ChB,QAAQ,CAAC,WAAW;mBA3CL,aAAa;gBAA4B,OAAO;;sBAQ7C,MAAM,MAAM,aAAa;gBAA4B,OAAO;;;;;wBAAkF,MAAM;;sBAQpJ,MAAM,sBAAqB,aAAa;gBAA4B,OAAO;;yBAiBxE,MAAM,MAAM,aAAa;gBAA4B,OAAO;;MAUf;IAClE,QAAQ,CAAC,eAAe;mBA5CT,aAAa;gBAA4B,OAAO;;sBAQ7C,MAAM,MAAM,aAAa;gBAA4B,OAAO;;;;;wBAAkF,MAAM;;sBAQpJ,MAAM,sBAAqB,aAAa;gBAA4B,OAAO;;yBAiBxE,MAAM,MAAM,aAAa;gBAA4B,OAAO;;MAWX;IACtE,QAAQ,CAAC,aAAa;mBA7CP,aAAa;gBAA4B,OAAO;;sBAQ7C,MAAM,MAAM,aAAa;gBAA4B,OAAO;;;;;wBAAkF,MAAM;;sBAQpJ,MAAM,sBAAqB,aAAa;gBAA4B,OAAO;;yBAiBxE,MAAM,MAAM,aAAa;gBAA4B,OAAO;;MAYb;IACpE,QAAQ,CAAC,SAAS;mBA9CH,aAAa;gBAA4B,OAAO;;sBAQ7C,MAAM,MAAM,aAAa;gBAA4B,OAAO;;;;;wBAAkF,MAAM;;sBAQpJ,MAAM,sBAAqB,aAAa;gBAA4B,OAAO;;yBAiBxE,MAAM,MAAM,aAAa;gBAA4B,OAAO;;MAajB;CACjE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAM1E"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CacheClient — cliente tipado para zentto-cache (cache.zentto.net).
|
|
3
|
+
*
|
|
4
|
+
* Estandariza el header `x-client-key`. Cada recurso (grid-layouts,
|
|
5
|
+
* report-templates, studio-schemas, blog-posts) expone list/get/put/delete
|
|
6
|
+
* con la misma forma.
|
|
7
|
+
*
|
|
8
|
+
* Identidad del dueño del dato: `companyId` + (`userId` | `email`).
|
|
9
|
+
*/
|
|
10
|
+
import { defaultHttpConfig, httpRequest } from "../internal/http.js";
|
|
11
|
+
function identityQuery(id) {
|
|
12
|
+
return {
|
|
13
|
+
companyId: id.companyId,
|
|
14
|
+
userId: id.userId !== undefined ? String(id.userId) : undefined,
|
|
15
|
+
email: id.email,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export class CacheClient {
|
|
19
|
+
cfg;
|
|
20
|
+
clientKey;
|
|
21
|
+
constructor(opts) {
|
|
22
|
+
this.cfg = defaultHttpConfig({
|
|
23
|
+
baseUrl: opts.baseUrl ?? "https://cache.zentto.net",
|
|
24
|
+
timeoutMs: opts.timeoutMs,
|
|
25
|
+
retries: opts.retries,
|
|
26
|
+
onError: opts.onError,
|
|
27
|
+
});
|
|
28
|
+
this.clientKey = opts.clientKey;
|
|
29
|
+
}
|
|
30
|
+
headers() {
|
|
31
|
+
return { "x-client-key": this.clientKey };
|
|
32
|
+
}
|
|
33
|
+
resource(name) {
|
|
34
|
+
return {
|
|
35
|
+
list: (id) => httpRequest(this.cfg, {
|
|
36
|
+
method: "GET",
|
|
37
|
+
path: `/v1/${name}`,
|
|
38
|
+
query: identityQuery(id),
|
|
39
|
+
headers: this.headers(),
|
|
40
|
+
}),
|
|
41
|
+
get: (itemId, id) => httpRequest(this.cfg, {
|
|
42
|
+
method: "GET",
|
|
43
|
+
path: `/v1/${name}/${encodeURIComponent(itemId)}`,
|
|
44
|
+
query: identityQuery(id),
|
|
45
|
+
headers: this.headers(),
|
|
46
|
+
}),
|
|
47
|
+
put: (itemId, value, id) => httpRequest(this.cfg, {
|
|
48
|
+
method: "PUT",
|
|
49
|
+
path: `/v1/${name}/${encodeURIComponent(itemId)}`,
|
|
50
|
+
body: {
|
|
51
|
+
companyId: id.companyId,
|
|
52
|
+
userId: id.userId,
|
|
53
|
+
email: id.email,
|
|
54
|
+
// El campo varía según el recurso; mandamos todos los shapes vistos en el server.
|
|
55
|
+
layout: value,
|
|
56
|
+
template: value,
|
|
57
|
+
schema: value,
|
|
58
|
+
post: value,
|
|
59
|
+
},
|
|
60
|
+
headers: this.headers(),
|
|
61
|
+
}),
|
|
62
|
+
delete: (itemId, id) => httpRequest(this.cfg, {
|
|
63
|
+
method: "DELETE",
|
|
64
|
+
path: `/v1/${name}/${encodeURIComponent(itemId)}`,
|
|
65
|
+
query: identityQuery(id),
|
|
66
|
+
headers: this.headers(),
|
|
67
|
+
}),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
gridLayouts = this.resource("grid-layouts");
|
|
71
|
+
reportTemplates = this.resource("report-templates");
|
|
72
|
+
studioSchemas = this.resource("studio-schemas");
|
|
73
|
+
blogPosts = this.resource("blog-posts");
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Factory desde env vars:
|
|
77
|
+
* CACHE_URL — default https://cache.zentto.net
|
|
78
|
+
* CACHE_APP_KEY — header x-client-key (obligatoria)
|
|
79
|
+
*/
|
|
80
|
+
export function cacheFromEnv(overrides) {
|
|
81
|
+
return new CacheClient({
|
|
82
|
+
baseUrl: process.env.CACHE_URL,
|
|
83
|
+
clientKey: process.env.CACHE_APP_KEY ?? "",
|
|
84
|
+
...overrides,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cache/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
|