refactor: stricer domain: notifications
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
/* eslint-disable @typescript-eslint/member-ordering */
|
||||
import { Injectable, inject } from '@angular/core';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Observable } from 'rxjs';
|
||||
import { type ServerEndpoint, ServerDirectoryFacade } from '../../../server-directory';
|
||||
import type { LoginResponse } from '../../domain/models/authentication.model';
|
||||
|
||||
/**
|
||||
* Handles user authentication (login and registration) against a
|
||||
* configurable back-end server.
|
||||
*
|
||||
* The target server is resolved via {@link ServerDirectoryFacade}: the
|
||||
* caller may pass an explicit `serverId`, otherwise the currently active
|
||||
* server endpoint is used.
|
||||
*/
|
||||
@Injectable({ providedIn: 'root' })
|
||||
export class AuthenticationService {
|
||||
private readonly http = inject(HttpClient);
|
||||
private readonly serverDirectory = inject(ServerDirectoryFacade);
|
||||
|
||||
/**
|
||||
* Resolve the API base URL for the given server.
|
||||
*
|
||||
* @param serverId - Optional server ID to look up. When omitted the
|
||||
* currently active endpoint is used.
|
||||
* @returns Fully-qualified API base URL (e.g. `http://host:3001/api`).
|
||||
*/
|
||||
private endpointFor(serverId?: string): string {
|
||||
let endpoint: ServerEndpoint | undefined;
|
||||
|
||||
if (serverId) {
|
||||
endpoint = this.serverDirectory.servers().find(
|
||||
(server) => server.id === serverId
|
||||
);
|
||||
}
|
||||
|
||||
const activeEndpoint = endpoint ?? this.serverDirectory.activeServer();
|
||||
|
||||
return activeEndpoint
|
||||
? `${activeEndpoint.url}/api`
|
||||
: this.serverDirectory.getApiBaseUrl();
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a new user account on the target server.
|
||||
*
|
||||
* @param params - Registration parameters.
|
||||
* @param params.username - Desired login username.
|
||||
* @param params.password - Account password.
|
||||
* @param params.displayName - Optional display name (defaults to username on the server).
|
||||
* @param params.serverId - Optional server ID to register against.
|
||||
* @returns Observable emitting the {@link LoginResponse} on success.
|
||||
*/
|
||||
register(params: {
|
||||
username: string;
|
||||
password: string;
|
||||
displayName?: string;
|
||||
serverId?: string;
|
||||
}): Observable<LoginResponse> {
|
||||
const url = `${this.endpointFor(params.serverId)}/users/register`;
|
||||
|
||||
return this.http.post<LoginResponse>(url, {
|
||||
username: params.username,
|
||||
password: params.password,
|
||||
displayName: params.displayName
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Log in to an existing user account on the target server.
|
||||
*
|
||||
* @param params - Login parameters.
|
||||
* @param params.username - Login username.
|
||||
* @param params.password - Account password.
|
||||
* @param params.serverId - Optional server ID to authenticate against.
|
||||
* @returns Observable emitting the {@link LoginResponse} on success.
|
||||
*/
|
||||
login(params: {
|
||||
username: string;
|
||||
password: string;
|
||||
serverId?: string;
|
||||
}): Observable<LoginResponse> {
|
||||
const url = `${this.endpointFor(params.serverId)}/users/login`;
|
||||
|
||||
return this.http.post<LoginResponse>(url, {
|
||||
username: params.username,
|
||||
password: params.password
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user