From 4d693156d3671c7090bed8b112f11b2a12215e46 Mon Sep 17 00:00:00 2001 From: Gnedov Pavel Date: Wed, 23 Aug 2023 04:02:29 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D1=81=D0=B5=D1=80=20=D0=BA=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=D0=B0=D1=80=D0=BD=D1=8B=D1=85=20=D1=81=D0=BE=D0=B1=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/issue-enhancers/calendar-enhancer.ts | 25 ++++++++++++++----- .../src/utils/string-with-dates-parser.ts | 21 +++++++++++++--- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/libs/event-emitter/src/issue-enhancers/calendar-enhancer.ts b/libs/event-emitter/src/issue-enhancers/calendar-enhancer.ts index 5bc8c55..bbda56b 100644 --- a/libs/event-emitter/src/issue-enhancers/calendar-enhancer.ts +++ b/libs/event-emitter/src/issue-enhancers/calendar-enhancer.ts @@ -1,6 +1,6 @@ import { IssueEnhancerInterface } from '@app/event-emitter/issue-enhancers/issue-enhancer-interface'; import { RedmineTypes } from '@app/event-emitter/models/redmine-types'; -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import * as Luxon from 'luxon'; import { CalendarEvent } from '../models/calendar-event'; import * as DatesParser from '../utils/string-with-dates-parser'; @@ -23,6 +23,8 @@ export const UNKNOWN_CALENDAR_EVENT = 'Unknown calendar event'; @Injectable() export class CalendarEnhancer implements IssueEnhancerInterface { + private logger = new Logger(CalendarEnhancer.name); + name = 'calendar'; constructor( @@ -30,16 +32,27 @@ export class CalendarEnhancer implements IssueEnhancerInterface { public customFields: CustomFieldParserParams[], public descriptionCalendarParams: DescriptionParserParams, public calendarEventsKey: string, - ) {} + ) { + const initParams = {useForProjects, customFields, descriptionCalendarParams, calendarEventsKey}; + this.logger.debug(`Calendar enhancer init with ${JSON.stringify(initParams)}`); + } async enhance( issue: RedmineTypes.ExtendedIssue, ): Promise { const res: RedmineTypes.ExtendedIssue = { ...issue }; - if (!this.checkProject(issue)) return res; + if (!this.checkProject(res)) { + return res; + } - issue[this.calendarEventsKey] = this.getCalendarEvents(issue); + try { + res[this.calendarEventsKey] = this.getCalendarEvents(res); + } catch (ex) { + this.logger.error(`Error at parsing calendar events, message - ${ex}`); + return res; + } + this.logger.debug(`Calendar events for #${issue.id}: issue.${this.calendarEventsKey} = ${JSON.stringify(res[this.calendarEventsKey])}`); return res; } @@ -108,9 +121,9 @@ export class CalendarEnhancer implements IssueEnhancerInterface { return { from: from.toISO(), - fromTimestamp: from.toSeconds(), + fromTimestamp: from.toMillis(), to: to.toISO(), - toTimestamp: to.toSeconds(), + toTimestamp: to.toMillis(), fullDay: Boolean(params.fullDay), description: params.alias || cf.name || UNKNOWN_CALENDAR_EVENT, }; diff --git a/libs/event-emitter/src/utils/string-with-dates-parser.ts b/libs/event-emitter/src/utils/string-with-dates-parser.ts index cbfe4c8..55b4b46 100644 --- a/libs/event-emitter/src/utils/string-with-dates-parser.ts +++ b/libs/event-emitter/src/utils/string-with-dates-parser.ts @@ -1,6 +1,7 @@ -import Moo from 'moo'; +import * as Moo from 'moo'; import { CalendarEvent } from '../models/calendar-event'; -import Luxon from 'luxon'; +import * as Luxon from 'luxon'; +import { Logger } from '@nestjs/common'; export const DEFAULT_PARAMS: Moo.Rules = { WS: /[ \t]+/, @@ -13,12 +14,14 @@ export const DEFAULT_PARAMS: Moo.Rules = { NL: { match: /\n/, lineBreaks: true }, }; -export const DEFAULT_DATE_FORMATS = ['dd.MM.yy', 'dd.MM.yyyy', 'yyyy-MM-dd']; +export const DEFAULT_DATE_FORMATS = ['yyyy-MM-dd', 'dd.MM.yyyy', 'dd.MM.yy']; -export const DEFAULT_TIME_FORMATS = ['HH:mm', 'HH:mm:ss']; +export const DEFAULT_TIME_FORMATS = ['HH:mm:ss', 'HH:mm']; export const DEFAULT_EVENT_DURATION = 60 * 60 * 1000; // 1 hour in millis +const logger = new Logger('string-with-dates-parser'); + export function parse(str: string, params?: Moo.Rules): Moo.Token[] { if (!params) params = DEFAULT_PARAMS; try { @@ -32,6 +35,7 @@ export function parse(str: string, params?: Moo.Rules): Moo.Token[] { } return res; } catch (ex) { + logger.error(`Error at parse str=${str} with params=${params}, error message - ${ex}`); return []; } } @@ -42,10 +46,17 @@ export type ParserOpts = { timeFormats?: string[]; }; +export const DEFAULT_PARSER_OPTS: ParserOpts = { + rules: DEFAULT_PARAMS, + dateFormats: DEFAULT_DATE_FORMATS, + timeFormats: DEFAULT_TIME_FORMATS, +}; + export function parseDate( str: string, formats?: string[], ): Luxon.DateTime | null { + if (!str) return null; if (!formats) formats = DEFAULT_DATE_FORMATS; let res: Luxon.DateTime; for (let i = 0; i < formats.length; i++) { @@ -60,6 +71,7 @@ export function parseTime( str: string, formats?: string[], ): Luxon.Duration | null { + if (!str) return null; if (!formats) formats = DEFAULT_TIME_FORMATS; let res: Luxon.DateTime; for (let i = 0; i < formats.length; i++) { @@ -82,6 +94,7 @@ export function parseToCalendarEvent( str: string, opts?: ParserOpts, ): CalendarEvent | null { + if (!opts) opts = DEFAULT_PARSER_OPTS; const tokens = parse(str, opts?.rules); const words = tokens.filter((i) => i.type === 'word');