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