import { inject, Injectable } from '@angular/core'; import { CommandResult, CreateSprintInput, Sprint, SprintBurndown, SprintsGateway, UpdateSprintInput, } from '@task-stream/web/tracker/domain'; import { map, Observable } from 'rxjs'; import { CloseSprintDocument, CreateSprintDocument, DeleteSprintDocument, SetIssueSprintDocument, SprintBurndownDocument, SprintsDocument, StartSprintDocument, UpdateSprintDocument, } from '../graphql/generated'; import { GraphqlOperations } from './graphql-operations'; import { toCommandResult } from './mappers'; @Injectable() export class GraphqlSprintsGateway extends SprintsGateway { private readonly gql = inject(GraphqlOperations); list(projectId: string): Observable { return this.gql .query(SprintsDocument, { projectId }) .pipe(map((d) => d.sprints as Sprint[])); } burndown(sprintId: string): Observable { return this.gql .query(SprintBurndownDocument, { id: sprintId }) .pipe(map((d) => d.sprint.burndown)); } create(input: CreateSprintInput): Observable { return this.gql .mutate(CreateSprintDocument, { input }) .pipe(map((d) => toCommandResult(d.createSprint))); } update(input: UpdateSprintInput): Observable { return this.gql .mutate(UpdateSprintDocument, { input }) .pipe(map((d) => toCommandResult(d.updateSprint))); } start(sprintId: string): Observable { return this.gql .mutate(StartSprintDocument, { sprintId }) .pipe(map((d) => toCommandResult(d.startSprint))); } close( sprintId: string, carryOverTo: string | null, ): Observable { return this.gql .mutate(CloseSprintDocument, { sprintId, carryOverToSprintId: carryOverTo, }) .pipe(map((d) => toCommandResult(d.closeSprint))); } remove(sprintId: string): Observable { return this.gql .mutate(DeleteSprintDocument, { sprintId }) .pipe(map((d) => toCommandResult(d.deleteSprint))); } setIssueSprint( issueId: string, sprintId: string | null, ): Observable { return this.gql .mutate(SetIssueSprintDocument, { issueId, sprintId }) .pipe(map((d) => toCommandResult(d.setIssueSprint))); } }