]): string =>
+ `\nπΊοΈ ${continentName}, totally ${countries.length} countries\n`.concat(
+ countries.map((country: Country) => country.name).join('; ')
+ )
)
.join('\n');
const hint: string = `βΉ i.e. /country ${countries[0].name}`;
- return availableFor
- .concat(`\n\n${countriesList}`)
- .concat(`\n\n${hint}`)
+ return availableFor.concat(`\n\n${countriesList}`).concat(`\n\n${hint}`);
};
diff --git a/server/src/messages/feature/countriesMessages.ts b/server/src/messages/feature/countriesMessages.ts
index af50f1f..f314eb5 100644
--- a/server/src/messages/feature/countriesMessages.ts
+++ b/server/src/messages/feature/countriesMessages.ts
@@ -1,18 +1,51 @@
-import {getActiveCases} from '../covid19Messages';
-import {table, tableConfig} from '../../models/table.models';
+import { table, tableConfig } from '../../models/table.models';
+import { flag } from 'country-emoji';
+import { getActiveCases } from '../../services/domain/countries';
-export const getCountriesSumupMessage = (
+export const getCountriesWorldMessage = (
worldConfirmed: number,
worldRecovered: number,
worldDeaths: number,
countries: number,
- continents: number,
+ continents: number
): string =>
- `In the world π\nConfirmed: ${worldConfirmed}, active: ${getActiveCases(worldConfirmed, worldRecovered, worldDeaths)} recovered: ${worldRecovered}, death: ${worldDeaths} in ${countries} countries, on ${continents} continents`;
+ `In the world π\nConfirmed: ${worldConfirmed}, active: ${getActiveCases(
+ worldConfirmed,
+ worldRecovered,
+ worldDeaths
+ )} recovered: ${worldRecovered}, death: ${worldDeaths} in ${countries} countries, on ${continents} continents`;
-export const getCountriesTableHTML = ({
- continent,
- continentTotalConfirmed, continentTotalRecovered, continentTotalDeath,
- portionMessage,
- }): string => `πΊοΈ ${continent}. Total active: ${continentTotalConfirmed}, recovered: ${continentTotalRecovered}, death: ${continentTotalDeath}
- \n${table(portionMessage, tableConfig)}
`;
+export const getTableHeader = (): Array => [
+ 'Country',
+ 'Active',
+ 'Recovered',
+ 'Deaths',
+];
+
+export const getTableCountryRowMessage = (
+ name,
+ active,
+ recovered,
+ deaths
+): Array => [
+ `${flag(name) ?? ''} ${name}`,
+ `${active}`,
+ `${recovered}`,
+ `${deaths}`,
+];
+
+export const getCountriesTableHTML = (
+ continent,
+ confirmed,
+ recovered,
+ deaths,
+ countriesSituation,
+ portionMessage
+): string =>
+ `πΊοΈ ${continent}\nConfirmed: ${confirmed}, active: ${getActiveCases(
+ confirmed,
+ recovered,
+ deaths
+ )} recovered: ${recovered}, death: ${deaths}` +
+ ` in ${countriesSituation.length} countries, ${continent}` +
+ `\n${table(portionMessage, tableConfig)}
`;
diff --git a/server/src/messages/feature/countryMessages.ts b/server/src/messages/feature/countryMessages.ts
index 002db30..70ccae9 100644
--- a/server/src/messages/feature/countryMessages.ts
+++ b/server/src/messages/feature/countryMessages.ts
@@ -1,26 +1,27 @@
-import {Country, CountryMessage} from '../../models/country.models';
-import {getActiveCases} from '../covid19Messages';
-import {flag} from 'country-emoji';
-import {UserRegExps} from '../../models/constants';
+import { UserRegExps } from '../../models/constants';
+import { getActiveCases } from '../../services/domain/countries';
+import { flag } from 'country-emoji';
-export const getMessageForUserInputWithoutCountryName = (): string => `Sorry, but I can show country only by country name. Enter country name by a pattern ${UserRegExps.CountryData} [country name]`;
+export const getUserInputWithoutCountryNameMessage = (): string =>
+ `Sorry, but I can show country only by country name.` +
+ ` Enter country name by a pattern ${UserRegExps.CountryData} [country name]`;
-export const getTableRowMessageForCountry = ({
- name,
- confirmed,
- recovered,
- deaths,
- lastUpdateDate,
- }: CountryMessage): Array =>
- [`${flag(name) ?? ''} ${name}`, `${getActiveCases(confirmed, recovered, deaths)}`, `${recovered}`, `${deaths}`];
+export const getCountryNonExistenceErrorMessage = (country: string): string =>
+ `Sorry, but I cannot find anything for ${country}.` +
+ ` I will save your request and will work on it`;
-export const getTableHeader = (): Array => ['Country', 'Active', 'Recovered', 'Deaths'];
+export const getCountryMessage = (
+ name,
+ confirmed,
+ recovered,
+ deaths,
+ date
+): string =>
+ `${flag(name) ?? ''} ${name}, ${confirmed} confirmed, ${getActiveCases(
+ confirmed,
+ recovered,
+ deaths
+ )} active, ${recovered} recovered, ${deaths} deaths. β±οΈ${date}`;
-export const getMessageForCountry = ({
- name,
- confirmed,
- recovered,
- deaths,
- lastUpdateDate,
- }: CountryMessage): string =>
- `${flag(name) ?? ''} ${name}, ${getActiveCases(confirmed, recovered, deaths)} active, ${recovered} recovered, ${deaths} deaths. β±οΈ${lastUpdateDate}`;
\ No newline at end of file
+export const getCountryIKActionMessage = (country: string): string =>
+ `More on ${country}`;
diff --git a/server/src/messages/feature/subscribeMessages.ts b/server/src/messages/feature/subscribeMessages.ts
index 5527290..437c7ff 100644
--- a/server/src/messages/feature/subscribeMessages.ts
+++ b/server/src/messages/feature/subscribeMessages.ts
@@ -1,48 +1,60 @@
-import {Subscription, UserSubscription} from '../../models/subscription.models';
-import {getMessageForCountry} from './countryMessages';
-import {CountrySituationInfo} from '../../models/covid19.models';
-import {getDiffMessage} from '../covid19Messages';
+import {
+ Subscription,
+ UserSubscription,
+} from '../../models/subscription.models';
+import { getCountryMessage } from './countryMessages';
+import { CountrySituationInfo } from '../../models/covid19.models';
+import { getDiffMessage } from '../covid19Messages';
-export const ALREADY_SUBSCRIBED_MESSAGE: string = 'You are already subscribed on the country';
+export const ALREADY_SUBSCRIBED_MESSAGE: string =
+ 'You are already subscribed on the country';
export const subscriptionManagerResponseMessage = (): string => {
- return `Easy way to manage your subscriptions π`
+ return `Easy way to manage your subscriptions π`;
};
export const noSubscriptionsResponseMessage = (): string => {
- return `It seems you haven't subscribed for any π₯Ί`
+ return `It seems you haven't subscribed for any π₯Ί`;
};
export const subscribeError = (message: string): string => {
- return `${message}, sorry ππ½β`
+ return `${message}, sorry ππ½β`;
};
export const subscriptionResultMessage = (message: string): string => {
return `Cool, subscribed on ${message} π`;
};
-export const showMySubscriptionMessage = (userSubscription: UserSubscription): string => {
- return `You're π subscribed on: `
- .concat(userSubscription.subscriptionsOn.map((sub: Subscription) => `${sub.value}`).join(', '))
+export const showMySubscriptionMessage = (
+ userSubscription: UserSubscription
+): string => {
+ return `You're π subscribed on: `.concat(
+ userSubscription.subscriptionsOn
+ .map((sub: Subscription) => `${sub.value}`)
+ .join(', ')
+ );
};
export const showCountrySubscriptionMessage = (
- {name, confirmed, recovered, deaths, date}: Partial,
- {confirmed: prevConfirmed, recovered: prevRecovered, deaths: prevDeaths, date: prevDate}: Partial
+ { name, confirmed, recovered, deaths, date }: Partial,
+ {
+ confirmed: prevConfirmed,
+ recovered: prevRecovered,
+ deaths: prevDeaths,
+ date: prevDate,
+ }: Partial
): string => {
- return `π `
- + getMessageForCountry({
- name,
- confirmed,
- recovered,
- deaths,
- lastUpdateDate: date,
- })
- + `\n\nπ Country change, since β±οΈ${prevDate}\n`
- + getDiffMessage(
- {confirmed, recovered, deaths},
+ return (
+ `π ` +
+ getCountryMessage(name, confirmed, recovered, deaths, date) +
+ `\n\nπ Country change, since β±οΈ${prevDate}\n` +
+ getDiffMessage(
+ { confirmed, recovered, deaths },
{
- confirmed: prevConfirmed, recovered: prevRecovered, deaths: prevDeaths
+ confirmed: prevConfirmed,
+ recovered: prevRecovered,
+ deaths: prevDeaths,
}
)
+ );
};
diff --git a/server/src/messages/feature/unsubscribeMessages.ts b/server/src/messages/feature/unsubscribeMessages.ts
index 724d716..f714900 100644
--- a/server/src/messages/feature/unsubscribeMessages.ts
+++ b/server/src/messages/feature/unsubscribeMessages.ts
@@ -2,8 +2,8 @@ export const getUnsubscribeResponseMessage = (): string => {
return 'Choose items to unsubscribe from';
};
-export const unSubscribeError = (message: string): string => {
- return `${message}, sorry ππ½`
+export const unSubscribeErrorMessage = (message: string): string => {
+ return `${message}, sorry ππ½`;
};
export const unsubscribeResultMessage = (message: string): string => {
diff --git a/server/src/models/constants.ts b/server/src/models/constants.ts
index a95aafb..5017d24 100644
--- a/server/src/models/constants.ts
+++ b/server/src/models/constants.ts
@@ -9,8 +9,8 @@ export const CONSOLE_LOG_EASE_DELIMITER: string = '==============> ';
export const CONSOLE_LOG_DELIMITER: string = '\n\n==============> ';
export enum CustomSubscriptions {
- SubscribeMeOn = `Subscribe on`,
- UnsubscribeMeFrom = `Unsubscribe me from`
+ SubscribeMeOn = `Subscribe me on`,
+ UnsubscribeMeFrom = `Unsubscribe me from`,
}
export enum UserRegExps {
@@ -23,18 +23,18 @@ export enum UserRegExps {
Advice = '/advice',
Subscribe = '/subscribe',
Unsubscribe = '/unsubscribe',
- Help = '/help'
+ Help = '/help',
}
export enum UserMessages {
Assistant = 'Assistant π¦',
CountriesData = 'Countries data π',
AvailableCountries = 'Countries we track',
- GetAdvicesHowToBehave = 'Advice how not to π·',
+ GetAdviceHowToBehave = 'Advice how not to π·',
SubscriptionManager = 'Subscriptions π',
Existing = 'Existing',
Unsubscribe = 'Unsubscribe',
- Help = 'βΉ What can you do?'
+ Help = 'βΉ What can you do?',
}
export enum Continents {
@@ -43,12 +43,11 @@ export enum Continents {
Africa = 'Africa',
Americas = 'Americas',
Oceania = 'Oceania',
- Other = 'Other'
+ Other = 'Other',
}
export enum Status {
Confirmed = 'confirmed',
Deaths = 'deaths',
- Recovered = 'recovered'
+ Recovered = 'recovered',
}
-
diff --git a/server/src/models/continent.models.ts b/server/src/models/continent.models.ts
deleted file mode 100644
index 20c30c1..0000000
--- a/server/src/models/continent.models.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export interface ContinentsCountries {
- [continentName: string]: Array;
-}
\ No newline at end of file
diff --git a/server/src/models/country.models.ts b/server/src/models/country.models.ts
index b75946b..08a0384 100644
--- a/server/src/models/country.models.ts
+++ b/server/src/models/country.models.ts
@@ -1,15 +1,7 @@
-import {UserPresentationalCountryNameString} from './tsTypes.models';
+import { UserPresentationalCountryNameString } from './tsTypes.models';
export interface Country {
name: UserPresentationalCountryNameString;
region: string;
continent: string;
}
-
-export interface CountryMessage {
- name: string;
- confirmed: number;
- recovered: number;
- deaths: number;
- lastUpdateDate: string;
-}
\ No newline at end of file
diff --git a/server/src/models/covid19.models.ts b/server/src/models/covid19.models.ts
index edfaaff..fae42f0 100644
--- a/server/src/models/covid19.models.ts
+++ b/server/src/models/covid19.models.ts
@@ -1,4 +1,4 @@
-import {Country} from './country.models';
+import { Country } from './country.models';
export interface ApiCountriesCovid19Situation {
[country: string]: Array;
@@ -12,15 +12,28 @@ export interface ApiCovid19Situation {
}
export type CountrySituationInfo = Country & ApiCovid19Situation;
+export type CountryActiveSituationInfo = CountrySituationInfo & {
+ active: number;
+};
-export interface CountrySituation {
- lastUpdateDate: string;
- country: Country;
+export interface ContinentsCountries {
+ [continentName: string]: Array;
+}
+
+export interface ContinentCountriesSituations {
+ [continentName: string]: Array;
+}
+
+export interface WorldOverallInformation {
confirmed: number;
recovered: number;
deaths: number;
+ continentCountriesSituations: ContinentCountriesSituations;
}
-export interface ContinentCountriesSituation {
- [continentName: string]: Array
-}
\ No newline at end of file
+export interface ContinentOverallInformation {
+ confirmed: number;
+ recovered: number;
+ deaths: number;
+ countriesSituation: Array;
+}
diff --git a/server/src/models/subscription.models.ts b/server/src/models/subscription.models.ts
index 70d96ae..2fb6920 100644
--- a/server/src/models/subscription.models.ts
+++ b/server/src/models/subscription.models.ts
@@ -1,5 +1,5 @@
-import {TelegramChat} from '../bots/telegram/models';
-import {CountrySituationInfo} from './covid19.models';
+import { CountrySituationInfo } from './covid19.models';
+import * as TelegramBot from 'node-telegram-bot-api';
export enum SubscriptionType {
TrackCountryUpdates = 'New country',
@@ -17,7 +17,7 @@ export interface Subscription {
}
export interface UserSubscription {
- chat: TelegramChat;
+ chat: TelegramBot.Chat;
subscriptionsOn: Array;
}
diff --git a/server/src/routes/base/base.ts b/server/src/routes/base/base.ts
index 1c419a1..a23639d 100644
--- a/server/src/routes/base/base.ts
+++ b/server/src/routes/base/base.ts
@@ -1,11 +1,13 @@
-import {Request, Response} from 'express';
-
-const pkg = require(__dirname + '/../../../../package.json');
+import { Request, Response } from 'express';
+import { version } from '../../../../package.json';
export let base = (req: Request, res: Response) => {
res.json({
- message: 'Welcome to Covid19 live bot api. Refer to documentation here - https://github.com/danbilokha/covid19liveupdates',
- version: pkg.version || 'They didn\'n say me :c',
- containerVersion: process.env.CONTAINER_VERSION || 'They didn\'n say me :c But it should be the same as package.version',
+ message:
+ 'Welcome to Covid19 live bot api. Refer to documentation here - https://github.com/danbilokha/covid19liveupdates',
+ version: version ?? 'They didn\'n say me :c',
+ containerVersion:
+ process.env.CONTAINER_VERSION ??
+ 'They didn\'n say me :c But it should be the same as package.version',
});
};
diff --git a/server/src/services/api/api-covid19.ts b/server/src/services/api/api-covid19.ts
index d4a8379..ca33f9f 100644
--- a/server/src/services/api/api-covid19.ts
+++ b/server/src/services/api/api-covid19.ts
@@ -1,8 +1,9 @@
-import {ApiCountriesCovid19Situation} from '../../models/covid19.models';
-import axios, {AxiosResponse} from 'axios';
+import { ApiCountriesCovid19Situation } from '../../models/covid19.models';
+import axios, { AxiosResponse } from 'axios';
import Config from '../../environments/environment';
export function fetchCovid19Data(): Promise {
- return axios.get(`${Config.COVID19API_URL}/timeseries.json`)
- .then((response: AxiosResponse): ApiCountriesCovid19Situation => response.data)
-}
\ No newline at end of file
+ return axios
+ .get(`${Config.COVID19API_URL}/timeseries.json`)
+ .then((response: AxiosResponse): ApiCountriesCovid19Situation => response.data);
+}
diff --git a/server/src/services/api/api-knowledgebase.ts b/server/src/services/api/api-knowledgebase.ts
index 1df5dba..d2fe87f 100644
--- a/server/src/services/api/api-knowledgebase.ts
+++ b/server/src/services/api/api-knowledgebase.ts
@@ -1,38 +1,54 @@
-import axios, {AxiosResponse} from 'axios';
-import {Answer, ApiAnswer} from '../../models/knowledgebase/answer.models';
+import axios, { AxiosResponse } from 'axios';
+import { Answer, ApiAnswer } from '../../models/knowledgebase/answer.models';
import environments from '../../environments/environment';
-import {KnowledgebaseMeta} from '../../models/knowledgebase/meta.models';
+import { KnowledgebaseMeta } from '../../models/knowledgebase/meta.models';
export function fetchKnowledgeMetainformation(): Promise {
- return axios.get(`${environments.KNOWLEDGEBASE_URL}/meta/all`, {
- headers: {'x-access-token': environments.KNOWLEDGEBASE_SECRET_KEY}
- })
- .then((response: AxiosResponse): KnowledgebaseMeta => response.data)
+ return axios
+ .get(`${environments.KNOWLEDGEBASE_URL}/meta/all`, {
+ headers: { 'x-access-token': environments.KNOWLEDGEBASE_SECRET_KEY },
+ })
+ .then((response: AxiosResponse): KnowledgebaseMeta => response.data);
}
export function fetchAnswer(question: string): Promise> {
- return axios.get(`${environments.KNOWLEDGEBASE_URL}/question`, {
- headers: {'x-access-token': environments.KNOWLEDGEBASE_SECRET_KEY},
- params: {question},
- }
- )
+ return axios
+ .get(`${environments.KNOWLEDGEBASE_URL}/question`, {
+ headers: { 'x-access-token': environments.KNOWLEDGEBASE_SECRET_KEY },
+ params: { question },
+ })
.then((response: AxiosResponse): Array => response.data)
.then(
- (answers: Array): Array => answers.map(({
- category,
- countries,
- answer,
- links,
- additional_answers,
- additional_links
- }: ApiAnswer): Answer => ({
- category,
- answer,
- question,
- countries: countries.split(';').map(v => v.trim()).filter(v => !!v),
- links: links.replace(/ /g, '').split(';').filter(v => !!v),
- additionalAnswers: additional_answers.split(';').map(v => v.trim()).filter(v => !!v),
- additionalLinks: additional_links.replace(/ /g, '').split(';').filter(v => !!v),
- }))
- )
-}
\ No newline at end of file
+ (answers: Array): Array =>
+ answers.map(
+ ({
+ category,
+ countries,
+ answer,
+ links,
+ additional_answers,
+ additional_links,
+ }: ApiAnswer): Answer => ({
+ category,
+ answer,
+ question,
+ countries: countries
+ .split(';')
+ .map((v) => v.trim())
+ .filter((v) => !!v),
+ links: links
+ .replace(/ /g, '')
+ .split(';')
+ .filter((v) => !!v),
+ additionalAnswers: additional_answers
+ .split(';')
+ .map((v) => v.trim())
+ .filter((v) => !!v),
+ additionalLinks: additional_links
+ .replace(/ /g, '')
+ .split(';')
+ .filter((v) => !!v),
+ })
+ )
+ );
+}
diff --git a/server/src/services/domain/chart.ts b/server/src/services/domain/chart.ts
index cabefd7..b724a5f 100644
--- a/server/src/services/domain/chart.ts
+++ b/server/src/services/domain/chart.ts
@@ -1,31 +1,33 @@
-import {Status} from '../../models/constants'
-import {ChartModel} from '../../models/chart.models'
-import {CountrySituationInfo} from '../../models/covid19.models';
+import { Status } from '../../models/constants';
+import { ChartModel } from '../../models/chart.models';
+import { CountrySituationInfo } from '../../models/covid19.models';
-export const Transform = (situations: CountrySituationInfo[]): ChartModel => {
- const days = situations.map(x => x.date);
- return {
- type: 'line',
- data: {
- labels: days,
+export const Transform = (situations: CountrySituationInfo[]): ChartModel => {
+ const days = situations.map((x) => x.date);
+ return {
+ type: 'line',
+ data: {
+ labels: days,
datasets: [
- { label: Status.Confirmed, data: situations.map(x => x.confirmed),
- fill: false,
- borderColor: 'blue'
- },
- {
- label: Status.Deaths,
- data: situations.map(x => x.deaths),
- fill: false,
- borderColor: 'red'
+ {
+ label: Status.Confirmed,
+ data: situations.map((x) => x.confirmed),
+ fill: false,
+ borderColor: 'blue',
},
- {
- label: Status.Recovered,
- data: situations.map(x => x.recovered),
- fill: false,
- borderColor: 'green'
- }
- ]
- }
+ {
+ label: Status.Deaths,
+ data: situations.map((x) => x.deaths),
+ fill: false,
+ borderColor: 'red',
+ },
+ {
+ label: Status.Recovered,
+ data: situations.map((x) => x.recovered),
+ fill: false,
+ borderColor: 'green',
+ },
+ ],
+ },
};
-}
\ No newline at end of file
+};
diff --git a/server/src/services/domain/countries.ts b/server/src/services/domain/countries.ts
new file mode 100644
index 0000000..5ade29f
--- /dev/null
+++ b/server/src/services/domain/countries.ts
@@ -0,0 +1,151 @@
+import { Country } from '../../models/country.models';
+import {
+ ContinentCountriesSituations,
+ ContinentOverallInformation,
+ ContinentsCountries,
+ CountryActiveSituationInfo,
+ CountrySituationInfo,
+ WorldOverallInformation,
+} from '../../models/covid19.models';
+import { getCountriesSituation } from './covid19';
+import { getCountryNonExistenceErrorMessage } from '../../messages/feature/countryMessages';
+
+export const getActiveCases = (
+ totalConfirmed: number,
+ totalRecovered: number,
+ totalDeaths: number
+): number => totalConfirmed - totalRecovered - totalDeaths ?? 0;
+
+export const getCountriesByContinent = (
+ countries: Array
+): ContinentsCountries => {
+ const continentsCountries: ContinentsCountries = {};
+
+ countries.forEach((country: Country) => {
+ const continentCountries = continentsCountries[country.continent];
+
+ if (!!continentCountries?.length) {
+ continentCountries.push(country);
+ return;
+ }
+
+ continentsCountries[country.continent] = [country];
+ });
+
+ return continentsCountries;
+};
+
+export const getRequestedCountry = async (
+ countryName: string
+): Promise<[Country, Array]> => {
+ const allCountriesSituations: Array<[
+ Country,
+ Array
+ ]> = await getCountriesSituation();
+
+ const foundCountrySituations: [
+ Country,
+ Array
+ ] = allCountriesSituations.find(
+ ([receivedCountry, situations]) => receivedCountry.name === countryName
+ );
+
+ if (
+ !foundCountrySituations ||
+ !foundCountrySituations?.length ||
+ !foundCountrySituations[0] ||
+ !foundCountrySituations[1].length
+ ) {
+ throw new Error(getCountryNonExistenceErrorMessage(countryName));
+ }
+
+ return foundCountrySituations;
+};
+
+export const getWorldOverallInformation = async (): Promise<
+ WorldOverallInformation
+> => {
+ const countriesSituation: Array<[
+ Country,
+ Array
+ ]> = await getCountriesSituation();
+
+ const continentCountriesSituations: ContinentCountriesSituations = {};
+ let worldTotalConfirmed = 0;
+ let worldTotalRecovered = 0;
+ let worldTotalDeaths = 0;
+
+ countriesSituation.forEach(
+ ([country, situations]: [Country, Array]) => {
+ const lastCountrySituation: CountrySituationInfo =
+ situations[situations.length - 1];
+ const { confirmed, recovered, deaths } = lastCountrySituation;
+
+ worldTotalConfirmed += confirmed;
+ worldTotalRecovered += recovered;
+ worldTotalDeaths += deaths;
+
+ const prevCountriesResult = continentCountriesSituations[
+ country.continent
+ ]
+ ? continentCountriesSituations[country.continent]
+ : [];
+ continentCountriesSituations[country.continent] = [
+ ...prevCountriesResult,
+ lastCountrySituation,
+ ];
+ }
+ );
+
+ return {
+ confirmed: worldTotalConfirmed,
+ recovered: worldTotalRecovered,
+ deaths: worldTotalDeaths,
+ continentCountriesSituations,
+ };
+};
+
+export const getContinentOverallInformation = async (
+ continent: string
+): Promise => {
+ const allCountriesSituation: Array<[
+ Country,
+ Array
+ ]> = await getCountriesSituation();
+
+ let countriesSituation: Array = [];
+ let continentTotalConfirmed: number = 0;
+ let continentTotalRecovered: number = 0;
+ let continentTotalDeath: number = 0;
+
+ allCountriesSituation
+ .filter(
+ ([country, _]: [Country, Array]) =>
+ country.continent === continent
+ )
+ .forEach(([_, situations]: [Country, Array]) => {
+ const lastCountrySituationInfo: CountrySituationInfo =
+ situations[situations.length - 1];
+ const { confirmed, recovered, deaths } = lastCountrySituationInfo;
+ const active = getActiveCases(confirmed, recovered, deaths);
+
+ continentTotalConfirmed += confirmed;
+ continentTotalRecovered += recovered;
+ continentTotalDeath += deaths;
+
+ countriesSituation = [
+ ...countriesSituation,
+ {
+ ...lastCountrySituationInfo,
+ active,
+ },
+ ];
+ });
+
+ return {
+ confirmed: continentTotalConfirmed,
+ recovered: continentTotalRecovered,
+ deaths: continentTotalDeath,
+ countriesSituation,
+ };
+};
diff --git a/server/src/services/domain/countriesByContinent.ts b/server/src/services/domain/countriesByContinent.ts
deleted file mode 100644
index 1df3e9a..0000000
--- a/server/src/services/domain/countriesByContinent.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import {Country} from '../../models/country.models';
-import {ContinentsCountries} from '../../models/continent.models';
-
-export const getCountriesByContinent = (countries: Array): ContinentsCountries => {
- const continentsCountries: ContinentsCountries = {};
-
- countries
- .forEach(({name, continent}: Country) => {
- const continentCountries = continentsCountries[continent];
-
- if (!!continentCountries?.length) {
- continentCountries.push(name);
- return;
- }
-
- continentsCountries[continent] = [name];
- return;
- });
-
- return continentsCountries;
-};
diff --git a/server/src/services/domain/countryLookup.ts b/server/src/services/domain/countryLookup.ts
index 25d4502..82c6f51 100644
--- a/server/src/services/domain/countryLookup.ts
+++ b/server/src/services/domain/countryLookup.ts
@@ -1,4 +1,4 @@
-import {CountryLookup} from '../../models/country-code-lookup.models';
+import { CountryLookup } from '../../models/country-code-lookup.models';
import * as lookup from 'country-code-lookup';
const COUNTRIES_LOOKUP_LIST: Array = lookup.countries;
@@ -12,14 +12,14 @@ export const getDefaultCountry = (name): CountryLookup => ({
iso2: 'Other',
iso3: 'Other',
isoNo: 'Other',
- internet: 'Other'
+ internet: 'Other',
});
export const getCountryByName = (name: string): CountryLookup => {
/* tslint:disable:prefer-for-of */
for (let i = 0; i < COUNTRIES_LOOKUP_LIST.length; i++) {
if (COUNTRIES_LOOKUP_LIST[i].country.toLocaleLowerCase() === name.toLocaleLowerCase()) {
- return COUNTRIES_LOOKUP_LIST[i]
+ return COUNTRIES_LOOKUP_LIST[i];
}
}
diff --git a/server/src/services/domain/covid19.ts b/server/src/services/domain/covid19.ts
index bf6994d..6bbce7e 100644
--- a/server/src/services/domain/covid19.ts
+++ b/server/src/services/domain/covid19.ts
@@ -1,27 +1,39 @@
-import {UserPresentationalCountryNameString} from '../../models/tsTypes.models';
-import {ApiCountriesCovid19Situation, ApiCovid19Situation, CountrySituationInfo} from '../../models/covid19.models';
-import {COVID19_FETCH_SALT, TIMES} from '../../models/constants';
-import {Country} from '../../models/country.models';
-import {fetchCovid19Data} from '../api/api-covid19';
-import {CountryLookup} from '../../models/country-code-lookup.models';
-import {getCountryNameFormat} from '../../utils/featureHelpers/country';
-import {getCountryByName, getDefaultCountry} from './countryLookup';
-import {SubscriptionType} from '../../models/subscription.models';
-import {logger} from '../../utils/logger';
-import {LogglyTypes} from '../../models/loggly.models';
+import { UserPresentationalCountryNameString } from '../../models/tsTypes.models';
+import {
+ ApiCountriesCovid19Situation,
+ ApiCovid19Situation,
+ CountrySituationInfo,
+} from '../../models/covid19.models';
+import { COVID19_FETCH_SALT, TIMES } from '../../models/constants';
+import { Country } from '../../models/country.models';
+import { fetchCovid19Data } from '../api/api-covid19';
+import { CountryLookup } from '../../models/country-code-lookup.models';
+import { getCountryNameFormat } from '../../utils/featureHelpers/country';
+import { getCountryByName, getDefaultCountry } from './countryLookup';
+import { SubscriptionType } from '../../models/subscription.models';
+import { logger } from '../../utils/logger';
+import { LogglyTypes } from '../../models/loggly.models';
+import * as TelegramBot from 'node-telegram-bot-api';
// TODO: Improve Cached management
class CachedCovid19CountriesData {
private subscribers: Array<[Array, Function]> = [];
- public set countriesData(countriesData: [number, Array<[Country, Array]>]) {
+ public set countriesData(
+ countriesData: [number, Array<[Country, Array]>]
+ ) {
this.cachedCountriesData = countriesData;
this.subscribers.forEach(([subscriptionsType, cb]: [Array, Function]) => {
- if (subscriptionsType.some((subscriptionType: SubscriptionType) => subscriptionType !== SubscriptionType.TrackCountryUpdates)) {
+ if (
+ subscriptionsType.some(
+ (subscriptionType: SubscriptionType) =>
+ subscriptionType !== SubscriptionType.TrackCountryUpdates
+ )
+ ) {
cb(this.countriesData);
}
- })
+ });
}
public get countriesData(): [number, Array<[Country, Array]>] {
@@ -32,19 +44,28 @@ class CachedCovid19CountriesData {
this.cachedAvailableCountriesData = countries;
this.subscribers.forEach(([subscriptionsType, cb]: [Array, Function]) => {
- if (subscriptionsType.some((subscriptionType: SubscriptionType) => subscriptionType === SubscriptionType.TrackCountryUpdates)) {
+ if (
+ subscriptionsType.some(
+ (subscriptionType: SubscriptionType) =>
+ subscriptionType === SubscriptionType.TrackCountryUpdates
+ )
+ ) {
cb(this.availableCountriesData);
}
- })
+ });
}
public get availableCountriesData(): Array {
return this.cachedAvailableCountriesData;
}
- constructor(private cachedCountriesData: [number, Array<[Country, Array]>] = [0, []],
- private cachedAvailableCountriesData: Array = []) {
- }
+ constructor(
+ private cachedCountriesData: [number, Array<[Country, Array]>] = [
+ 0,
+ [],
+ ],
+ private cachedAvailableCountriesData: Array = []
+ ) {}
public subscribe(cb: Function, subscriptionsType: Array): void {
this.subscribers = [...this.subscribers, [subscriptionsType, cb]];
@@ -53,66 +74,70 @@ class CachedCovid19CountriesData {
export const cachedCovid19CountriesData = new CachedCovid19CountriesData();
-export const adaptCountryToSystemRepresentation =
- (country: string): UserPresentationalCountryNameString => getCountryNameFormat(
- country
- .trim()
- .toLocaleUpperCase()
+export const adaptCountryToSystemRepresentation = (
+ country: string
+): UserPresentationalCountryNameString => getCountryNameFormat(country.trim().toLocaleUpperCase());
+
+function adaptApiCountriesResponse(
+ apiCountriesSituation: ApiCountriesCovid19Situation
+): Array<[Country, Array]> {
+ return Object.entries(apiCountriesSituation).map(
+ ([apiCountry, apiSituations]: [string, Array]) => {
+ const adaptedCountry: UserPresentationalCountryNameString = adaptCountryToSystemRepresentation(
+ apiCountry
+ );
+ const countryLookup: CountryLookup =
+ getCountryByName(adaptedCountry) ?? getDefaultCountry(adaptedCountry);
+
+ const country: Country = {
+ name: adaptedCountry,
+ region: countryLookup.region,
+ continent: countryLookup.continent,
+ };
+
+ return [
+ country,
+ apiSituations.map((situation: ApiCovid19Situation) => ({
+ ...country,
+ ...situation,
+ recovered: situation.recovered ?? 0,
+ deaths: situation.deaths ?? 0,
+ confirmed: situation.confirmed ?? 0,
+ })),
+ ];
+ }
);
-
-function adaptApiCountriesResponse(apiCountriesSituation: ApiCountriesCovid19Situation): Array<[Country, Array]> {
- return Object.entries(apiCountriesSituation)
- .map(([apiCountry, apiSituations]: [string, Array]) => {
- const adaptedCountry: UserPresentationalCountryNameString = adaptCountryToSystemRepresentation(apiCountry);
- const countryLookup: CountryLookup = getCountryByName(adaptedCountry) ?? getDefaultCountry(adaptedCountry);
-
- const country: Country = {
- name: adaptedCountry,
- region: countryLookup.region,
- continent: countryLookup.continent,
- };
-
- return [
- country,
- apiSituations.map((situation: ApiCovid19Situation) => ({
- ...country,
- ...situation,
- recovered: situation.recovered ?? 0,
- deaths: situation.deaths ?? 0,
- confirmed: situation.confirmed ?? 0,
- }))
- ]
- }
- );
}
function getCovid19Data(): Promise]>> {
- return fetchCovid19Data()
- .then((apiCountriesSituation: ApiCountriesCovid19Situation) => {
- const countriesSituation: Array<[Country, Array]> = adaptApiCountriesResponse(apiCountriesSituation);
- cachedCovid19CountriesData.availableCountriesData = countriesSituation.map(([country]) => country);
- cachedCovid19CountriesData.countriesData = [Date.now(), countriesSituation];
+ return fetchCovid19Data().then((apiCountriesSituation: ApiCountriesCovid19Situation) => {
+ const countriesSituation: Array<[
+ Country,
+ Array
+ ]> = adaptApiCountriesResponse(apiCountriesSituation);
+ cachedCovid19CountriesData.availableCountriesData = countriesSituation.map(
+ ([country]) => country
+ );
+ cachedCovid19CountriesData.countriesData = [Date.now(), countriesSituation];
- return countriesSituation;
- });
+ return countriesSituation;
+ });
}
-export function tryToUpdateCovid19Cache(): Promise {
+export function tryToUpdateCovid19Cache(): Promise {
return getCovid19Data()
- .then(v => undefined)
- .catch(e => logger.log(
- 'error',
- {
+ .then((v) => undefined)
+ .catch((e) =>
+ logger.log('error', {
type: LogglyTypes.Covid19DataUpdateError,
message: `[ERROR] While fetching Hopkins uni data. ${e?.message}, ${e?.stack}`,
- }
- ));
+ })
+ );
}
export function getCountriesSituation(): Promise]>> {
const [lastFetchedTime, countriesSituation] = cachedCovid19CountriesData.countriesData ?? [];
-
if (lastFetchedTime > Date.now() - TIMES.MILLISECONDS_IN_HOUR - COVID19_FETCH_SALT) {
return Promise.resolve(countriesSituation);
}
@@ -125,8 +150,8 @@ export function getAvailableCountries(): Promise> {
return Promise.resolve(cachedCovid19CountriesData.availableCountriesData);
}
- return getCovid19Data()
- .then((countriesSituation: Array<[Country, Array]>) =>
+ return getCovid19Data().then(
+ (countriesSituation: Array<[Country, Array]>) =>
countriesSituation.map(([country]) => country)
- )
+ );
}
diff --git a/server/src/services/domain/storage.ts b/server/src/services/domain/storage.ts
index 0927e58..a18c812 100644
--- a/server/src/services/domain/storage.ts
+++ b/server/src/services/domain/storage.ts
@@ -1,7 +1,7 @@
import * as firebase from 'firebase';
-import {Subscription, UserSubscription} from '../../models/subscription.models';
-import {SubscriptionStorage} from '../../models/storage.models';
-import {TelegramMessage} from '../../bots/telegram/models';
+import { Subscription, UserSubscription } from '../../models/subscription.models';
+import { SubscriptionStorage } from '../../models/storage.models';
+import * as TelegramBot from 'node-telegram-bot-api';
import DataSnapshot = firebase.database.DataSnapshot;
export const getFllStorage = async (): Promise => {
@@ -9,27 +9,39 @@ export const getFllStorage = async (): Promise => {
return snapshot.val() ?? {};
};
-export const getMessengerStorage = (messengerPrefix: string): Function => async (): Promise => {
+export const getMessengerStorage = (messengerPrefix: string): Function => async (): Promise<
+ T
+> => {
const snapshot: DataSnapshot = await firebase.database().ref(messengerPrefix).once('value');
return snapshot.val() ?? {};
};
export const listenSubscriptionsChanges = (messengerPrefix: string): Function => (
cb: (a: firebase.database.DataSnapshot, b?: string | null) => unknown
-): (a: firebase.database.DataSnapshot | null, b?: string | null) => unknown => {
- return firebase.database()
- .ref(`${messengerPrefix}/subscriptions`)
- .on('value', cb);
+): ((a: firebase.database.DataSnapshot | null, b?: string | null) => unknown) => {
+ return firebase.database().ref(`${messengerPrefix}/subscriptions`).on('value', cb);
};
-export const getSubscriptions = (messengerPrefix: string) => async (): Promise => {
- const snapshot = await firebase.database().ref(`${messengerPrefix}/subscriptions`).once('value');
+export const getSubscriptions = (messengerPrefix: string) => async (): Promise<
+ SubscriptionStorage
+> => {
+ const snapshot = await firebase
+ .database()
+ .ref(`${messengerPrefix}/subscriptions`)
+ .once('value');
return snapshot.val() ?? {};
};
-export const getActiveSubscriptions = (messengerPrefix: string) => async (): Promise => {
- const snapshot = await firebase.database().ref(`${messengerPrefix}/subscriptions`).once('value');
- const subscriptionStorage: SubscriptionStorage | undefined = snapshot.val() as SubscriptionStorage;
+export const getActiveSubscriptions = (messengerPrefix: string) => async (): Promise<
+ SubscriptionStorage
+> => {
+ const snapshot = await firebase
+ .database()
+ .ref(`${messengerPrefix}/subscriptions`)
+ .once('value');
+ const subscriptionStorage:
+ | SubscriptionStorage
+ | undefined = snapshot.val() as SubscriptionStorage;
if (!subscriptionStorage) {
return {};
}
@@ -39,43 +51,54 @@ export const getActiveSubscriptions = (messengerPrefix: string) => async ():
for (const [chatId, userSubscription] of Object.entries(subscriptionStorage)) {
activeSubscriptions[chatId] = {
...userSubscription,
- subscriptionsOn: userSubscription?.subscriptionsOn?.filter((subscription: Subscription) => subscription.active)
+ subscriptionsOn: userSubscription?.subscriptionsOn?.filter(
+ (subscription: Subscription) => subscription.active
+ ),
};
}
return activeSubscriptions;
};
-export const getUserSubscription = (messengerPrefix: string) => async (chatId: number): Promise => {
- const snapshot = await firebase.database().ref(`${messengerPrefix}/subscriptions/${chatId}`).once('value');
+export const getUserSubscription = (messengerPrefix: string) => async (
+ chatId: number
+): Promise => {
+ const snapshot = await firebase
+ .database()
+ .ref(`${messengerPrefix}/subscriptions/${chatId}`)
+ .once('value');
return snapshot.val() ?? {};
};
-export const getActiveUserSubscription = (messengerPrefix: string) => async (chatId: number): Promise => {
- const snapshot = await firebase.database().ref(`${messengerPrefix}/subscriptions/${chatId}`).once('value');
+export const getActiveUserSubscription = (messengerPrefix: string) => async (
+ chatId: number
+): Promise => {
+ const snapshot = await firebase
+ .database()
+ .ref(`${messengerPrefix}/subscriptions/${chatId}`)
+ .once('value');
const userSubscription: UserSubscription = snapshot.val() as UserSubscription;
return {
...userSubscription,
- subscriptionsOn: userSubscription?.subscriptionsOn?.filter((sub: Subscription) => sub.active)
+ subscriptionsOn: userSubscription?.subscriptionsOn?.filter(
+ (sub: Subscription) => sub.active
+ ),
};
};
-export const setSubscription = (messengerPrefix: string) => async (
- {chat, subscriptionsOn}: UserSubscription
-): Promise => {
- return firebase.database()
- .ref(`${messengerPrefix}/subscriptions/${chat.id}`)
- .set(({
- chat,
- subscriptionsOn
- }))
+export const setSubscription = (messengerPrefix: string) => async ({
+ chat,
+ subscriptionsOn,
+}: UserSubscription): Promise => {
+ return firebase.database().ref(`${messengerPrefix}/subscriptions/${chat.id}`).set({
+ chat,
+ subscriptionsOn,
+ });
};
export const setQueryToAnalyse = (messengerPrefix: string) => async (
- message: TelegramMessage // I think it's OK to have this dependency here, we can have
+ message: TelegramBot.Message // I think it's OK to have this dependency here, we can have
// different messengers intersection here
): Promise => {
- return firebase.database()
- .ref(`${messengerPrefix}/analyse/${message.message_id}`)
- .set((message))
+ return firebase.database().ref(`${messengerPrefix}/analyse/${message.message_id}`).set(message);
};
diff --git a/server/src/services/domain/subscriptions.ts b/server/src/services/domain/subscriptions.ts
index c80dac7..8575aa0 100644
--- a/server/src/services/domain/subscriptions.ts
+++ b/server/src/services/domain/subscriptions.ts
@@ -1,34 +1,54 @@
-import {TelegramChat} from '../../bots/telegram/models';
-import {getCountriesSituation} from './covid19';
-import {Country} from '../../models/country.models';
-import {getTelegramUserSubscriptions, setTelegramSubscription} from '../../bots/telegram/services/storage';
-import {Subscription, SubscriptionType} from '../../models/subscription.models';
-import {catchAsyncError} from '../../utils/catchError';
-import {ALREADY_SUBSCRIBED_MESSAGE} from '../../messages/feature/subscribeMessages';
-import {CountrySituationInfo} from '../../models/covid19.models';
+import { getCountriesSituation } from './covid19';
+import { Country } from '../../models/country.models';
+import {
+ getTelegramUserSubscriptions,
+ setTelegramSubscription,
+} from '../../bots/telegram/services/storage';
+import {
+ Subscription,
+ SubscriptionType,
+} from '../../models/subscription.models';
+import { catchAsyncError } from '../../utils/catchError';
+import { ALREADY_SUBSCRIBED_MESSAGE } from '../../messages/feature/subscribeMessages';
+import { CountrySituationInfo } from '../../models/covid19.models';
+import * as TelegramBot from 'node-telegram-bot-api';
/*
@params
Assume subscribeMeOn is just country name (for now)
*/
-export const subscribeOn = async (chat: TelegramChat, subscribeMeOn: string): Promise => {
- const availableCountries: Array<[Country, Array]> = await getCountriesSituation();
+export const subscribeOn = async (
+ chat: TelegramBot.Chat,
+ subscribeMeOn: string
+): Promise => {
+ const availableCountries: Array<[
+ Country,
+ Array
+ ]> = await getCountriesSituation();
- const [subscribeMeOnCountry, countrySituations]: [Country, Array] = availableCountries
- .find(([country, _]: [Country, Array]) =>
- country.name.toLocaleLowerCase() === subscribeMeOn.toLocaleLowerCase());
+ const [subscribeMeOnCountry, countrySituations]: [
+ Country,
+ Array
+ ] = availableCountries.find(
+ ([country, _]: [Country, Array]) =>
+ country.name.toLocaleLowerCase() ===
+ subscribeMeOn.toLocaleLowerCase()
+ );
if (!subscribeMeOnCountry) {
- throw Error('Is not supported, yet')
+ throw Error('Is not supported, yet');
}
// TODO: Remove Telegram dependency
- const existingSubscriptions: Array = (await getTelegramUserSubscriptions(chat.id) ?? {})
- .subscriptionsOn ?? [];
+ const existingSubscriptions: Array =
+ ((await getTelegramUserSubscriptions(chat.id)) ?? {}).subscriptionsOn ??
+ [];
const checkIfAlreadySubscribed = existingSubscriptions
.filter((subscription: Subscription) => subscription.active)
- .find((subscription: Subscription) => subscription.value === subscribeMeOn);
+ .find(
+ (subscription: Subscription) => subscription.value === subscribeMeOn
+ );
if (!!checkIfAlreadySubscribed) {
// TODO: it's not actually error, re-write it be not an error
throw new Error(`${ALREADY_SUBSCRIBED_MESSAGE}`);
@@ -42,49 +62,65 @@ export const subscribeOn = async (chat: TelegramChat, subscribeMeOn: string): Pr
active: true,
type: SubscriptionType.Country,
value: subscribeMeOnCountry.name,
- lastReceivedData: countrySituations[countrySituations.length - 1],
+ lastReceivedData:
+ countrySituations[countrySituations.length - 1],
lastUpdate: Date.now(),
- }
- ]
+ },
+ ],
});
return subscribeMeOnCountry.name;
};
-export const unsubscribeMeFrom = async (chat: TelegramChat, unsubscribeMeFrom: string): Promise => {
+export const unsubscribeMeFrom = async (
+ chat: TelegramBot.Chat,
+ unsubscribeMeFrom: string
+): Promise => {
// TODO: Remove Telegram dependency
- const existingSubscriptions: Array = (await getTelegramUserSubscriptions(chat.id) ?? {})
- .subscriptionsOn ?? [];
+ const existingSubscriptions: Array =
+ ((await getTelegramUserSubscriptions(chat.id)) ?? {}).subscriptionsOn ??
+ [];
let foundSubscription: Subscription;
- const updatedSubscriptions: Array = existingSubscriptions
- .map((subscription: Subscription) => {
- if (subscription.value === unsubscribeMeFrom) {
+ const updatedSubscriptions: Array = existingSubscriptions.map(
+ (subscription: Subscription) => {
+ if (subscription.value.toLocaleLowerCase() === unsubscribeMeFrom) {
foundSubscription = subscription;
subscription.active = false;
}
return subscription;
- });
+ }
+ );
if (!foundSubscription) {
throw new Error('I was not able to find your subscription');
}
- const [err, result] = await catchAsyncError(setTelegramSubscription({
- chat,
- subscriptionsOn: updatedSubscriptions
- }));
+ const [err, result] = await catchAsyncError(
+ setTelegramSubscription({
+ chat,
+ subscriptionsOn: updatedSubscriptions,
+ })
+ );
if (err) {
- throw Error('Issue with Subscription service. Try later or drop us a message. Sorry for inconvenience');
+ throw Error(
+ 'Issue with Subscription service. Try later or drop us a message. Sorry for inconvenience'
+ );
}
return unsubscribeMeFrom;
};
export const isCountrySituationHasChangedSinceLastData = (
- {confirmed, deaths, recovered}: CountrySituationInfo,
- {confirmed: prevConfirmed, deaths: prevDeaths, recovered: prevRecovered}: CountrySituationInfo,
+ { confirmed, deaths, recovered }: CountrySituationInfo,
+ {
+ confirmed: prevConfirmed,
+ deaths: prevDeaths,
+ recovered: prevRecovered,
+ }: CountrySituationInfo
): boolean => {
- return confirmed !== prevConfirmed
- || deaths !== prevDeaths
- || recovered !== prevRecovered
+ return (
+ confirmed !== prevConfirmed ||
+ deaths !== prevDeaths ||
+ recovered !== prevRecovered
+ );
};
diff --git a/server/src/services/infrastructure/firebase.ts b/server/src/services/infrastructure/firebase.ts
index 9417137..3121d19 100644
--- a/server/src/services/infrastructure/firebase.ts
+++ b/server/src/services/infrastructure/firebase.ts
@@ -1,14 +1,14 @@
import * as firebase from 'firebase/app';
export const initFirebase = ({
- FIREBASE_API_KEY,
- FIREBASE_AUTHDOMAIN,
- FIREBASE_DATABASE_URL,
- FIREBASE_PROJECT_ID,
- FIREBASE_STORAGE_BUCKET,
- FIREBASE_MESSAGING_SENDER_ID,
- FIREBASE_APP_ID
- }): [Error, boolean] => {
+ FIREBASE_API_KEY,
+ FIREBASE_AUTHDOMAIN,
+ FIREBASE_DATABASE_URL,
+ FIREBASE_PROJECT_ID,
+ FIREBASE_STORAGE_BUCKET,
+ FIREBASE_MESSAGING_SENDER_ID,
+ FIREBASE_APP_ID,
+}): [Error, boolean] => {
try {
firebase.initializeApp({
apiKey: FIREBASE_API_KEY,
diff --git a/server/src/services/infrastructure/scheduler.ts b/server/src/services/infrastructure/scheduler.ts
index 905d75d..967b952 100644
--- a/server/src/services/infrastructure/scheduler.ts
+++ b/server/src/services/infrastructure/scheduler.ts
@@ -1,18 +1,16 @@
import * as schedule from 'node-schedule';
-import {tryToUpdateCovid19Cache} from '../domain/covid19';
-import {logger} from '../../utils/logger';
-import {LogglyTypes} from '../../models/loggly.models';
+import { tryToUpdateCovid19Cache } from '../domain/covid19';
+import { logger } from '../../utils/logger';
+import { LogglyTypes } from '../../models/loggly.models';
export const checkCovid19Updates = () => {
// Check covid19 info every hour (at hh:30 mins, e.g. 1:30, 2:30 ...)
schedule.scheduleJob('30 * * * *', () => {
- tryToUpdateCovid19Cache()
- .then(() => logger.log(
- 'info',
- {
- type: LogglyTypes.Covid19DataUpdateInfo,
- message: 'Covid19 cache updated',
- }
- ));
+ tryToUpdateCovid19Cache().then(() =>
+ logger.log('info', {
+ type: LogglyTypes.Covid19DataUpdateInfo,
+ message: 'Covid19 cache updated',
+ })
+ );
});
};
diff --git a/server/src/utils/featureHelpers/country.ts b/server/src/utils/featureHelpers/country.ts
index aa7f539..5f07ab9 100644
--- a/server/src/utils/featureHelpers/country.ts
+++ b/server/src/utils/featureHelpers/country.ts
@@ -1,6 +1,13 @@
-import {UpperCaseString, UserPresentationalCountryNameString} from '../../models/tsTypes.models';
+import {
+ UpperCaseString,
+ UserPresentationalCountryNameString,
+} from '../../models/tsTypes.models';
-const countriesExceptionMap: Map = new Map([
+const countriesExceptionMap: Map = new Map<
+ UpperCaseString,
+ string
+>([
+ ['UNITED STATES', 'United States'],
['US', 'United States'],
['USA', 'United States'],
['RUSSIAN FEDERATION', 'Russia'],
@@ -24,7 +31,12 @@ const countriesExceptionMap: Map = new Map
- countriesExceptionMap.has(country)
+export const getCountryNameFormat = (
+ country: UpperCaseString
+): UserPresentationalCountryNameString =>
+ countriesExceptionMap.has(country.toLocaleUpperCase())
? countriesExceptionMap.get(country)
- : country.slice(0, 1).toLocaleUpperCase().concat(country.slice(1).toLocaleLowerCase());
+ : country
+ .slice(0, 1)
+ .toLocaleUpperCase()
+ .concat(country.slice(1).toLocaleLowerCase());
diff --git a/server/src/utils/getErrorMessages.ts b/server/src/utils/getErrorMessages.ts
new file mode 100644
index 0000000..28eb1aa
--- /dev/null
+++ b/server/src/utils/getErrorMessages.ts
@@ -0,0 +1,4 @@
+export const getErrorMessage = ({ message, name, stack }: Error): string =>
+ `[ERROR] ${name}, ${message}, ${stack}`;
+
+export const getInfoMessage = (message: string): string => `[INFO] ${message}`;
diff --git a/server/src/utils/getLoggerMessages.ts b/server/src/utils/getLoggerMessages.ts
deleted file mode 100644
index 7127b46..0000000
--- a/server/src/utils/getLoggerMessages.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export const getErrorMessage = ({message, name, stack}: Error): string =>
- `[ERROR] ${name}, ${message}, ${stack}`;
-
-export const getInfoMessage = (message: string): string =>
- `[INFO] ${message}`;
diff --git a/server/src/utils/logger.ts b/server/src/utils/logger.ts
index 709a579..6554947 100644
--- a/server/src/utils/logger.ts
+++ b/server/src/utils/logger.ts
@@ -1,16 +1,16 @@
import * as winston from 'winston';
-import {Loggly} from 'winston-loggly-bulk';
+import { Loggly } from 'winston-loggly-bulk';
import environment from '../environments/environment';
-import {LogglyModels} from '../models/loggly.models';
-
if (environment.LOGGLY_TOKEN) {
- winston.add(new Loggly({
- token: environment.LOGGLY_TOKEN,
- subdomain: environment.LOGGLY_SUBDOMAIN,
- tags: environment.LOGGLY_TAGS,
- json: true
- }));
+ winston.add(
+ new Loggly({
+ token: environment.LOGGLY_TOKEN,
+ subdomain: environment.LOGGLY_SUBDOMAIN,
+ tags: environment.LOGGLY_TAGS,
+ json: true,
+ })
+ );
}
export const logger = {
@@ -20,5 +20,5 @@ export const logger = {
// tslint:disable-next-line:no-console
console.log(severity, message);
}
- }
+ },
};
diff --git a/server/src/utils/removeCommandFromMessageIfExist.ts b/server/src/utils/removeCommandFromMessageIfExist.ts
index 4447774..8dd3a7b 100644
--- a/server/src/utils/removeCommandFromMessageIfExist.ts
+++ b/server/src/utils/removeCommandFromMessageIfExist.ts
@@ -1,21 +1,9 @@
-import {isMessageStartsWithCommand} from './incomingMessages';
-import {getInfoMessage} from './getLoggerMessages';
-import {logger} from './logger';
-import {LogglyTypes} from '../models/loggly.models';
+import { isMessageStartsWithCommand } from './incomingMessages';
export const removeCommandFromMessageIfExist = (message: string, command: string): string => {
if (!isMessageStartsWithCommand(message)) {
- logger.log(
- 'info',
- {
- type: LogglyTypes.RemoveCommandFromMessageIfExistInfo,
- message: `${getInfoMessage(`Cannot remove command from ${message}`)}`,
- }
- );
return message;
}
- return message.includes(command)
- ? message.replace(command, '').trim()
- : message;
+ return message.includes(command) ? message.replace(command, '').trim() : message;
};
diff --git a/server/src/utils/textAfterCommand.ts b/server/src/utils/textAfterCommand.ts
index 51e4c61..a3f48c3 100644
--- a/server/src/utils/textAfterCommand.ts
+++ b/server/src/utils/textAfterCommand.ts
@@ -1 +1,2 @@
-export const textAfterUserCommand = (message: string): string => message.slice(message.indexOf(' ')).trim();
\ No newline at end of file
+export const textAfterUserCommand = (message: string): string =>
+ message.slice(message.indexOf(' ')).trim();