From 85f4483845b891f871302bc329d3eb135c565d3a Mon Sep 17 00:00:00 2001 From: Pavel Gnedov Date: Thu, 2 Feb 2023 11:52:30 +0700 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B4=D0=B0=D1=88=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event-emitter/src/event-emitter.module.ts | 3 + .../project-dashboard.service.ts | 152 ++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 libs/event-emitter/src/project-dashboard/project-dashboard.service.ts diff --git a/libs/event-emitter/src/event-emitter.module.ts b/libs/event-emitter/src/event-emitter.module.ts index 7b212d1..d99c5c0 100644 --- a/libs/event-emitter/src/event-emitter.module.ts +++ b/libs/event-emitter/src/event-emitter.module.ts @@ -18,6 +18,7 @@ import { IssuesService } from './issues/issues.service'; import { IssuesController } from './issues/issues.controller'; import { TimestampEnhancer } from './issue-enhancers/timestamps-enhancer'; import { EnhancerService } from './issue-enhancers/enhancer.service'; +import { ProjectDashboardService } from './project-dashboard/project-dashboard.service'; import { RootIssueSubTreesWidgetService } from './project-dashboard/widgets/root-issue-subtrees.widget.service'; @Module({}) @@ -41,6 +42,7 @@ export class EventEmitterModule implements OnModuleInit { IssuesService, TimestampEnhancer, EnhancerService, + ProjectDashboardService, RootIssueSubTreesWidgetService, ], exports: [ @@ -56,6 +58,7 @@ export class EventEmitterModule implements OnModuleInit { IssuesService, TimestampEnhancer, EnhancerService, + ProjectDashboardService, RootIssueSubTreesWidgetService, ], controllers: [MainController, UsersController, IssuesController], diff --git a/libs/event-emitter/src/project-dashboard/project-dashboard.service.ts b/libs/event-emitter/src/project-dashboard/project-dashboard.service.ts new file mode 100644 index 0000000..78446ff --- /dev/null +++ b/libs/event-emitter/src/project-dashboard/project-dashboard.service.ts @@ -0,0 +1,152 @@ +/* eslint-disable @typescript-eslint/no-namespace */ +import { Injectable } from '@nestjs/common'; +import { RedmineTypes } from '../models/redmine-types'; + +export namespace ProjectDashboard { + export namespace Models { + export type Params = { + projectName: string; + workers: Worker[]; + filter: FilterDefination[]; + statuses: Status[]; + }; + + export type Worker = { + id?: number; + firstname?: string; + lastname?: string; + name?: string; + }; + + export enum FilterTypes { + TREE = 'TREE', + LIST = 'LIST', + DYNAMIC_LIST = 'DYNAMIC_LIST', + VERSION = 'VERSION', + } + + export namespace FilterParams { + export type Tree = { + rootIssueId: number; + subtrees: SubTree[]; + showOthers: boolean; + }; + export type SubTree = { + title: string; + issueId: number; + }; + export type List = { + issueIds: number[]; + }; + export type Version = { + version: string; + }; + export type DynamicList = { + selector: Record; + }; + export type AnyFilterParams = Tree | List | DynamicList | Version; + } + + export type FilterParams = Record; + + export namespace FilterResults { + export type Tree = List; + export type List = { status: string; issues: RedmineTypes.Issue[] }[]; + export type DynamicList = List; + export type Version = List; + export type AnyFilterResults = List | Tree | DynamicList | Version; + } + + export type FilterResult = Record[]; + + export type AnalyticFunction = { + functionName: string; + }; + + export type FilterDefination = { + type: FilterTypes; + title: string; + params: FilterParams.AnyFilterParams; + }; + + export type FilterWithResults = { + params: FilterDefination; + results: FilterResults.AnyFilterResults; + }; + + export type Status = { + name: string; + closed: boolean; + }; + } + + export function CheckWorker(worker: Models.Worker): boolean { + return Boolean( + (typeof worker.id === 'number' && worker.id >= 0) || + (worker.firstname && worker.lastname) || + worker.name, + ); + } + + export class SingleProject { + // TODO: code for SingleProject + constructor(private params: Models.Params) { + return; + } + } + + export namespace Widgets { + // Чё будет делать виджет? + // * рендер - из параметров будет создавать данные с какими-либо расчётами + + export interface Widget { + render( + filterParams: Models.FilterParams, + dashboardParams: Models.Params, + ): Models.FilterResult; + } + + export class List implements Widget { + render( + filterParams: Models.FilterParams, + dashboardParams: Models.Params, + ): Models.FilterResult { + throw new Error('Method not implemented.'); + } + } + + export class DynamicList implements Widget { + render( + filterParams: Models.FilterParams, + dashboardParams: Models.Params, + ): Models.FilterResult { + throw new Error('Method not implemented.'); + } + } + + export class Tree implements Widget { + render( + filterParams: Models.FilterParams, + dashboardParams: Models.Params, + ): Models.FilterResult { + throw new Error('Method not implemented.'); + } + } + + export class Version implements Widget { + render( + filterParams: Models.FilterParams, + dashboardParams: Models.Params, + ): Models.FilterResult { + throw new Error('Method not implemented.'); + } + } + } +} + +@Injectable() +export class ProjectDashboardService { + constructor() { + return; + } +}