Исправлены ошибки сборки проекта

This commit is contained in:
Pavel Gnedov 2022-07-18 19:42:16 +07:00
parent eb16e92a6c
commit 60b0bdbcd4
14 changed files with 148 additions and 29 deletions

View file

@ -1,4 +1,4 @@
import { RedmineTypes } from '@app/redmine-types/index'; import { RedmineTypes } from '../models/redmine-types';
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import configuration from '../configs/main-config'; import configuration from '../configs/main-config';
import nano = require('nano'); import nano = require('nano');

View file

@ -1,4 +1,4 @@
import { RedmineTypes } from '@app/redmine-types/index'; import { RedmineTypes } from '../models/redmine-types';
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import nano from 'nano'; import nano from 'nano';
import { CouchDb } from './couchdb'; import { CouchDb } from './couchdb';

View file

@ -12,8 +12,10 @@ import { RedmineIssuesCacheWriterService } from './issue-cache-writer/redmine-is
import { CouchDb } from './couchdb-datasources/couchdb'; import { CouchDb } from './couchdb-datasources/couchdb';
import { Users } from './couchdb-datasources/users'; import { Users } from './couchdb-datasources/users';
import { Issues } from './couchdb-datasources/issues'; import { Issues } from './couchdb-datasources/issues';
import { RedmineTypes } from '@app/redmine-types/index';
import { RedmineUserCacheWriterService } from './user-cache-writer/user-cache-writer.service'; import { RedmineUserCacheWriterService } from './user-cache-writer/user-cache-writer.service';
import { UsersController } from './users/users.controller';
import { RedmineTypes } from './models/redmine-types';
import { UsersService } from './users/users.service';
@Module({}) @Module({})
export class EventEmitterModule implements OnModuleInit { export class EventEmitterModule implements OnModuleInit {
@ -35,6 +37,7 @@ export class EventEmitterModule implements OnModuleInit {
Users, Users,
Issues, Issues,
RedmineUserCacheWriterService, RedmineUserCacheWriterService,
UsersService,
], ],
exports: [ exports: [
EventEmitterService, EventEmitterService,
@ -45,8 +48,9 @@ export class EventEmitterModule implements OnModuleInit {
Users, Users,
Issues, Issues,
RedmineUserCacheWriterService, RedmineUserCacheWriterService,
UsersService,
], ],
controllers: [MainController], controllers: [MainController, UsersController],
}; };
} }

View file

@ -1,4 +1,4 @@
import { RedmineTypes } from '@app/redmine-types/index'; import { RedmineTypes } from '../models/redmine-types';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { Issues } from '../couchdb-datasources/issues'; import { Issues } from '../couchdb-datasources/issues';
import { RedmineEventsGateway } from '../events/redmine-events.gateway'; import { RedmineEventsGateway } from '../events/redmine-events.gateway';

View file

@ -0,0 +1,99 @@
/// <reference types="typescript" />
// eslint-disable-next-line @typescript-eslint/prefer-namespace-keyword
export module RedmineTypes {
export type IdAndName = {
id: number;
name: string;
};
export type CustomField = {
id: number;
name: string;
value: string;
};
export type JournalDetail = {
property: string;
name: string;
old_value?: string;
new_value?: string;
};
export type Journal = {
id: number;
user: IdAndName;
notes?: string;
created_on: string;
details?: JournalDetail[];
};
export type Issue = {
id: number;
project: IdAndName;
tracker: IdAndName;
status: IdAndName;
priority: IdAndName;
author: IdAndName;
category: IdAndName;
fixed_version: IdAndName;
subject: string;
description: string;
start_date: string;
done_ratio: number;
spent_hours: number;
total_spent_hours: number;
custom_fields: CustomField[];
created_on: string;
updated_on?: string;
closed_on?: string;
relations?: Record<string, any>[];
journals?: Journal[];
};
// eslint-disable-next-line @typescript-eslint/prefer-namespace-keyword
export module Unknown {
export const num = -1;
export const str = '';
export const idAndName: IdAndName = {
id: -1,
name: str,
};
export const unknownName = 'Unknown';
export const subject = 'Unknown';
export const date = '1970-01-01T00:00:00Z';
export const issue: Issue = {
id: num,
project: idAndName,
tracker: idAndName,
status: idAndName,
priority: idAndName,
author: idAndName,
category: idAndName,
fixed_version: idAndName,
subject: subject,
description: str,
start_date: date,
done_ratio: num,
spent_hours: num,
total_spent_hours: num,
custom_fields: [],
created_on: date,
};
export const user: User = {
id: num,
firstname: unknownName,
lastname: unknownName,
mail: str,
};
}
export type User = {
id: number;
login: string;
firstname: string;
lastname: string;
mail: string;
};
}

View file

@ -0,0 +1,12 @@
{
"name": "redmine-types",
"version": "0.1.0",
"description": "",
"main": "index.js",
"types": "index.d.ts",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Pavel Gnedov",
"license": "MIT"
}

View file

@ -1,7 +1,7 @@
import axios from 'axios'; import axios from 'axios';
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { RedmineTypes } from '@app/redmine-types/index'; import { RedmineTypes } from '../models/redmine-types';
@Injectable() @Injectable()
export class RedmineDataLoader { export class RedmineDataLoader {

View file

@ -10,5 +10,5 @@ export type RssListenerParams = {
export const RssListenerDefaultParams: RssListenerParams = { export const RssListenerDefaultParams: RssListenerParams = {
subscriptions: [], subscriptions: [],
updateInterval: 300000 // 5min updateInterval: 300000, // 5min
} };

View file

@ -1,8 +1,12 @@
import { Injectable } from "@nestjs/common"; import { Injectable } from '@nestjs/common';
import { RssListenerDefaultParams, RssListenerParams, RssListenerSubscriptionParams } from "./rsslistener-params"; import {
import { BehaviorSubject } from "rxjs"; RssListenerDefaultParams,
import { CreateSubjectsParserByRegExp } from "../subjects-parser/subjects-parser"; RssListenerParams,
import { EventsListener } from "../events/events-listener"; RssListenerSubscriptionParams,
} from './rsslistener-params';
import { BehaviorSubject } from 'rxjs';
import { CreateSubjectsParserByRegExp } from '../subjects-parser/subjects-parser';
import { EventsListener } from '../events/events-listener';
// eslint-disable-next-line @typescript-eslint/no-var-requires // eslint-disable-next-line @typescript-eslint/no-var-requires
const Parser = require('rss-parser'); const Parser = require('rss-parser');
@ -10,14 +14,14 @@ const parser = new Parser();
@Injectable() @Injectable()
export class RssListener implements EventsListener { export class RssListener implements EventsListener {
issues = new BehaviorSubject<number[]>([]);
issues = new BehaviorSubject<number[]>([])
private updateTimeout; private updateTimeout;
private lastTimeUpdate: Date | null = null; private lastTimeUpdate: Date | null = null;
constructor(private config: RssListenerParams = RssListenerDefaultParams) { constructor(private config: RssListenerParams = RssListenerDefaultParams) {
this.lastTimeUpdate = new Date();
} }
start(): void { start(): void {
@ -38,23 +42,27 @@ export class RssListener implements EventsListener {
} }
private async getIssues(): Promise<number[]> { private async getIssues(): Promise<number[]> {
const promises = this.config.subscriptions.map(sub => this.createSubscriptionPromise(sub)); const promises = this.config.subscriptions.map((sub) =>
this.createSubscriptionPromise(sub),
);
const issues = await Promise.all(promises); const issues = await Promise.all(promises);
this.lastTimeUpdate = new Date(); this.lastTimeUpdate = new Date();
return this.getFlatIssueNumbers(issues); return this.getFlatIssueNumbers(issues);
} }
private async createSubscriptionPromise(subscription: RssListenerSubscriptionParams): Promise<number[]> { private async createSubscriptionPromise(
subscription: RssListenerSubscriptionParams,
): Promise<number[]> {
const url = subscription.url; const url = subscription.url;
const regexp = new RegExp(subscription.issueNumberParser); const regexp = new RegExp(subscription.issueNumberParser);
const subjectParser = CreateSubjectsParserByRegExp(regexp); const subjectParser = CreateSubjectsParserByRegExp(regexp);
const feed = await parser.parseURL(url); const feed = await parser.parseURL(url);
const issueNumbers: number[] = feed.items const issueNumbers: number[] = feed.items
.filter(item => { .filter((item) => {
const itemDate = new Date(item.pubDate); const itemDate = new Date(item.pubDate);
return itemDate >= this.lastTimeUpdate; return itemDate >= this.lastTimeUpdate;
}) })
.map(item => { .map((item) => {
const issueNumber = subjectParser.getIssueNumber(item.title); const issueNumber = subjectParser.getIssueNumber(item.title);
return issueNumber; return issueNumber;
}); });
@ -63,8 +71,8 @@ export class RssListener implements EventsListener {
private getFlatIssueNumbers(issues: number[][]): number[] { private getFlatIssueNumbers(issues: number[][]): number[] {
const res: number[] = []; const res: number[] = [];
issues.forEach(issueNumbers => { issues.forEach((issueNumbers) => {
issueNumbers.forEach(num => { issueNumbers.forEach((num) => {
if (res.indexOf(num) < 0) { if (res.indexOf(num) < 0) {
res.push(num); res.push(num);
} }
@ -72,5 +80,4 @@ export class RssListener implements EventsListener {
}); });
return res; return res;
} }
}
}

View file

@ -1,4 +1,4 @@
import { RedmineTypes } from '@app/redmine-types/index'; import { RedmineTypes } from '../models/redmine-types';
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { Users } from '../couchdb-datasources/users'; import { Users } from '../couchdb-datasources/users';
import nano from 'nano'; import nano from 'nano';

View file

@ -1,4 +1,4 @@
import { RedmineTypes } from '@app/redmine-types/index'; import { RedmineTypes } from '../models/redmine-types';
import { Controller, Get, Param } from '@nestjs/common'; import { Controller, Get, Param } from '@nestjs/common';
import { UsersService } from './users.service'; import { UsersService } from './users.service';

View file

@ -1,5 +1,5 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { RedmineTypes } from '@app/redmine-types/index'; import { RedmineTypes } from '../models/redmine-types';
import { Timestamped } from '../models/timestamped'; import { Timestamped } from '../models/timestamped';
import { Users } from '../couchdb-datasources/users'; import { Users } from '../couchdb-datasources/users';
import { RedmineDataLoader } from '../redmine-data-loader/redmine-data-loader'; import { RedmineDataLoader } from '../redmine-data-loader/redmine-data-loader';

View file

@ -23,9 +23,6 @@
], ],
"@app/event-emitter/*": [ "@app/event-emitter/*": [
"libs/event-emitter/src/*" "libs/event-emitter/src/*"
],
"@app/redmine-types/*": [
"libs/redmine-types/*"
] ]
} }
} }