import { Injectable, signal } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable } from 'rxjs'; import { apiConfig } from '../environments/config'; import { Task } from '../interfaces/task.interface'; import { User } from '../interfaces/user.interface'; import { TokenService } from './token.service'; @Injectable({ providedIn: 'root', }) export class ApiService { private readonly apiUrl = apiConfig.apiUrl; constructor(private http: HttpClient, private tokenService: TokenService) {} request( method: string, endpoint: string, body?: B | null, params?: Record ): Observable { return this.http.request(method, `${this.apiUrl}${endpoint}`, { body, params, headers: this.getHeaders(), }); } private getHeaders(): HttpHeaders { const token = this.tokenService.getAuthToken(); return token ? new HttpHeaders().set('Authorization', `Token ${token}`) : new HttpHeaders(); } // ------------- TASKS ------------- // getTasks(): Observable { return this.request('GET', `/api/tasks/`); } getTaskById(taskId: string): Observable { return this.request('GET', `/api/tasks/${taskId}/`); } updateTaskStatus(taskId: string, status: string): Observable { return this.request('PATCH', `/api/tasks/${taskId}/update_status/`, { status, }); } updateSubtaskStatus( taskId: string, body: { subtask_id: string; subtask_title: string; subtask_status: boolean; } ): Observable { return this.request( 'PATCH', `/api/tasks/${taskId}/update_subtask/`, body ); } saveNewTask(task: Task): Observable { return this.request('POST', '/api/tasks/', task); } deleteTaskById(taskId: string): Observable { return this.request('DELETE', `/api/tasks/${taskId}/`); } // ------------- USERS ------------- // getUsers(): Observable { return this.request('GET', `/api/users/`); } getUserById(userId: string): Observable { return this.request('GET', `/api/users/${userId}/`); } getUsersByIds(userIds: string[]): Observable { return this.request('GET', '/api/users/', undefined, { ids: userIds.join(','), }); } deleteUserById(userId: string): Observable { return this.request('DELETE', `/api/users/${userId}/`); } saveNewUser(user: User): Observable { return this.request('POST', '/api/users/', user); } updateUser(user: User, userId: string): Observable { return this.request('PATCH', `/api/users/${userId}/`, user); } }