import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable } from 'rxjs'; import { environment } from '../../environments/environment'; export type UserPermission = 'sysadmin' | 'gestor' | 'cliente'; export type UserDto = { id: string; nome: string; email: string; permissao: UserPermission; tenantId: string; ativo?: boolean; }; export type ApiFieldError = { field?: string | null; message: string; }; export type ApiErrorResponse = { errors?: ApiFieldError[]; }; export type CreateUserPayload = { nome: string; email: string; senha: string; confirmarSenha: string; permissao: UserPermission; }; export type UsersListParams = { search?: string; permissao?: UserPermission; page?: number; pageSize?: number; }; export type UpdateUserPayload = { nome?: string; email?: string; senha?: string; confirmarSenha?: string; permissao?: UserPermission; ativo?: boolean; }; export type PagedResult = { items: T[]; total: number; page: number; pageSize: number; }; @Injectable({ providedIn: 'root' }) export class UsersService { private readonly baseApi: string; constructor(private http: HttpClient) { const raw = (environment.apiUrl || '').replace(/\/+$/, ''); this.baseApi = raw.toLowerCase().endsWith('/api') ? raw : `${raw}/api`; } create(payload: CreateUserPayload): Observable { return this.http.post(`${this.baseApi}/users`, payload); } list(params: UsersListParams): Observable> { let httpParams = new HttpParams(); if (params.search) httpParams = httpParams.set('search', params.search); if (params.permissao) httpParams = httpParams.set('permissao', params.permissao); if (params.page) httpParams = httpParams.set('page', String(params.page)); if (params.pageSize) httpParams = httpParams.set('pageSize', String(params.pageSize)); return this.http.get>(`${this.baseApi}/users`, { params: httpParams }); } getById(id: string): Observable { return this.http.get(`${this.baseApi}/users/${id}`); } update(id: string, payload: UpdateUserPayload): Observable { return this.http.patch(`${this.baseApi}/users/${id}`, payload); } delete(id: string): Observable { return this.http.delete(`${this.baseApi}/users/${id}`); } }