From 27d2714161d03f05a981f53786fa8c3da27d4898 Mon Sep 17 00:00:00 2001 From: Daniel Ramos Date: Mon, 1 Apr 2024 11:47:50 +0200 Subject: [PATCH] fix: get projects (#24) * fix: improve error handling * fix: get project list * chore: bump to 1.0.5 --- package.json | 2 +- src/infrastructure/cli/main.ts | 15 +++++++++++++++ .../factorial-client/FactorialClient.ts | 16 ++++++++++++---- .../factorial-client/schema/gql/ProjectWorker.ts | 2 +- .../http-client/HttpClientFetch.ts | 2 +- .../repositories/ProjectRepositoryFactorial.ts | 3 ++- test/fixtures/projects.json | 10 ++++++---- 7 files changed, 38 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index cff1746..ea45316 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "factorial-cli", - "version": "1.0.4", + "version": "1.0.5", "type": "module", "description": "Fill your factorial shifts with ease", "main": "dist/src/infrastructure/cli/main.js", diff --git a/src/infrastructure/cli/main.ts b/src/infrastructure/cli/main.ts index c2b9499..a749bbe 100644 --- a/src/infrastructure/cli/main.ts +++ b/src/infrastructure/cli/main.ts @@ -8,6 +8,7 @@ import { createApp } from "./createApp.js"; import { DayRange } from "../../domain/models/DayRange.js"; import { MomentOfTheDay } from "../../domain/models/MomentOfTheDay.js"; import { Minute } from "../../domain/models/Minute.js"; +import { HttpClientError } from "../http-client/HttpClientFetch.js"; const now = new Date(); @@ -89,4 +90,18 @@ yargs(hideBin(process.argv)) }, ) .demandCommand(1) + .fail((msg, err) => { + if (err) { + if (err instanceof HttpClientError) { + const data = err.response.data; + console.error(JSON.stringify(data, null, 2)); + process.exit(1); + } + + throw err; + } + console.error(msg); + console.error(err); + process.exit(1); + }) .parse(); diff --git a/src/infrastructure/factorial-client/FactorialClient.ts b/src/infrastructure/factorial-client/FactorialClient.ts index 211a627..ad18845 100644 --- a/src/infrastructure/factorial-client/FactorialClient.ts +++ b/src/infrastructure/factorial-client/FactorialClient.ts @@ -86,19 +86,26 @@ export class FactorialClient { } async getProjects(employeeId: number) { - const query = `query GetProjectsAssignedToProjectWorkers($employeeIds: [Int!]!, $onlyActiveProjects: Boolean!, $assigned: Boolean!) { + const query = `query GetProjectsAssignedToProjectWorkers($assigned: Boolean!, $employeeIds: [Int!]!, $includeSubprojects: Boolean = false, $onlyActiveProjects: Boolean!) { projectManagement { projectWorkers( + assigned: $assigned employeeIds: $employeeIds projectActive: $onlyActiveProjects - assigned: $assigned ) { id assigned - project { + employee { + id + } + imputableProject { id name status + subprojects @include(if: $includeSubprojects) { + id + name + } } } } @@ -107,9 +114,10 @@ export class FactorialClient { const response = await this.client.post("/graphql", { operationName: "GetProjectsAssignedToProjectWorkersQuery", variables: { + assigned: true, employeeIds: [employeeId], + includeSubprojects: true, onlyActiveProjects: true, - assigned: true, }, query, }); diff --git a/src/infrastructure/factorial-client/schema/gql/ProjectWorker.ts b/src/infrastructure/factorial-client/schema/gql/ProjectWorker.ts index 9c76fa7..72306cc 100644 --- a/src/infrastructure/factorial-client/schema/gql/ProjectWorker.ts +++ b/src/infrastructure/factorial-client/schema/gql/ProjectWorker.ts @@ -4,5 +4,5 @@ import { Project } from "./Project.js"; export const ProjectWorker = z.object({ id: z.number(), assigned: z.boolean(), - project: Project, + imputableProject: Project, }); diff --git a/src/infrastructure/http-client/HttpClientFetch.ts b/src/infrastructure/http-client/HttpClientFetch.ts index 69711c1..752025b 100644 --- a/src/infrastructure/http-client/HttpClientFetch.ts +++ b/src/infrastructure/http-client/HttpClientFetch.ts @@ -10,7 +10,7 @@ type PrivateHttpClientOptions = { headers: Record; }; -class HttpClientError extends Error { +export class HttpClientError extends Error { constructor(public response: HttpResponse) { super(`Request failed with status code ${response.status}`); } diff --git a/src/infrastructure/repositories/ProjectRepositoryFactorial.ts b/src/infrastructure/repositories/ProjectRepositoryFactorial.ts index 9d66c68..6da6555 100644 --- a/src/infrastructure/repositories/ProjectRepositoryFactorial.ts +++ b/src/infrastructure/repositories/ProjectRepositoryFactorial.ts @@ -13,7 +13,8 @@ export class ProjectRepositoryFactorial implements ProjectRepository { ); return projects.map( - (project) => new Project(new ProjectId(project.id), project.project.name), + (project) => + new Project(new ProjectId(project.id), project.imputableProject.name), ); } } diff --git a/test/fixtures/projects.json b/test/fixtures/projects.json index a963d67..505f64b 100644 --- a/test/fixtures/projects.json +++ b/test/fixtures/projects.json @@ -5,19 +5,21 @@ { "id": 193161, "assigned": true, - "project": { + "imputableProject": { "id": 60154, "name": "Apple", - "status": "active" + "status": "active", + "subprojects": [] } }, { "id": 691157, "assigned": true, - "project": { + "imputableProject": { "id": 11566, "name": "Microsoft", - "status": "active" + "status": "active", + "subprojects": [] } } ]