All files / app/core/task task.details.service.ts

91.66% Statements 44/48
66.66% Branches 14/21
82.35% Functions 14/17
89.74% Lines 35/39

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105                  6x   6x 6x   6x 6x 6x 6x 6x   6x 6x 6x 6x   6x     1x         1x 1x       1x                               8x 6x 3x 3x       2x     2x 2x         1x 1x             2x 2x   1x 1x               1x       2x 2x         2x   2x    
import { HttpClient, HttpErrorResponse } from "@angular/common/http";
import { inject, Injectable, signal } from "@angular/core";
import { TaskDetailsValidationService } from "./task.details.validation";
import { environment } from "../../../environments/environment";
import { TaskCard } from "./task.interfaces";
import { catchError, map, Observable, throwError } from "rxjs";
import { TaskService } from "./task.service";
 
@Injectable({ providedIn: 'root' })
export class TaskDetailsService {
 
  readonly taskDetailsValidationService = inject(TaskDetailsValidationService)
  readonly taskService = inject(TaskService)
 
  private readonly isDetailsPanelOpenSignal = signal(false);
  private readonly isLoadingSignal = signal(false);
  private readonly isEditModeSignal = signal(false);
  private readonly isModalOpenSignal = signal(false);
  private readonly apiBase = environment.authApiBaseUrl;
 
  readonly isDetailsPanelOpen = this.isDetailsPanelOpenSignal.asReadonly();
  readonly isLoading = this.isLoadingSignal.asReadonly();
  readonly isEditMode = this.isEditModeSignal.asReadonly();
  readonly isModalOpen = this.isModalOpenSignal.asReadonly();
 
  constructor(private http: HttpClient) { }
 
  openDetailsPanel(task: TaskCard) {
    const restTask = {
      ...task,
      dueDate: this.toInputDate(task.dueDate),
      isSubtask: task.parentTaskId !== "" ? true : false
    }
    this.taskDetailsValidationService.setTaskDetailsModel(restTask)
    this.isDetailsPanelOpenSignal.set(true)
  }
 
  closeDetailsPanel() {
    this.isDetailsPanelOpenSignal.set(false)
  }
 
  setLoading(state: boolean) {
    this.isLoadingSignal.set(state)
  }
 
  setEditMode(state: boolean) {
    this.isEditModeSignal.set(state)
  }
 
  setModalOpen(state: boolean) {
    this.isModalOpenSignal.set(state)
  }
 
  getSubTasks(parentTaskId: string): TaskCard[] {
    const directSubtasks = this.taskService.getAllTask().filter(t => t.parentTaskId === parentTaskId);
    if (directSubtasks.length === 0) return [];
    const nestedSubtasks = directSubtasks.flatMap(t => this.getSubTasks(t.id));
    return [...directSubtasks, ...nestedSubtasks];
  }
 
  updateTask(task: TaskCard): Observable<string> {
    const task2 = { ...task,
      parentTaskId: task.isSubtask ? task.parentTaskId : "",
    };
    const { isSubtask, id, ...rest} = task2;
    return this.http.put<TaskCard>(this.apiBase + '/api/v1/task/' + task.id, rest, {
      withCredentials: true
    })
      .pipe(
        map((res) => {
          this.taskService.updateTaskInSignal(res.projectId,res);
          return "Tarea actualizada correctamente";
        }),
        catchError(this.handleError)
      );
  }
 
  deletedTask(projectId: string, taskId: string): Observable<string> {
    const setTask = this.getSubTasks(taskId).map(t => t.id).concat(taskId)
    return this.taskService.removeSetTasks(setTask).pipe(
      map((res) => {
        this.taskService.deleteTasksInSignal(projectId, setTask)
        return "Tareas eliminadas exitosamente";
      }),
      catchError(this.handleError)
    )
  }
 
  private toInputDate(value: string): string {
    // Si viene como ISO: "2024-03-15T00:00:00.000Z"
    return new Date(value).toISOString().split('T')[0];
  }
 
  private handleError(error: HttpErrorResponse) {
    let errorMessage = 'Error desconocido';
    Iif (error.error instanceof ErrorEvent) {
      // Error del lado del cliente
      errorMessage = `Error: ${error.error.message}`;
    } else {
      // Error del lado del servidor
      errorMessage = `Código: ${error.status} - Mensaje: ${error.message}`;
    }
    return throwError(() => new Error(errorMessage));
  }
}