diff --git a/src/components/Connection/ConnectionResult.tsx b/src/components/Connection/ConnectionResult.tsx index dfccf4c755655b7892a759ba0f9998b365a1d78d..f6113b4e05e537d6e11a141fc7404f69b2296ed6 100644 --- a/src/components/Connection/ConnectionResult.tsx +++ b/src/components/Connection/ConnectionResult.tsx @@ -4,7 +4,7 @@ import { useClient } from 'cozy-client' import { useDispatch } from 'react-redux' import { updatedFluidConnection } from 'store/global/global.actions' -import { Account, FluidConnection, FluidStatus } from 'models' +import { Account, FluidConnection, FluidStatus, Trigger } from 'models' import AccountService from 'services/account.service' import { getKonnectorUpdateError } from 'utils/utils' @@ -14,10 +14,10 @@ import Button from '@material-ui/core/Button' import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner' import './connectionResult.scss' -import UsageEventService from 'services/usageEvent.service' import DateChartService from 'services/dateChart.service' import { FluidState, FluidType } from 'enum/fluid.enum' import { DateTime } from 'luxon' +import TriggerService from 'services/triggers.service' interface ConnectionResultProps { fluidStatus: FluidStatus @@ -57,12 +57,22 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ setUpdating(false) } - const deleteAccount = async () => { + const deleteAccountsAndTriggers = async () => { setUpdating(true) try { if (account) { const accountService = new AccountService(client) - await accountService.deleteAccount(account) + const triggerService = new TriggerService(client) + const accounts: Account[] = await accountService.getAccountsByType( + account.account_type + ) + for (const _account of accounts) { + const trigger: Trigger | null = await triggerService.getTriggerForAccount( + _account + ) + if (trigger) await triggerService.deleteTrigger(trigger) + await accountService.deleteAccount(_account) + } await handleAccountDeletion() } } catch (error) { @@ -211,7 +221,7 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ <div className="inline-buttons"> <Button aria-label={t('konnector_form.accessibility.button_delete')} - onClick={deleteAccount} + onClick={deleteAccountsAndTriggers} disabled={updating} classes={{ root: 'btn-secondary-positive', diff --git a/src/services/account.service.spec.ts b/src/services/account.service.spec.ts index ff8001fcea6fca76b45557640f59740d89cfcec4..319d86144931e812fc47053dbcdfde031c945f3a 100644 --- a/src/services/account.service.spec.ts +++ b/src/services/account.service.spec.ts @@ -5,10 +5,10 @@ import mockClient from '../../tests/__mocks__/client' import AccountService from './account.service' import { accountsData } from '../../tests/__mocks__/accountsData.mock' import { konnectorsData } from '../../tests/__mocks__/konnectorsData.mock' +import { triggersEnedisData } from '../../tests/__mocks__/triggersData.mock' jest.mock('cozy-harvest-lib/dist/connections/accounts') import * as harvestLibAccounts from 'cozy-harvest-lib/dist/connections/accounts' -import { triggersEnedisData } from '../../tests/__mocks__/triggersData.mock' const mockHavestLibAccounts = harvestLibAccounts as jest.Mocked< typeof harvestLibAccounts > @@ -105,6 +105,24 @@ describe('Account service', () => { }) }) + describe('getAccountsByType method', () => { + it('should return all accounts for a type when several account', async () => { + const mockType = 'enedisgrandlyon' + const mockAccounts = accountsData + mockAccounts[1].account_type = mockType + mockAccounts[2].account_type = mockType + const mockQueryResult: QueryResult<Account[]> = { + data: [...mockAccounts], + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValueOnce(mockQueryResult) + const result = await accountService.getAccountsByType(mockType) + expect(result).toEqual(mockAccounts) + }) + }) + describe('updateAccount method', () => { it('should return updated account when updateAccount successfully', async () => { mockHavestLibAccounts.updateAccount.mockResolvedValueOnce(accountsData[2]) diff --git a/src/services/account.service.ts b/src/services/account.service.ts index c6969d61926b82233bbcc030c0db6878382004bb..e5845eb0aa8ccca35f14711fb8be6265d3b49e30 100644 --- a/src/services/account.service.ts +++ b/src/services/account.service.ts @@ -95,6 +95,16 @@ export default class AccountService { } } + public async getAccountsByType(type: string): Promise<Account[]> { + const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) + // eslint-disable-next-line @typescript-eslint/camelcase + .where({ account_type: type }) + const { data: accounts }: QueryResult<Account[]> = await this._client.query( + query + ) + return accounts + } + public async updateAccount(account: Account): Promise<Account> { try { const updatedAccount: Account = await updateAccount(this._client, account) diff --git a/src/services/triggers.service.spec.ts b/src/services/triggers.service.spec.ts index 8511b0084e285b402bb5d5d4fe86bb7517f8f757..439571a4ef7680fdb5ab277443e6b5967f1edd59 100644 --- a/src/services/triggers.service.spec.ts +++ b/src/services/triggers.service.spec.ts @@ -130,4 +130,21 @@ describe('TriggerService service', () => { } }) }) + + describe('deleteTrigger method', () => { + it('should return true when destroy successfully', async () => { + mockClient.destroy.mockRejectedValueOnce(true) + const result = await triggerService.deleteTrigger(triggersData[0]) + expect(result).toBe(true) + }) + + it('should throw error when destroy unsuccessfully', async () => { + mockClient.destroy.mockRejectedValueOnce(new Error()) + try { + await triggerService.deleteTrigger(triggersData[0]) + } catch (error) { + expect(error).toEqual(new Error('Delete trigger failed')) + } + }) + }) }) diff --git a/src/services/triggers.service.ts b/src/services/triggers.service.ts index 03ed174705fa044b5da5aa47295f0299cc9473bd..fae71f7d70999a8ab541182628d46b007dc6c559 100644 --- a/src/services/triggers.service.ts +++ b/src/services/triggers.service.ts @@ -89,4 +89,14 @@ export default class TriggerService { throw new Error('Fetch trigger state failed') } } + + public async deleteTrigger(trigger: Trigger): Promise<boolean> { + try { + await this._client.destroy(trigger) + return true + } catch (error) { + console.log(error) + throw new Error('Delete trigger failed') + } + } }