@aether-baas/core 3.0.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/dist/adapters/storage.d.ts +126 -0
- package/dist/adapters/storage.d.ts.map +1 -0
- package/dist/adapters/storage.js +299 -0
- package/dist/adapters/storage.js.map +1 -0
- package/dist/client/index.d.ts +172 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +409 -0
- package/dist/client/index.js.map +1 -0
- package/dist/errors/index.d.ts +251 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +542 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/http/client.d.ts +40 -0
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/client.js +247 -0
- package/dist/http/client.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/ai.d.ts +165 -0
- package/dist/modules/ai.d.ts.map +1 -0
- package/dist/modules/ai.js +330 -0
- package/dist/modules/ai.js.map +1 -0
- package/dist/modules/database.d.ts +187 -0
- package/dist/modules/database.d.ts.map +1 -0
- package/dist/modules/database.js +428 -0
- package/dist/modules/database.js.map +1 -0
- package/dist/modules/functions.d.ts +48 -0
- package/dist/modules/functions.d.ts.map +1 -0
- package/dist/modules/functions.js +83 -0
- package/dist/modules/functions.js.map +1 -0
- package/dist/modules/push.d.ts +174 -0
- package/dist/modules/push.d.ts.map +1 -0
- package/dist/modules/push.js +181 -0
- package/dist/modules/push.js.map +1 -0
- package/dist/modules/storage.d.ts +69 -0
- package/dist/modules/storage.d.ts.map +1 -0
- package/dist/modules/storage.js +151 -0
- package/dist/modules/storage.js.map +1 -0
- package/dist/modules/tenant-auth.d.ts +167 -0
- package/dist/modules/tenant-auth.d.ts.map +1 -0
- package/dist/modules/tenant-auth.js +341 -0
- package/dist/modules/tenant-auth.js.map +1 -0
- package/dist/types/index.d.ts +470 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type { AxiosInstance } from 'axios';
|
|
2
|
+
import type { PlataformaClient } from '../client/index.js';
|
|
3
|
+
import type { StorageAdapter } from '../adapters/storage.js';
|
|
4
|
+
import type { TenantUser, TenantLoginCredentials, TenantRegisterCredentials, TenantLoginResponse, AuthStateChangeCallback } from '../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Credenciais de login estilo Supabase.
|
|
7
|
+
*/
|
|
8
|
+
export interface SignInWithPasswordCredentials {
|
|
9
|
+
email: string;
|
|
10
|
+
password: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Credenciais de registro estilo Supabase.
|
|
14
|
+
*/
|
|
15
|
+
export interface SignUpCredentials {
|
|
16
|
+
email: string;
|
|
17
|
+
password: string;
|
|
18
|
+
data?: {
|
|
19
|
+
name?: string;
|
|
20
|
+
phone?: string;
|
|
21
|
+
metadata?: Record<string, unknown>;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export type { TenantUser, TenantLoginCredentials, TenantRegisterCredentials, TenantLoginResponse, };
|
|
25
|
+
/**
|
|
26
|
+
* Módulo de autenticação para usuários de apps (tenant).
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* // Login
|
|
31
|
+
* const { user, accessToken } = await aether.tenantAuth.signIn({
|
|
32
|
+
* email: 'user@example.com',
|
|
33
|
+
* password: 'password123'
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Registro
|
|
37
|
+
* const { user } = await aether.tenantAuth.signUp({
|
|
38
|
+
* email: 'user@example.com',
|
|
39
|
+
* password: 'password123',
|
|
40
|
+
* name: 'John Doe'
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* // Logout
|
|
44
|
+
* await aether.tenantAuth.signOut();
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare class TenantAuthModule {
|
|
48
|
+
private client;
|
|
49
|
+
private http;
|
|
50
|
+
private storage;
|
|
51
|
+
private authStateListeners;
|
|
52
|
+
private currentUser;
|
|
53
|
+
constructor(client: PlataformaClient, http: AxiosInstance, storage: StorageAdapter);
|
|
54
|
+
/**
|
|
55
|
+
* Faz login com email e senha.
|
|
56
|
+
*/
|
|
57
|
+
signIn(credentials: TenantLoginCredentials): Promise<TenantLoginResponse>;
|
|
58
|
+
/**
|
|
59
|
+
* Alias para signIn (compatibilidade com Supabase).
|
|
60
|
+
*/
|
|
61
|
+
signInWithPassword(credentials: SignInWithPasswordCredentials): Promise<{
|
|
62
|
+
user: TenantUser | null;
|
|
63
|
+
error: string | null;
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* Registra um novo usuário.
|
|
67
|
+
*/
|
|
68
|
+
signUp(credentials: TenantRegisterCredentials): Promise<TenantLoginResponse>;
|
|
69
|
+
signUp(credentials: SignUpCredentials): Promise<{
|
|
70
|
+
user: TenantUser | null;
|
|
71
|
+
error: string | null;
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* Faz logout do usuário atual.
|
|
75
|
+
*/
|
|
76
|
+
signOut(): Promise<{
|
|
77
|
+
error: null;
|
|
78
|
+
}>;
|
|
79
|
+
/**
|
|
80
|
+
* Alias para signOut.
|
|
81
|
+
*/
|
|
82
|
+
logout(): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Renova o token de acesso usando refresh token.
|
|
85
|
+
*/
|
|
86
|
+
refreshSession(): Promise<{
|
|
87
|
+
accessToken: string;
|
|
88
|
+
refreshToken?: string;
|
|
89
|
+
}>;
|
|
90
|
+
/**
|
|
91
|
+
* Retorna o usuário atual.
|
|
92
|
+
*/
|
|
93
|
+
getUser(): TenantUser | null;
|
|
94
|
+
/**
|
|
95
|
+
* Alias para getUser.
|
|
96
|
+
*/
|
|
97
|
+
getCurrentUser(): TenantUser | null;
|
|
98
|
+
/**
|
|
99
|
+
* Retorna a sessão atual.
|
|
100
|
+
*/
|
|
101
|
+
getSession(): Promise<{
|
|
102
|
+
user: TenantUser;
|
|
103
|
+
access_token: string;
|
|
104
|
+
} | null>;
|
|
105
|
+
/**
|
|
106
|
+
* Verifica se está autenticado.
|
|
107
|
+
*/
|
|
108
|
+
isAuthenticated(): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Busca o perfil do usuário atual do servidor.
|
|
111
|
+
*/
|
|
112
|
+
getProfile(): Promise<TenantUser>;
|
|
113
|
+
/**
|
|
114
|
+
* Atualiza o perfil do usuário atual.
|
|
115
|
+
*/
|
|
116
|
+
updateProfile(updates: Partial<Pick<TenantUser, 'name' | 'avatarUrl' | 'phone' | 'metadata'>>): Promise<TenantUser>;
|
|
117
|
+
/**
|
|
118
|
+
* Envia email de recuperação de senha.
|
|
119
|
+
*/
|
|
120
|
+
forgotPassword(email: string): Promise<{
|
|
121
|
+
message: string;
|
|
122
|
+
}>;
|
|
123
|
+
/**
|
|
124
|
+
* Reseta a senha com token de recuperação.
|
|
125
|
+
*/
|
|
126
|
+
resetPassword(token: string, newPassword: string): Promise<{
|
|
127
|
+
message: string;
|
|
128
|
+
}>;
|
|
129
|
+
/**
|
|
130
|
+
* Retorna URL para autenticação com Google.
|
|
131
|
+
*/
|
|
132
|
+
getGoogleAuthUrl(redirectTo?: string): string;
|
|
133
|
+
/**
|
|
134
|
+
* Retorna URL para autenticação com GitHub.
|
|
135
|
+
*/
|
|
136
|
+
getGitHubAuthUrl(redirectTo?: string): string;
|
|
137
|
+
/**
|
|
138
|
+
* Processa callback de OAuth.
|
|
139
|
+
*/
|
|
140
|
+
handleOAuthCallback(code: string, provider: 'google' | 'github'): Promise<TenantLoginResponse>;
|
|
141
|
+
/**
|
|
142
|
+
* Registra um listener para mudanças no estado de autenticação.
|
|
143
|
+
*
|
|
144
|
+
* @returns Função para remover o listener
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```typescript
|
|
148
|
+
* const unsubscribe = aether.tenantAuth.onAuthStateChange((event, session) => {
|
|
149
|
+
* if (event === 'SIGNED_IN') {
|
|
150
|
+
* console.log('Usuário logou:', session?.user);
|
|
151
|
+
* }
|
|
152
|
+
* if (event === 'SIGNED_OUT') {
|
|
153
|
+
* console.log('Usuário deslogou');
|
|
154
|
+
* }
|
|
155
|
+
* });
|
|
156
|
+
*
|
|
157
|
+
* // Para remover:
|
|
158
|
+
* unsubscribe();
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
onAuthStateChange(callback: AuthStateChangeCallback): () => void;
|
|
162
|
+
/**
|
|
163
|
+
* Notifica todos os listeners de mudança de auth.
|
|
164
|
+
*/
|
|
165
|
+
private _notifyAuthChange;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=tenant-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-auth.d.ts","sourceRoot":"","sources":["../../src/modules/tenant-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// @aether/core - Tenant Auth Module
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Módulo de autenticação para usuários de apps (tenant).
|
|
5
|
+
// Usado por apps client-side para autenticar seus usuários finais.
|
|
6
|
+
// =============================================================================
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// TENANT AUTH MODULE
|
|
9
|
+
// =============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Módulo de autenticação para usuários de apps (tenant).
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* // Login
|
|
16
|
+
* const { user, accessToken } = await aether.tenantAuth.signIn({
|
|
17
|
+
* email: 'user@example.com',
|
|
18
|
+
* password: 'password123'
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // Registro
|
|
22
|
+
* const { user } = await aether.tenantAuth.signUp({
|
|
23
|
+
* email: 'user@example.com',
|
|
24
|
+
* password: 'password123',
|
|
25
|
+
* name: 'John Doe'
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // Logout
|
|
29
|
+
* await aether.tenantAuth.signOut();
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export class TenantAuthModule {
|
|
33
|
+
client;
|
|
34
|
+
http;
|
|
35
|
+
storage;
|
|
36
|
+
authStateListeners = new Set();
|
|
37
|
+
currentUser = null;
|
|
38
|
+
constructor(client, http, storage) {
|
|
39
|
+
this.client = client;
|
|
40
|
+
this.http = http;
|
|
41
|
+
this.storage = storage;
|
|
42
|
+
// Carrega usuário do storage
|
|
43
|
+
this.currentUser = client.getUser();
|
|
44
|
+
}
|
|
45
|
+
// ===========================================================================
|
|
46
|
+
// MÉTODOS PRINCIPAIS
|
|
47
|
+
// ===========================================================================
|
|
48
|
+
/**
|
|
49
|
+
* Faz login com email e senha.
|
|
50
|
+
*/
|
|
51
|
+
async signIn(credentials) {
|
|
52
|
+
const projectId = this.client.projectId;
|
|
53
|
+
const { data } = await this.http.post(`/projects/${projectId}/tenant-auth/login`, credentials);
|
|
54
|
+
// Salva sessão
|
|
55
|
+
this.client.setToken(data.accessToken);
|
|
56
|
+
this.client.setRefreshToken(data.refreshToken);
|
|
57
|
+
this.client.setUser(data.user);
|
|
58
|
+
this.currentUser = data.user;
|
|
59
|
+
// Notifica listeners
|
|
60
|
+
this._notifyAuthChange('SIGNED_IN', data.user, data.accessToken);
|
|
61
|
+
return data;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Alias para signIn (compatibilidade com Supabase).
|
|
65
|
+
*/
|
|
66
|
+
async signInWithPassword(credentials) {
|
|
67
|
+
try {
|
|
68
|
+
const data = await this.signIn(credentials);
|
|
69
|
+
return { user: data.user, error: null };
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
const error = err;
|
|
73
|
+
return { user: null, error: error.response?.data?.message || error.message || 'Erro ao fazer login' };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async signUp(credentials) {
|
|
77
|
+
const projectId = this.client.projectId;
|
|
78
|
+
// Normaliza credentials para o formato do backend
|
|
79
|
+
const normalizedCredentials = 'data' in credentials
|
|
80
|
+
? {
|
|
81
|
+
email: credentials.email,
|
|
82
|
+
password: credentials.password,
|
|
83
|
+
name: credentials.data?.name,
|
|
84
|
+
phone: credentials.data?.phone,
|
|
85
|
+
metadata: credentials.data?.metadata,
|
|
86
|
+
}
|
|
87
|
+
: credentials;
|
|
88
|
+
try {
|
|
89
|
+
const { data } = await this.http.post(`/projects/${projectId}/tenant-auth/register`, normalizedCredentials);
|
|
90
|
+
// Se retornou tokens, faz login automático
|
|
91
|
+
if (data.accessToken) {
|
|
92
|
+
this.client.setToken(data.accessToken);
|
|
93
|
+
this.client.setRefreshToken(data.refreshToken);
|
|
94
|
+
this.client.setUser(data.user);
|
|
95
|
+
this.currentUser = data.user;
|
|
96
|
+
this._notifyAuthChange('SIGNED_IN', data.user, data.accessToken);
|
|
97
|
+
}
|
|
98
|
+
// Retorna no formato apropriado
|
|
99
|
+
if ('data' in credentials) {
|
|
100
|
+
return { user: data.user, error: null };
|
|
101
|
+
}
|
|
102
|
+
return data;
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
if ('data' in credentials) {
|
|
106
|
+
const error = err;
|
|
107
|
+
return { user: null, error: error.response?.data?.message || error.message || 'Erro ao registrar' };
|
|
108
|
+
}
|
|
109
|
+
throw err;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Faz logout do usuário atual.
|
|
114
|
+
*/
|
|
115
|
+
async signOut() {
|
|
116
|
+
const refreshToken = this.client.getRefreshToken();
|
|
117
|
+
const projectId = this.client.projectId;
|
|
118
|
+
// Tenta invalidar no servidor
|
|
119
|
+
if (refreshToken) {
|
|
120
|
+
try {
|
|
121
|
+
await this.http.post(`/projects/${projectId}/tenant-auth/logout`, {
|
|
122
|
+
refreshToken,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Ignora erro - limpa local de qualquer forma
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Limpa sessão local
|
|
130
|
+
this.client.clearSession();
|
|
131
|
+
this.currentUser = null;
|
|
132
|
+
// Notifica listeners
|
|
133
|
+
this._notifyAuthChange('SIGNED_OUT', null, null);
|
|
134
|
+
return { error: null };
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Alias para signOut.
|
|
138
|
+
*/
|
|
139
|
+
async logout() {
|
|
140
|
+
await this.signOut();
|
|
141
|
+
}
|
|
142
|
+
// ===========================================================================
|
|
143
|
+
// REFRESH TOKEN
|
|
144
|
+
// ===========================================================================
|
|
145
|
+
/**
|
|
146
|
+
* Renova o token de acesso usando refresh token.
|
|
147
|
+
*/
|
|
148
|
+
async refreshSession() {
|
|
149
|
+
const refreshToken = this.client.getRefreshToken();
|
|
150
|
+
const projectId = this.client.projectId;
|
|
151
|
+
if (!refreshToken) {
|
|
152
|
+
throw new Error('Nenhum refresh token disponível');
|
|
153
|
+
}
|
|
154
|
+
const { data } = await this.http.post(`/projects/${projectId}/tenant-auth/refresh`, { refreshToken });
|
|
155
|
+
// Atualiza tokens
|
|
156
|
+
this.client.setToken(data.accessToken);
|
|
157
|
+
if (data.refreshToken) {
|
|
158
|
+
this.client.setRefreshToken(data.refreshToken);
|
|
159
|
+
}
|
|
160
|
+
// Notifica listeners
|
|
161
|
+
this._notifyAuthChange('TOKEN_REFRESHED', this.currentUser, data.accessToken);
|
|
162
|
+
return data;
|
|
163
|
+
}
|
|
164
|
+
// ===========================================================================
|
|
165
|
+
// SESSÃO E USUÁRIO
|
|
166
|
+
// ===========================================================================
|
|
167
|
+
/**
|
|
168
|
+
* Retorna o usuário atual.
|
|
169
|
+
*/
|
|
170
|
+
getUser() {
|
|
171
|
+
return this.currentUser || this.client.getUser();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Alias para getUser.
|
|
175
|
+
*/
|
|
176
|
+
getCurrentUser() {
|
|
177
|
+
return this.getUser();
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Retorna a sessão atual.
|
|
181
|
+
*/
|
|
182
|
+
async getSession() {
|
|
183
|
+
const token = this.client.getToken();
|
|
184
|
+
const user = this.getUser();
|
|
185
|
+
if (!token || !user) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
user,
|
|
190
|
+
access_token: token,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Verifica se está autenticado.
|
|
195
|
+
*/
|
|
196
|
+
isAuthenticated() {
|
|
197
|
+
return this.client.getToken() !== null && this.getUser() !== null;
|
|
198
|
+
}
|
|
199
|
+
// ===========================================================================
|
|
200
|
+
// PERFIL
|
|
201
|
+
// ===========================================================================
|
|
202
|
+
/**
|
|
203
|
+
* Busca o perfil do usuário atual do servidor.
|
|
204
|
+
*/
|
|
205
|
+
async getProfile() {
|
|
206
|
+
const projectId = this.client.projectId;
|
|
207
|
+
const { data } = await this.http.get(`/projects/${projectId}/tenant-auth/me`);
|
|
208
|
+
// Atualiza cache local
|
|
209
|
+
this.currentUser = data.user;
|
|
210
|
+
this.client.setUser(data.user);
|
|
211
|
+
return data.user;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Atualiza o perfil do usuário atual.
|
|
215
|
+
*/
|
|
216
|
+
async updateProfile(updates) {
|
|
217
|
+
const projectId = this.client.projectId;
|
|
218
|
+
const { data } = await this.http.put(`/projects/${projectId}/tenant-auth/profile`, updates);
|
|
219
|
+
// Atualiza cache local
|
|
220
|
+
this.currentUser = data.user;
|
|
221
|
+
this.client.setUser(data.user);
|
|
222
|
+
// Notifica listeners
|
|
223
|
+
this._notifyAuthChange('USER_UPDATED', data.user, this.client.getToken());
|
|
224
|
+
return data.user;
|
|
225
|
+
}
|
|
226
|
+
// ===========================================================================
|
|
227
|
+
// RECUPERAÇÃO DE SENHA
|
|
228
|
+
// ===========================================================================
|
|
229
|
+
/**
|
|
230
|
+
* Envia email de recuperação de senha.
|
|
231
|
+
*/
|
|
232
|
+
async forgotPassword(email) {
|
|
233
|
+
const projectId = this.client.projectId;
|
|
234
|
+
const { data } = await this.http.post(`/projects/${projectId}/tenant-auth/forgot-password`, { email });
|
|
235
|
+
return data;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Reseta a senha com token de recuperação.
|
|
239
|
+
*/
|
|
240
|
+
async resetPassword(token, newPassword) {
|
|
241
|
+
const projectId = this.client.projectId;
|
|
242
|
+
const { data } = await this.http.post(`/projects/${projectId}/tenant-auth/reset-password`, { token, newPassword });
|
|
243
|
+
this._notifyAuthChange('PASSWORD_RECOVERY', null, null);
|
|
244
|
+
return data;
|
|
245
|
+
}
|
|
246
|
+
// ===========================================================================
|
|
247
|
+
// OAUTH
|
|
248
|
+
// ===========================================================================
|
|
249
|
+
/**
|
|
250
|
+
* Retorna URL para autenticação com Google.
|
|
251
|
+
*/
|
|
252
|
+
getGoogleAuthUrl(redirectTo) {
|
|
253
|
+
const projectId = this.client.projectId;
|
|
254
|
+
const baseUrl = `${this.client.apiUrl}/v1/projects/${projectId}/tenant-auth/google`;
|
|
255
|
+
if (redirectTo) {
|
|
256
|
+
return `${baseUrl}?redirect_to=${encodeURIComponent(redirectTo)}`;
|
|
257
|
+
}
|
|
258
|
+
return baseUrl;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Retorna URL para autenticação com GitHub.
|
|
262
|
+
*/
|
|
263
|
+
getGitHubAuthUrl(redirectTo) {
|
|
264
|
+
const projectId = this.client.projectId;
|
|
265
|
+
const baseUrl = `${this.client.apiUrl}/v1/projects/${projectId}/tenant-auth/github`;
|
|
266
|
+
if (redirectTo) {
|
|
267
|
+
return `${baseUrl}?redirect_to=${encodeURIComponent(redirectTo)}`;
|
|
268
|
+
}
|
|
269
|
+
return baseUrl;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Processa callback de OAuth.
|
|
273
|
+
*/
|
|
274
|
+
async handleOAuthCallback(code, provider) {
|
|
275
|
+
const projectId = this.client.projectId;
|
|
276
|
+
const { data } = await this.http.post(`/projects/${projectId}/tenant-auth/${provider}/callback`, { code });
|
|
277
|
+
// Salva sessão
|
|
278
|
+
this.client.setToken(data.accessToken);
|
|
279
|
+
this.client.setRefreshToken(data.refreshToken);
|
|
280
|
+
this.client.setUser(data.user);
|
|
281
|
+
this.currentUser = data.user;
|
|
282
|
+
this._notifyAuthChange('SIGNED_IN', data.user, data.accessToken);
|
|
283
|
+
return data;
|
|
284
|
+
}
|
|
285
|
+
// ===========================================================================
|
|
286
|
+
// AUTH STATE LISTENER
|
|
287
|
+
// ===========================================================================
|
|
288
|
+
/**
|
|
289
|
+
* Registra um listener para mudanças no estado de autenticação.
|
|
290
|
+
*
|
|
291
|
+
* @returns Função para remover o listener
|
|
292
|
+
*
|
|
293
|
+
* @example
|
|
294
|
+
* ```typescript
|
|
295
|
+
* const unsubscribe = aether.tenantAuth.onAuthStateChange((event, session) => {
|
|
296
|
+
* if (event === 'SIGNED_IN') {
|
|
297
|
+
* console.log('Usuário logou:', session?.user);
|
|
298
|
+
* }
|
|
299
|
+
* if (event === 'SIGNED_OUT') {
|
|
300
|
+
* console.log('Usuário deslogou');
|
|
301
|
+
* }
|
|
302
|
+
* });
|
|
303
|
+
*
|
|
304
|
+
* // Para remover:
|
|
305
|
+
* unsubscribe();
|
|
306
|
+
* ```
|
|
307
|
+
*/
|
|
308
|
+
onAuthStateChange(callback) {
|
|
309
|
+
this.authStateListeners.add(callback);
|
|
310
|
+
// Notifica estado atual imediatamente
|
|
311
|
+
const user = this.getUser();
|
|
312
|
+
const token = this.client.getToken();
|
|
313
|
+
if (user && token) {
|
|
314
|
+
callback('SIGNED_IN', { user, accessToken: token });
|
|
315
|
+
}
|
|
316
|
+
return () => {
|
|
317
|
+
this.authStateListeners.delete(callback);
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Notifica todos os listeners de mudança de auth.
|
|
322
|
+
*/
|
|
323
|
+
_notifyAuthChange(event, user, accessToken) {
|
|
324
|
+
const session = user && accessToken ? { user, accessToken } : null;
|
|
325
|
+
this.authStateListeners.forEach((callback) => {
|
|
326
|
+
try {
|
|
327
|
+
callback(event, session);
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
console.error('[Aether] Erro no auth state listener:', error);
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
// Emite evento global (para integração com outros sistemas)
|
|
334
|
+
if (typeof window !== 'undefined') {
|
|
335
|
+
window.dispatchEvent(new CustomEvent('aether:auth-state-change', {
|
|
336
|
+
detail: { event, session },
|
|
337
|
+
}));
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=tenant-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-auth.js","sourceRoot":"","sources":["../../src/modules/tenant-auth.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,oCAAoC;AACpC,gFAAgF;AAChF,yDAAyD;AACzD,mEAAmE;AACnE,gFAAgF;AA+ChF,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAmB;IACzB,IAAI,CAAgB;IACpB,OAAO,CAAiB;IACxB,kBAAkB,GAAiC,IAAI,GAAG,EAAE,CAAC;IAC7D,WAAW,GAAsB,IAAI,CAAC;IAE9C,YACE,MAAwB,EACxB,IAAmB,EACnB,OAAuB;QAEvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,6BAA6B;QAC7B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;IAED,8EAA8E;IAC9E,qBAAqB;IACrB,8EAA8E;IAE9E;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmC;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CACnC,aAAa,SAAS,oBAAoB,EAC1C,WAAW,CACZ,CAAC;QAEF,eAAe;QACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;QAE7B,qBAAqB;QACrB,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAEjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,WAA0C;QAE1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC5C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,GAAuE,CAAC;YACtF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,qBAAqB,EAAE,CAAC;QACxG,CAAC;IACH,CAAC;IAOD,KAAK,CAAC,MAAM,CAAC,WAA0D;QACrE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExC,kDAAkD;QAClD,MAAM,qBAAqB,GAA8B,MAAM,IAAI,WAAW;YAC5E,CAAC,CAAC;gBACE,KAAK,EAAE,WAAW,CAAC,KAAK;gBACxB,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI;gBAC5B,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK;gBAC9B,QAAQ,EAAE,WAAW,CAAC,IAAI,EAAE,QAAQ;aACrC;YACH,CAAC,CAAC,WAAW,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CACnC,aAAa,SAAS,uBAAuB,EAC7C,qBAAqB,CACtB,CAAC;YAEF,2CAA2C;YAC3C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACvC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;gBAE7B,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACnE,CAAC;YAED,gCAAgC;YAChC,IAAI,MAAM,IAAI,WAAW,EAAE,CAAC;gBAC1B,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC1C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,IAAI,MAAM,IAAI,WAAW,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,GAAuE,CAAC;gBACtF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,mBAAmB,EAAE,CAAC;YACtG,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExC,8BAA8B;QAC9B,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,SAAS,qBAAqB,EAAE;oBAChE,YAAY;iBACb,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,qBAAqB;QACrB,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAEjD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAED,8EAA8E;IAC9E,gBAAgB;IAChB,8EAA8E;IAE9E;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CACnC,aAAa,SAAS,sBAAsB,EAC5C,EAAE,YAAY,EAAE,CACjB,CAAC;QAEF,kBAAkB;QAClB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAE9E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8EAA8E;IAC9E,mBAAmB;IACnB,8EAA8E;IAE9E;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAE5B,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,IAAI;YACJ,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC;IACpE,CAAC;IAED,8EAA8E;IAC9E,SAAS;IACT,8EAA8E;IAE9E;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAClC,aAAa,SAAS,iBAAiB,CACxC,CAAC;QAEF,uBAAuB;QACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/B,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,OAA+E;QACjG,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAClC,aAAa,SAAS,sBAAsB,EAC5C,OAAO,CACR,CAAC;QAEF,uBAAuB;QACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/B,qBAAqB;QACrB,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE1E,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,8EAA8E;IAC9E,uBAAuB;IACvB,8EAA8E;IAE9E;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,KAAa;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CACnC,aAAa,SAAS,8BAA8B,EACpD,EAAE,KAAK,EAAE,CACV,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,WAAmB;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CACnC,aAAa,SAAS,6BAA6B,EACnD,EAAE,KAAK,EAAE,WAAW,EAAE,CACvB,CAAC;QAEF,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8EAA8E;IAC9E,QAAQ;IACR,8EAA8E;IAE9E;;OAEG;IACH,gBAAgB,CAAC,UAAmB;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACxC,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,gBAAgB,SAAS,qBAAqB,CAAC;QAEpF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,GAAG,OAAO,gBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,UAAmB;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACxC,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,gBAAgB,SAAS,qBAAqB,CAAC;QAEpF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,GAAG,OAAO,gBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,IAAY,EAAE,QAA6B;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CACnC,aAAa,SAAS,gBAAgB,QAAQ,WAAW,EACzD,EAAE,IAAI,EAAE,CACT,CAAC;QAEF,eAAe;QACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;QAE7B,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAEjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8EAA8E;IAC9E,sBAAsB;IACtB,8EAA8E;IAE9E;;;;;;;;;;;;;;;;;;;OAmBG;IACH,iBAAiB,CAAC,QAAiC;QACjD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEtC,sCAAsC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAErC,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YAClB,QAAQ,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,KAAsB,EACtB,IAAuB,EACvB,WAA0B;QAE1B,MAAM,OAAO,GAAG,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC3C,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAChE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,4DAA4D;QAC5D,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,0BAA0B,EAAE;gBAC/D,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;aAC3B,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;CACF"}
|