From f8150a1901fcdc5d2c393a138e435f5bc327fac2 Mon Sep 17 00:00:00 2001 From: Yoan Vallet <ext.sopra.yvallet@grandlyon.com> Date: Fri, 18 Dec 2020 19:35:08 +0100 Subject: [PATCH] feat: add connection information to fluidStatus --- src/components/Home/OldFluidDataModal.tsx | 4 +- src/enum/fluid.enum.ts | 8 +++ src/models/fluid.model.ts | 14 +++- src/services/fluid.service.ts | 86 +++++++++++++++++++---- src/store/global/global.reducer.ts | 37 ++++++++-- 5 files changed, 125 insertions(+), 24 deletions(-) diff --git a/src/components/Home/OldFluidDataModal.tsx b/src/components/Home/OldFluidDataModal.tsx index ad990fc26..5f99a53e7 100644 --- a/src/components/Home/OldFluidDataModal.tsx +++ b/src/components/Home/OldFluidDataModal.tsx @@ -7,7 +7,7 @@ import StyledButton from 'components/CommonKit/Button/StyledButton' import StyledStopButton from 'components/CommonKit/Button/StyledStopButton' import { Redirect } from 'react-router-dom' -import { FluidType } from 'enum/fluid.enum' +import { FluidState, FluidType } from 'enum/fluid.enum' import { FluidStatus } from 'models' import './oldFluidDataModal.scss' interface OldFluidDataModalProps { @@ -32,7 +32,7 @@ const OldFluidDataModal: React.FC<OldFluidDataModalProps> = ({ fluidStatus && fluidStatus.length > 0 && fluidStatus.forEach(fluid => { - if (fluid.status === 'errored') { + if (fluid.status === FluidState.ERRORED) { !erroredKonnectors.includes(fluid.fluidType) && erroredKonnectors.push(fluid.fluidType) } diff --git a/src/enum/fluid.enum.ts b/src/enum/fluid.enum.ts index 5b67cbf00..8762474bb 100644 --- a/src/enum/fluid.enum.ts +++ b/src/enum/fluid.enum.ts @@ -4,3 +4,11 @@ export enum FluidType { GAS = 2, MULTIFLUID = 3, } + +export enum FluidState { + NO_KONNECTOR = 0, + NOT_CONNECTED = 1, + LOGIN_FAILED = 100, + DONE = 200, + ERRORED = 300, +} diff --git a/src/models/fluid.model.ts b/src/models/fluid.model.ts index 99fe18beb..ac34e8077 100644 --- a/src/models/fluid.model.ts +++ b/src/models/fluid.model.ts @@ -1,8 +1,18 @@ import { DateTime } from 'luxon' -import { FluidType } from 'enum/fluid.enum' +import { FluidState, FluidType } from 'enum/fluid.enum' +import { Konnector, Trigger, Account } from 'models' +interface FluidConnection { + type: string + slug: string + isConnectionOnGoing: boolean + konnector: Konnector | null + account: Account | null + trigger: Trigger | null +} export interface FluidStatus { fluidType: FluidType - status: string | null + status: FluidState lastDataDate: DateTime | null + connection: FluidConnection } diff --git a/src/services/fluid.service.ts b/src/services/fluid.service.ts index b96649c41..3a102b469 100644 --- a/src/services/fluid.service.ts +++ b/src/services/fluid.service.ts @@ -1,12 +1,13 @@ -import { FluidType } from 'enum/fluid.enum' +import { FluidState, FluidType } from 'enum/fluid.enum' import { Client } from 'cozy-client' -import { FluidStatus } from 'models' +import { Account, FluidStatus, Konnector, Trigger, TriggerState } from 'models' import ConfigService from 'services/fluidConfig.service' import KonnectorService from 'services/konnector.service' import ConsumptionService from 'services/consumption.service' import AccountService from 'services/account.service' import TriggerService from 'services/triggers.service' +import { DateTime } from 'luxon' export default class FluidService { private _client: Client @@ -15,10 +16,36 @@ export default class FluidService { this._client = _client } + private parseFluidStatus = ( + konnector: Konnector | null, + state: TriggerState | null + ): FluidState => { + if (konnector) { + if (state) { + switch (state.status) { + case 'done': + return FluidState.DONE + case 'errored': + return FluidState.ERRORED + default: + return FluidState.NOT_CONNECTED + } + } else { + return FluidState.NOT_CONNECTED + } + } else { + return FluidState.NO_KONNECTOR + } + } + public getFluidStatus = async (): Promise<FluidStatus[]> => { const fluidConfig = new ConfigService().getFluidConfig() const accountService = new AccountService(this._client) - const [elecAccount, gasAccount, waterAccount] = await Promise.all([ + const [ + elecAccount, + gasAccount, + waterAccount, + ]: (Account | null)[] = await Promise.all([ accountService.getAccountByType( fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug ), @@ -30,7 +57,11 @@ export default class FluidService { ), ]) const konnectorService = new KonnectorService(this._client) - const [elecKonnector, gasKonnector, waterKonnector] = await Promise.all([ + const [ + elecKonnector, + gasKonnector, + waterKonnector, + ]: (Konnector | null)[] = await Promise.all([ konnectorService.getKonnector( fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug ), @@ -42,7 +73,11 @@ export default class FluidService { ), ]) const triggerService = new TriggerService(this._client) - const [elecTrigger, waterTrigger, gasTrigger] = await Promise.all([ + const [ + elecTrigger, + waterTrigger, + gasTrigger, + ]: (Trigger | null)[] = await Promise.all([ elecAccount && elecKonnector ? triggerService.getTrigger(elecAccount, elecKonnector) : null, @@ -58,32 +93,53 @@ export default class FluidService { elecStatus, waterStatus, gasStatus, - lastDataDates, - ] = await Promise.all([ + ]: (TriggerState | null)[] = await Promise.all([ elecTrigger ? triggerService.fetchTriggerState(elecTrigger) : null, waterTrigger ? triggerService.fetchTriggerState(waterTrigger) : null, gasTrigger ? triggerService.fetchTriggerState(gasTrigger) : null, - consumptionService.fetchAllLastDateData([ - FluidType.ELECTRICITY, - FluidType.WATER, - FluidType.GAS, - ]), ]) + const lastDataDates: (DateTime | null)[] = await consumptionService.fetchAllLastDateData( + [FluidType.ELECTRICITY, FluidType.WATER, FluidType.GAS] + ) const result: FluidStatus[] = [ { fluidType: FluidType.ELECTRICITY, - status: elecStatus ? elecStatus.status : null, + status: this.parseFluidStatus(elecKonnector, elecStatus), lastDataDate: lastDataDates[FluidType.ELECTRICITY], + connection: { + type: fluidConfig[FluidType.ELECTRICITY].konnectorConfig.type, + slug: fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug, + isConnectionOnGoing: false, + konnector: elecKonnector, + account: elecAccount, + trigger: elecTrigger, + }, }, { fluidType: FluidType.WATER, - status: waterStatus ? waterStatus.status : null, + status: this.parseFluidStatus(waterKonnector, waterStatus), lastDataDate: lastDataDates[FluidType.WATER], + connection: { + type: fluidConfig[FluidType.WATER].konnectorConfig.type, + slug: fluidConfig[FluidType.WATER].konnectorConfig.slug, + isConnectionOnGoing: false, + konnector: waterKonnector, + account: waterAccount, + trigger: waterTrigger, + }, }, { fluidType: FluidType.GAS, - status: gasStatus ? gasStatus.status : null, + status: this.parseFluidStatus(gasKonnector, gasStatus), lastDataDate: lastDataDates[FluidType.GAS], + connection: { + type: fluidConfig[FluidType.GAS].konnectorConfig.type, + slug: fluidConfig[FluidType.GAS].konnectorConfig.slug, + isConnectionOnGoing: false, + konnector: gasKonnector, + account: gasAccount, + trigger: gasTrigger, + }, }, ] return result diff --git a/src/store/global/global.reducer.ts b/src/store/global/global.reducer.ts index 748b3eef1..89148cca3 100644 --- a/src/store/global/global.reducer.ts +++ b/src/store/global/global.reducer.ts @@ -8,7 +8,7 @@ import { } from 'store/global/global.actions' import { FluidStatus, GlobalState } from 'models' import { ScreenType } from 'enum/screen.enum' -import { FluidType } from 'enum/fluid.enum' +import { FluidState, FluidType } from 'enum/fluid.enum' const initialState: GlobalState = { screenType: ScreenType.MOBILE, @@ -17,18 +17,42 @@ const initialState: GlobalState = { fluidStatus: [ { fluidType: FluidType.ELECTRICITY, - status: null, + status: FluidState.NO_KONNECTOR, lastDataDate: null, + connection: { + type: '', + slug: '', + isConnectionOnGoing: false, + konnector: null, + account: null, + trigger: null, + }, }, { fluidType: FluidType.WATER, - status: null, + status: FluidState.NO_KONNECTOR, lastDataDate: null, + connection: { + type: '', + slug: '', + isConnectionOnGoing: false, + konnector: null, + account: null, + trigger: null, + }, }, { fluidType: FluidType.GAS, - status: null, + status: FluidState.NO_KONNECTOR, lastDataDate: null, + connection: { + type: '', + slug: '', + isConnectionOnGoing: false, + konnector: null, + account: null, + trigger: null, + }, }, ], fluidTypes: [], @@ -37,7 +61,10 @@ const initialState: GlobalState = { const getFluidTypesFromStatus = (fluidStatus: FluidStatus[]): FluidType[] => { const fluidTypes: FluidType[] = [] fluidStatus.forEach(fluid => { - if (fluid.status) { + if ( + fluid.status !== FluidState.NOT_CONNECTED && + fluid.status !== FluidState.NEVER_RAN + ) { fluidTypes.push(fluid.fluidType) } }) -- GitLab