From 21615d241334faaa02f5b6b17e336a89e80cb070 Mon Sep 17 00:00:00 2001
From: Yoan VALLET <ext.sopra.yvallet@grandlyon.com>
Date: Tue, 11 Jan 2022 09:12:32 +0000
Subject: [PATCH] fix: prevent duplicate konnector jobs

---
 src/components/Connection/ConnectionOAuth.tsx |  2 +-
 .../ConnectionOAuthNoPartnerAccount.tsx       |  4 +-
 .../ConnectionOAuthWithPartnerAccount.tsx     |  4 +-
 src/components/Connection/FormOAuth.tsx       | 20 ++---
 src/migrations/migration.data.ts              | 80 ++++++++++++++++++-
 5 files changed, 94 insertions(+), 16 deletions(-)

diff --git a/src/components/Connection/ConnectionOAuth.tsx b/src/components/Connection/ConnectionOAuth.tsx
index 28ae7b355..1bd69c164 100644
--- a/src/components/Connection/ConnectionOAuth.tsx
+++ b/src/components/Connection/ConnectionOAuth.tsx
@@ -86,7 +86,7 @@ const ConnectionOAuth: React.FC<ConnectionOAuthProps> = ({
   )
 
   const togglePartnerConnectionModal = useCallback(() => {
-    setOpenPartenerConnectionModal(prev => !prev)
+    setOpenPartenerConnectionModal((prev: boolean) => !prev)
   }, [])
 
   const handleEndSteps = useCallback(() => {
diff --git a/src/components/Connection/ConnectionOAuthNoPartnerAccount.tsx b/src/components/Connection/ConnectionOAuthNoPartnerAccount.tsx
index d58a27ef4..807e20753 100644
--- a/src/components/Connection/ConnectionOAuthNoPartnerAccount.tsx
+++ b/src/components/Connection/ConnectionOAuthNoPartnerAccount.tsx
@@ -2,7 +2,7 @@ import React from 'react'
 import { useI18n } from 'cozy-ui/transpiled/react/I18n'
 import './connectionOAuth.scss'
 import { Konnector } from 'models'
-import OAuthForm from 'components/Connection/FormOAuth'
+import FormOAuth from 'components/Connection/FormOAuth'
 import Button from '@material-ui/core/Button'
 
 interface ConnectionOAuthNoPartnerAccountProps {
@@ -49,7 +49,7 @@ const ConnectionOAuthNoPartnerAccount = ({
         {t('auth.' + `${konnectorSlug}` + '.no_account.subtitle2_info')}
       </div>
       <div className="koauthform-connect-button">
-        <OAuthForm
+        <FormOAuth
           konnector={konnector}
           onSuccess={handleSuccess}
           highlightedStyle={false}
diff --git a/src/components/Connection/ConnectionOAuthWithPartnerAccount.tsx b/src/components/Connection/ConnectionOAuthWithPartnerAccount.tsx
index 659b3c27b..c0d9bbb26 100644
--- a/src/components/Connection/ConnectionOAuthWithPartnerAccount.tsx
+++ b/src/components/Connection/ConnectionOAuthWithPartnerAccount.tsx
@@ -2,7 +2,7 @@ import React, { useCallback } from 'react'
 import { useI18n } from 'cozy-ui/transpiled/react/I18n'
 import './connectionOAuth.scss'
 import { Konnector } from 'models'
-import OAuthForm from 'components/Connection/FormOAuth'
+import FormOAuth from 'components/Connection/FormOAuth'
 import Button from '@material-ui/core/Button'
 
 interface ConnectionOAuthWithPartnerAccountProps {
@@ -37,7 +37,7 @@ const ConnectionOAuthWithPartnerAccount = ({
         {t('auth.' + konnectorSlug + '.with_account.subtitle1')}
       </div>
       <div className="koauthform-connect-button">
-        <OAuthForm
+        <FormOAuth
           konnector={konnector}
           onSuccess={handleSuccess}
           highlightedStyle={true}
diff --git a/src/components/Connection/FormOAuth.tsx b/src/components/Connection/FormOAuth.tsx
index 85843b5a6..f781844b7 100644
--- a/src/components/Connection/FormOAuth.tsx
+++ b/src/components/Connection/FormOAuth.tsx
@@ -27,25 +27,25 @@ const FormOAuth: React.FC<FormOAuthProps> = ({
   const client = useClient()
   const [status, setStatus] = useState<string>(IDLE)
 
-  const endOAuth = () => {
+  const endOAuth = useCallback(() => {
     setStatus(IDLE)
-  }
-  const startOAuth = () => {
+  }, [])
+
+  const startOAuth = useCallback(() => {
     setStatus(WAITING)
-  }
+  }, [])
+
   const handleAccountId = useCallback(
     (accountId: string) => {
       endOAuth()
       onSuccess(accountId)
     },
-    [onSuccess]
+    [endOAuth, onSuccess]
   )
-  const handleSubmit = () => {
-    startOAuth()
-  }
+
   const handleOAuthCancel = useCallback(() => {
     endOAuth()
-  }, [])
+  }, [endOAuth])
 
   const icon = getPartnerPicto(
     konnector ? konnector.slug : '',
@@ -60,7 +60,7 @@ const FormOAuth: React.FC<FormOAuthProps> = ({
     <>
       <Button
         aria-label={t('auth.accessibility.button_connect')}
-        onClick={handleSubmit}
+        onClick={startOAuth}
         disabled={isWaiting}
         classes={{
           root: `${
diff --git a/src/migrations/migration.data.ts b/src/migrations/migration.data.ts
index ec04ee686..8671b69e5 100644
--- a/src/migrations/migration.data.ts
+++ b/src/migrations/migration.data.ts
@@ -7,8 +7,10 @@ import {
   EGL_MONTH_DOCTYPE,
   EGL_YEAR_DOCTYPE,
   FLUIDPRICES_DOCTYPE,
+  ENEDIS_DAY_DOCTYPE,
+  GRDF_DAY_DOCTYPE,
 } from 'doctypes'
-import { Profile, ProfileType, UserChallenge } from 'models'
+import { DataloadEntity, Profile, ProfileType, UserChallenge } from 'models'
 import { Client } from 'cozy-client'
 import { DateTime } from 'luxon'
 import { UserQuizState } from 'enum/userQuiz.enum'
@@ -319,4 +321,80 @@ export const migrations: Migration[] = [
       })
     },
   },
+  {
+    baseSchemaVersion: 11,
+    targetSchemaVersion: 12,
+    appVersion: '1.6.1',
+    description: 'Corrects daily Enedis data.',
+    releaseNotes: null,
+    docTypes: ENEDIS_DAY_DOCTYPE,
+    queryOptions: {
+      scope: 'conso',
+      tag: 'day',
+      limit: 730,
+    },
+    run: async (_client: Client, docs: any[]): Promise<DataloadEntity[]> => {
+      let prevData: DataloadEntity = {
+        id: '',
+        day: 0,
+        hour: 0,
+        load: 0,
+        minute: 0,
+        month: 0,
+        year: 0,
+      }
+      return docs.map(doc => {
+        if (
+          prevData.day === doc.day &&
+          prevData.month === doc.month &&
+          prevData.year === doc.year
+        ) {
+          doc.deleteAction = true
+        }
+        if (doc.price) {
+          delete doc.price
+        }
+        prevData = doc
+        return doc
+      })
+    },
+  },
+  {
+    baseSchemaVersion: 12,
+    targetSchemaVersion: 13,
+    appVersion: '1.6.1',
+    description: 'Corrects daily GRDF data.',
+    releaseNotes: null,
+    docTypes: GRDF_DAY_DOCTYPE,
+    queryOptions: {
+      scope: 'conso',
+      tag: 'day',
+      limit: 730,
+    },
+    run: async (_client: Client, docs: any[]): Promise<DataloadEntity[]> => {
+      let prevData: DataloadEntity = {
+        id: '',
+        day: 0,
+        hour: 0,
+        load: 0,
+        minute: 0,
+        month: 0,
+        year: 0,
+      }
+      return docs.map(doc => {
+        if (
+          prevData.day === doc.day &&
+          prevData.month === doc.month &&
+          prevData.year === doc.year
+        ) {
+          doc.deleteAction = true
+        }
+        if (doc.price) {
+          delete doc.price
+        }
+        prevData = doc
+        return doc
+      })
+    },
+  },
 ]
-- 
GitLab