Merge branch 'comments/services'

This commit is contained in:
Nicolai Ort 2020-07-14 18:32:04 +02:00
commit da4c74b46a
2 changed files with 480 additions and 306 deletions

View File

@ -1,282 +1,435 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { HttpClient, HttpResponse } from '@angular/common/http'; import { HttpClient, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { environment } from '../../environments/environment'; import { environment } from '../../environments/environment';
@Injectable() /**
export class BackendService { * Provides access to the backend via HTTP.
constructor(private httpClient: HttpClient) {} */
@Injectable()
// Tasks export class BackendService {
public getTasks(): Observable<HttpResponse<ScrumTask[]>> { constructor(private httpClient: HttpClient) {}
const url = `${environment.apiUrl}/tasks`;
return this.httpClient.get<ScrumTask[]>(url, { observe: 'response' }); // Tasks
}
/**
public getTask(id: number): Observable<HttpResponse<ScrumTask>> { * Return all tasks.
const url = `${environment.apiUrl}/tasks/${id}`; */
return this.httpClient.get<ScrumTask>(url, { observe: 'response' }); public getTasks(): Observable<HttpResponse<ScrumTask[]>> {
} const url = `${environment.apiUrl}/tasks`;
return this.httpClient.get<ScrumTask[]>(url, { observe: 'response' });
public postTask(task: ScrumTask): Observable<HttpResponse<ScrumTask>> { }
const url = `${environment.apiUrl}/tasks`;
return this.httpClient.post<ScrumTask>(url, task, { observe: 'response' }); /**
} * Return the task with a specific id.
*/
public putTask(task: ScrumTask): Observable<HttpResponse<any>> { public getTask(id: number): Observable<HttpResponse<ScrumTask>> {
const url = `${environment.apiUrl}/tasks/${task.id}`; const url = `${environment.apiUrl}/tasks/${id}`;
return this.httpClient.put(url, task, { observe: 'response' }); return this.httpClient.get<ScrumTask>(url, { observe: 'response' });
} }
public deleteTask(task: ScrumTask): Observable<HttpResponse<any>> { /**
const url = `${environment.apiUrl}/tasks/${task.id}`; * Create a new task, if successful, the newly created task will be returned.
return this.httpClient.delete(url, { observe: 'response' }); */
} public postTask(task: ScrumTask): Observable<HttpResponse<ScrumTask>> {
const url = `${environment.apiUrl}/tasks`;
// Userstories return this.httpClient.post<ScrumTask>(url, task, { observe: 'response' });
public getUserstories(): Observable<HttpResponse<ScrumUserstory[]>> { }
const url = `${environment.apiUrl}/userstories`;
return this.httpClient.get<ScrumUserstory[]>(url, { observe: 'response' }); /**
} * Replace an existing task with a new one.
*/
public getUserstory(id: number): Observable<HttpResponse<ScrumUserstory>> { public putTask(task: ScrumTask): Observable<HttpResponse<any>> {
const url = `${environment.apiUrl}/userstories/${id}`; const url = `${environment.apiUrl}/tasks/${task.id}`;
return this.httpClient.get<ScrumUserstory>(url, { observe: 'response' }); return this.httpClient.put(url, task, { observe: 'response' });
} }
public postUserstory( /**
userstory: ScrumUserstory * Delete a task.
): Observable<HttpResponse<ScrumUserstory>> { */
const url = `${environment.apiUrl}/userstories`; public deleteTask(task: ScrumTask): Observable<HttpResponse<any>> {
return this.httpClient.post<ScrumUserstory>(url, userstory, { const url = `${environment.apiUrl}/tasks/${task.id}`;
observe: 'response', return this.httpClient.delete(url, { observe: 'response' });
}); }
}
// Userstories
public putUserstory(
userstory: ScrumUserstory /**
): Observable<HttpResponse<any>> { * Return all userstories.
const url = `${environment.apiUrl}/userstories/${userstory.id}`; */
return this.httpClient.put(url, userstory, { observe: 'response' }); public getUserstories(): Observable<HttpResponse<ScrumUserstory[]>> {
} const url = `${environment.apiUrl}/userstories`;
return this.httpClient.get<ScrumUserstory[]>(url, { observe: 'response' });
public deleteUserstory( }
userstory: ScrumUserstory
): Observable<HttpResponse<any>> { /**
const url = `${environment.apiUrl}/userstories/${userstory.id}`; * Return the userstory with a specific id.
return this.httpClient.delete(url, { observe: 'response' }); */
} public getUserstory(id: number): Observable<HttpResponse<ScrumUserstory>> {
const url = `${environment.apiUrl}/userstories/${id}`;
// Sprints return this.httpClient.get<ScrumUserstory>(url, { observe: 'response' });
public getSprints(): Observable<HttpResponse<ScrumSprint[]>> { }
const url = `${environment.apiUrl}/sprints`;
return this.httpClient.get<ScrumSprint[]>(url, { observe: 'response' }); /**
} * Create a new userstory, if successful, the newly created userstory will be returned.
*/
public getSprint(id: number): Observable<HttpResponse<ScrumSprint>> { public postUserstory(
const url = `${environment.apiUrl}/sprints/${id}`; userstory: ScrumUserstory
return this.httpClient.get<ScrumSprint>(url, { observe: 'response' }); ): Observable<HttpResponse<ScrumUserstory>> {
} const url = `${environment.apiUrl}/userstories`;
return this.httpClient.post<ScrumUserstory>(url, userstory, {
public postSprint( observe: 'response',
sprint: ScrumSprint });
): Observable<HttpResponse<ScrumSprint>> { }
const url = `${environment.apiUrl}/sprints`;
return this.httpClient.post<ScrumSprint>(url, sprint, { /**
observe: 'response', * Replace an existing userstory with a new one.
}); */
} public putUserstory(
userstory: ScrumUserstory
public putSprint(sprint: ScrumSprint): Observable<HttpResponse<any>> { ): Observable<HttpResponse<any>> {
const url = `${environment.apiUrl}/sprints/${sprint.id}`; const url = `${environment.apiUrl}/userstories/${userstory.id}`;
return this.httpClient.put(url, sprint, { observe: 'response' }); return this.httpClient.put(url, userstory, { observe: 'response' });
} }
public deleteSprint(sprint: ScrumSprint): Observable<HttpResponse<any>> { /**
const url = `${environment.apiUrl}/sprints/${sprint.id}`; * Delete a userstory.
return this.httpClient.delete(url, { observe: 'response' }); */
} public deleteUserstory(
userstory: ScrumUserstory
// Categories ): Observable<HttpResponse<any>> {
public getCategories(): Observable<HttpResponse<ScrumCategory[]>> { const url = `${environment.apiUrl}/userstories/${userstory.id}`;
const url = `${environment.apiUrl}/categories`; return this.httpClient.delete(url, { observe: 'response' });
return this.httpClient.get<ScrumCategory[]>(url, { observe: 'response' }); }
}
// Sprints
public getCategory(id: number): Observable<HttpResponse<ScrumCategory>> {
const url = `${environment.apiUrl}/categories/${id}`; /**
return this.httpClient.get<ScrumCategory>(url, { observe: 'response' }); * Return all sprints.
} */
public getSprints(): Observable<HttpResponse<ScrumSprint[]>> {
public postCategory( const url = `${environment.apiUrl}/sprints`;
category: ScrumCategory return this.httpClient.get<ScrumSprint[]>(url, { observe: 'response' });
): Observable<HttpResponse<ScrumCategory>> { }
const url = `${environment.apiUrl}/categories`;
return this.httpClient.post<ScrumCategory>(url, category, { /**
observe: 'response', * Return the sprint with a specific id.
}); */
} public getSprint(id: number): Observable<HttpResponse<ScrumSprint>> {
const url = `${environment.apiUrl}/sprints/${id}`;
public putCategory(category: ScrumCategory): Observable<HttpResponse<any>> { return this.httpClient.get<ScrumSprint>(url, { observe: 'response' });
const url = `${environment.apiUrl}/categories/${category.id}`; }
return this.httpClient.put(url, category, { observe: 'response' });
} /**
* Create a new sprint, if successful, the newly created sprint will be returned.
public deleteCategory( */
category: ScrumCategory public postSprint(
): Observable<HttpResponse<any>> { sprint: ScrumSprint
const url = `${environment.apiUrl}/categories/${category.id}`; ): Observable<HttpResponse<ScrumSprint>> {
return this.httpClient.delete(url, { observe: 'response' }); const url = `${environment.apiUrl}/sprints`;
} return this.httpClient.post<ScrumSprint>(url, sprint, {
observe: 'response',
// Status });
public getAllStatus(): Observable<HttpResponse<ScrumStatus[]>> { }
const url = `${environment.apiUrl}/status`;
return this.httpClient.get<ScrumStatus[]>(url, { observe: 'response' }); /**
} * Replace an existing sprint with a new one.
*/
public getStatus(id: number): Observable<HttpResponse<ScrumStatus>> { public putSprint(sprint: ScrumSprint): Observable<HttpResponse<any>> {
const url = `${environment.apiUrl}/status/${id}`; const url = `${environment.apiUrl}/sprints/${sprint.id}`;
return this.httpClient.get<ScrumStatus>(url, { observe: 'response' }); return this.httpClient.put(url, sprint, { observe: 'response' });
} }
public postStatus( /**
status: ScrumStatus * Delete a sprint.
): Observable<HttpResponse<ScrumStatus>> { */
const url = `${environment.apiUrl}/status`; public deleteSprint(sprint: ScrumSprint): Observable<HttpResponse<any>> {
return this.httpClient.post<ScrumStatus>(url, status, { const url = `${environment.apiUrl}/sprints/${sprint.id}`;
observe: 'response', return this.httpClient.delete(url, { observe: 'response' });
}); }
}
// Categories
public putStatus(status: ScrumStatus): Observable<HttpResponse<any>> {
const url = `${environment.apiUrl}/status/${status.id}`; /**
return this.httpClient.put(url, status, { observe: 'response' }); * Return all categories.
} */
public getCategories(): Observable<HttpResponse<ScrumCategory[]>> {
public deleteStatus(status: ScrumStatus): Observable<HttpResponse<any>> { const url = `${environment.apiUrl}/categories`;
const url = `${environment.apiUrl}/status/${status.id}`; return this.httpClient.get<ScrumCategory[]>(url, { observe: 'response' });
return this.httpClient.delete(url, { observe: 'response' }); }
}
/**
// Users * Return the category with a specific id.
public getUsers(): Observable<HttpResponse<ScrumUser[]>> { */
const url = `${environment.apiUrl}/users`; public getCategory(id: number): Observable<HttpResponse<ScrumCategory>> {
return this.httpClient.get<ScrumUser[]>(url, { observe: 'response' }); const url = `${environment.apiUrl}/categories/${id}`;
} return this.httpClient.get<ScrumCategory>(url, { observe: 'response' });
}
public getUser(id: number): Observable<HttpResponse<ScrumUser>> {
const url = `${environment.apiUrl}/users/${id}`; /**
return this.httpClient.get<ScrumUser>(url, { observe: 'response' }); * Create a new category, if successful, the newly created category will be returned.
} */
public postCategory(
public postUser(user: ScrumUser): Observable<HttpResponse<ScrumUser>> { category: ScrumCategory
const url = `${environment.apiUrl}/users`; ): Observable<HttpResponse<ScrumCategory>> {
return this.httpClient.post<ScrumUser>(url, user, { observe: 'response' }); const url = `${environment.apiUrl}/categories`;
} return this.httpClient.post<ScrumCategory>(url, category, {
observe: 'response',
public putUser(user: ScrumUser): Observable<HttpResponse<any>> { });
const url = `${environment.apiUrl}/users/${user.id}`; }
return this.httpClient.put(url, user, { observe: 'response' });
} /**
* Replace an existing category with a new one.
public deleteUser(user: ScrumUser): Observable<HttpResponse<any>> { */
const url = `${environment.apiUrl}/users/${user.id}`; public putCategory(category: ScrumCategory): Observable<HttpResponse<any>> {
return this.httpClient.delete(url, { observe: 'response' }); const url = `${environment.apiUrl}/categories/${category.id}`;
} return this.httpClient.put(url, category, { observe: 'response' });
}
// Projects
public getProjects(): Observable<HttpResponse<ScrumProject[]>> { /**
const url = `${environment.apiUrl}/projects`; * Delete a category.
return this.httpClient.get<ScrumProject[]>(url, { observe: 'response' }); */
} public deleteCategory(
category: ScrumCategory
public getProject(id: number): Observable<HttpResponse<ScrumProject>> { ): Observable<HttpResponse<any>> {
const url = `${environment.apiUrl}/projects/${id}`; const url = `${environment.apiUrl}/categories/${category.id}`;
return this.httpClient.get<ScrumProject>(url, { observe: 'response' }); return this.httpClient.delete(url, { observe: 'response' });
} }
public postProject( // Status
project: ScrumProject
): Observable<HttpResponse<ScrumProject>> { /**
const url = `${environment.apiUrl}/projects`; * Return all status.
return this.httpClient.post<ScrumProject>(url, project, { */
observe: 'response', public getAllStatus(): Observable<HttpResponse<ScrumStatus[]>> {
}); const url = `${environment.apiUrl}/status`;
} return this.httpClient.get<ScrumStatus[]>(url, { observe: 'response' });
}
public putProject(project: ScrumProject): Observable<HttpResponse<any>> {
const url = `${environment.apiUrl}/projects/${project.id}`; /**
return this.httpClient.put(url, project, { observe: 'response' }); * Return the status with a specific id.
} */
public getStatus(id: number): Observable<HttpResponse<ScrumStatus>> {
public deleteProject(project: ScrumProject): Observable<HttpResponse<any>> { const url = `${environment.apiUrl}/status/${id}`;
const url = `${environment.apiUrl}/projects/${project.id}`; return this.httpClient.get<ScrumStatus>(url, { observe: 'response' });
return this.httpClient.delete(url, { observe: 'response' }); }
}
} /**
* Create a new status, if successful, the newly created status will be returned.
export enum Priority { */
High = 'high', public postStatus(
Medium = 'medium', status: ScrumStatus
Low = 'low', ): Observable<HttpResponse<ScrumStatus>> {
} const url = `${environment.apiUrl}/status`;
return this.httpClient.post<ScrumStatus>(url, status, {
export interface ScrumTask { observe: 'response',
id?: number; });
title: string; }
content?: string;
statusid?: number; /**
categoryid?: number; * Replace an existing status with a new one.
assignedtoid?: number; */
sprintid?: number; public putStatus(status: ScrumStatus): Observable<HttpResponse<any>> {
projectid?: number; const url = `${environment.apiUrl}/status/${status.id}`;
userstoryid?: number; return this.httpClient.put(url, status, { observe: 'response' });
priority?: Priority; }
}
/**
export interface ScrumUserstory { * Delete a status.
id?: number; */
title: string; public deleteStatus(status: ScrumStatus): Observable<HttpResponse<any>> {
content?: string; const url = `${environment.apiUrl}/status/${status.id}`;
priority?: Priority; return this.httpClient.delete(url, { observe: 'response' });
statusid?: number; }
categoryid?: number;
sprintid?: number; // Users
createdbyid?: number;
projectid?: number; /**
} * Return all users.
*/
export interface ScrumSprint { public getUsers(): Observable<HttpResponse<ScrumUser[]>> {
id?: number; const url = `${environment.apiUrl}/users`;
title: string; return this.httpClient.get<ScrumUser[]>(url, { observe: 'response' });
description?: string; }
startDate: string;
endDate: string; /**
projectid?: number; * Return the user with a specific id.
} */
public getUser(id: number): Observable<HttpResponse<ScrumUser>> {
export interface ScrumCategory { const url = `${environment.apiUrl}/users/${id}`;
id?: number; return this.httpClient.get<ScrumUser>(url, { observe: 'response' });
title: string; }
description?: string;
color?: string; /**
project?: number; * Create a new user, if successful, the newly created user will be returned.
} */
public postUser(user: ScrumUser): Observable<HttpResponse<ScrumUser>> {
export interface ScrumStatus { const url = `${environment.apiUrl}/users`;
id?: number; return this.httpClient.post<ScrumUser>(url, user, { observe: 'response' });
title: string; }
description: string;
} /**
* Replace an existing user with a new one.
export interface ScrumUser { */
id?: number; public putUser(user: ScrumUser): Observable<HttpResponse<any>> {
name: string; const url = `${environment.apiUrl}/users/${user.id}`;
} return this.httpClient.put(url, user, { observe: 'response' });
}
export interface ScrumProject {
id?: number; /**
title: string; * Delete a user.
isprivate: boolean; */
} public deleteUser(user: ScrumUser): Observable<HttpResponse<any>> {
const url = `${environment.apiUrl}/users/${user.id}`;
return this.httpClient.delete(url, { observe: 'response' });
}
// Projects
/**
* Return all projects.
*/
public getProjects(): Observable<HttpResponse<ScrumProject[]>> {
const url = `${environment.apiUrl}/projects`;
return this.httpClient.get<ScrumProject[]>(url, { observe: 'response' });
}
/**
* Return the project with a specific id.
*/
public getProject(id: number): Observable<HttpResponse<ScrumProject>> {
const url = `${environment.apiUrl}/projects/${id}`;
return this.httpClient.get<ScrumProject>(url, { observe: 'response' });
}
/**
* Create a new project, if successful, the newly created project will be returned.
*/
public postProject(
project: ScrumProject
): Observable<HttpResponse<ScrumProject>> {
const url = `${environment.apiUrl}/projects`;
return this.httpClient.post<ScrumProject>(url, project, {
observe: 'response',
});
}
/**
* Replace an existing project with a new one.
*/
public putProject(project: ScrumProject): Observable<HttpResponse<any>> {
const url = `${environment.apiUrl}/projects/${project.id}`;
return this.httpClient.put(url, project, { observe: 'response' });
}
/**
* Delete a project.
*/
public deleteProject(project: ScrumProject): Observable<HttpResponse<any>> {
const url = `${environment.apiUrl}/projects/${project.id}`;
return this.httpClient.delete(url, { observe: 'response' });
}
}
/**
* @summary Represents the priority of a task or userstory.
*/
export enum Priority {
High = 'high',
Medium = 'medium',
Low = 'low',
}
/**
* @summary Represents a task in an agile work process.
* @description A task is a small piece of work, associated with a larger userstory.
*/
export interface ScrumTask {
id?: number;
title: string;
content?: string;
statusid?: number;
categoryid?: number;
assignedtoid?: number;
sprintid?: number;
projectid?: number;
userstoryid?: number;
priority?: Priority;
}
/**
* @summary Represents a userstory in an agile work process.
* @description A userstory is a piece of work that can be done in one sprint.
* It can be further divided into multiple tasks.
*/
export interface ScrumUserstory {
id?: number;
title: string;
content?: string;
priority?: Priority;
statusid?: number;
categoryid?: number;
sprintid?: number;
createdbyid?: number;
projectid?: number;
}
/**
* @summary Represents an agile sprint.
* @description A sprint is typically one to four weeks long.
* Userstories are started and completed during one sprint.
* </remarks>
*/
export interface ScrumSprint{
id?: number;
title: string;
description?: string;
startDate: string;
endDate: string;
projectid?: number;
}
/**
* @summary Represents a category of userstories.
* @description Every userstory can optionally be associated with a single category.
* This can be helpful to organize work in larger teams.
*/
export interface ScrumCategory {
id?: number;
title: string;
description?: string;
color?: string;
project?: number;
}
/**
* @summary Represents the status of a task or userstory.
* @description Classic status are "Backlog", "In Progress" and "Done", but
* teams can create others to fit their individual workflow.
*/
export interface ScrumStatus {
id?: number;
title: string;
description: string;
}
/**
* @summary Represents a team member that can work on userstories.
* @description This allows teams to track who is working on a userstory
* at a given time.
*/
export interface ScrumUser {
id?: number;
name: string;
}
/**
* @summary Represents a project that the team works on.
* @description Userstories and sprints can be categorized into projects,
* to help organization for larger teams.
*/
export interface ScrumProject {
id?: number;
title: string;
isprivate: boolean;
}

View File

@ -1,24 +1,45 @@
import { Priority } from './backend.service'; import {Priority} from './backend.service';
export function sortByNumberAscending<T>(items: T[], key: (T) => number) { /**
return items.sort((a, b) => key(a) - key(b)); * Sort an array in place by a number associated with that item.
} * @param items The items to sort.
* @param key Returns the number associated with an item.
export function sortByStringAscending<T>(items: T[], key: (T) => string) { */
return items.sort((a, b) => key(a).localeCompare(key(b))); export function sortByNumberAscending<T>(items: T[], key: (T) => number) {
} return items.sort((a, b) => key(a) - key(b));
}
export function sortByDateAscending<T>(items: T[], key: (T) => Date) {
return items.sort((a, b) => (key(a) as any) - (key(b) as any)); /**
} * Sort an array in place by a string associated with that item.
* Strings will be sorted in alphabetic order.
export function getNumberForPriority(priority: Priority): number { * @param items The items to sort.
switch (priority) { * @param key Returns the string associated with an item.
case Priority.High: */
return 2; export function sortByStringAscending<T>(items: T[], key: (T) => string) {
case Priority.Medium: return items.sort((a, b) => key(a).localeCompare(key(b)));
return 1; }
case Priority.Low:
return 0; /**
} * Sort an array in place by a date associated with that item.
} * Dates will be sorted from old to new.
* @param items The items to sort.
* @param key Returns the date associated with an item.
*/
export function sortByDateAscending<T>(items: T[], key: (T) => Date) {
return items.sort((a, b) => (key(b) as any) - (key(a) as any));
}
/**
* Converts a priority enum member to a number.
* @returns high -> 2, medium -> 1, low -> 0
*/
export function getNumberForPriority(priority: Priority): number {
switch (priority) {
case Priority.High:
return 2;
case Priority.Medium:
return 1;
case Priority.Low:
return 0;
}
}