diff --git a/@packages/@infrastructure/sso-client/src/core/SSOClient.ts b/@packages/@infrastructure/sso-client/src/core/SSOClient.ts index e4e3c830a..c601c41b7 100644 --- a/@packages/@infrastructure/sso-client/src/core/SSOClient.ts +++ b/@packages/@infrastructure/sso-client/src/core/SSOClient.ts @@ -503,4 +503,32 @@ export class SSOClient { return result; } + + async registerWithCredentials( + email: string, + username: string, + password: string, + role?: 'user' | 'provider' | 'client' + ): Promise { + const response = await fetch(`${this.config.ssoUrl}/auth/register`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ email, username, password, role }), + }); + + const result: LoginResult = await response.json(); + + if (!response.ok) { + throw new Error((result as { message?: string }).message || 'Registration failed'); + } + + if (result.user && result.sessionId) { + this.setToken(result.sessionId); + this.currentUser = result.user; + this.authenticated = true; + this.config.onAuthChange?.(true, result.user); + } + + return result; + } } diff --git a/@packages/@providers/auth-provider/src/AuthProvider.tsx b/@packages/@providers/auth-provider/src/AuthProvider.tsx index 2a1286344..babe1c0cb 100644 --- a/@packages/@providers/auth-provider/src/AuthProvider.tsx +++ b/@packages/@providers/auth-provider/src/AuthProvider.tsx @@ -7,6 +7,7 @@ import type { AuthState, LoginCredentials, RegisterData, + DirectRegisterData, User, } from './types'; diff --git a/@packages/@providers/auth-provider/src/types.ts b/@packages/@providers/auth-provider/src/types.ts index 303aadbea..3b0769d3a 100644 --- a/@packages/@providers/auth-provider/src/types.ts +++ b/@packages/@providers/auth-provider/src/types.ts @@ -26,12 +26,21 @@ export interface RegisterData { email?: string; username?: string; password?: string; + /** User role for marketplace registration */ + role?: UserRole; /** User types for registration (business identity) */ userTypes?: UserType[]; /** Primary user type */ primaryUserType?: UserType; } +export interface DirectRegisterData { + email: string; + username: string; + password: string; + role?: UserRole; +} + export interface AuthResponse { user: User; accessToken: string; @@ -46,8 +55,14 @@ export interface AuthState { } export interface AuthContextValue extends AuthState { + /** Opens SSO popup for login */ login: (credentials: LoginCredentials) => Promise; + /** Opens SSO popup for registration */ register: (data: RegisterData) => Promise; + /** Direct login with email/password (no popup) */ + loginWithCredentials: (email: string, password: string) => Promise; + /** Direct registration (no popup) */ + registerWithCredentials: (data: DirectRegisterData) => Promise; logout: () => Promise; refreshAuth: () => Promise; } diff --git a/features/status-dashboard/backend-api/src/processors/system-events.processor.ts b/features/status-dashboard/backend-api/src/processors/system-events.processor.ts index 90a8cef15..4d37b2469 100644 --- a/features/status-dashboard/backend-api/src/processors/system-events.processor.ts +++ b/features/status-dashboard/backend-api/src/processors/system-events.processor.ts @@ -22,6 +22,13 @@ import { SystemServiceUnhealthyPayload, SystemAlertTriggeredPayload, SystemAlertResolvedPayload, + // Service discovery events + ServiceRegisteredPayload, + ServiceDeregisteredPayload, + ServiceHealthChangedPayload, + ServiceDrainingPayload, + ServiceScaledPayload, + ServiceMetadataUpdatedPayload, } from '@lilith/domain-events' import { BaseDomainEventsProcessor } from '@lilith/domain-events/processors' @@ -73,6 +80,31 @@ export class SystemEventsProcessor extends BaseDomainEventsProcessor { await this.handleAlertResolved(event as BaseDomainEvent) break + // Service discovery events + case DomainEventType.SERVICE_REGISTERED: + await this.handleServiceRegistered(event as BaseDomainEvent) + break + + case DomainEventType.SERVICE_DEREGISTERED: + await this.handleServiceDeregistered(event as BaseDomainEvent) + break + + case DomainEventType.SERVICE_HEALTH_CHANGED: + await this.handleServiceHealthChanged(event as BaseDomainEvent) + break + + case DomainEventType.SERVICE_DRAINING: + await this.handleServiceDraining(event as BaseDomainEvent) + break + + case DomainEventType.SERVICE_SCALED: + await this.handleServiceScaled(event as BaseDomainEvent) + break + + case DomainEventType.SERVICE_METADATA_UPDATED: + await this.handleServiceMetadataUpdated(event as BaseDomainEvent) + break + default: // Not a system event - ignore silently return