From a8fd31320a8a49cf35af29d87c2498188ef302a6 Mon Sep 17 00:00:00 2001 From: gcarron <gcarron@grandlyon.com> Date: Tue, 10 May 2022 14:17:54 +0200 Subject: [PATCH] fix(accounts): Prevent account doctype index to crash the first konnector init --- src/components/Splash/SplashRoot.tsx | 9 ++- src/services/account.service.ts | 102 +++++++++++++++------------ 2 files changed, 60 insertions(+), 51 deletions(-) diff --git a/src/components/Splash/SplashRoot.tsx b/src/components/Splash/SplashRoot.tsx index 06d2bb29c..8a7c4db88 100644 --- a/src/components/Splash/SplashRoot.tsx +++ b/src/components/Splash/SplashRoot.tsx @@ -110,10 +110,7 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { setinitStep, setinitStepErrors ) - const partnersInfoService = new PartnersInfoService( - client, - setinitStepErrors - ) + const partnersInfoService = new PartnersInfoService(client) const ms = new MigrationService(client, setinitStepErrors) try { const migrationsResult: ReleaseNotes = await ms.runMigrations( @@ -263,7 +260,9 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { } // Check partnersInfo from backoffice - const partnersInfo: PartnersInfo = await partnersInfoService.getPartnersInfo() + const partnersInfo: + | PartnersInfo + | undefined = await partnersInfoService.getPartnersInfo() // Get last partnersIssueDate const today = DateTime.local() diff --git a/src/services/account.service.ts b/src/services/account.service.ts index c76ea851d..17f756396 100644 --- a/src/services/account.service.ts +++ b/src/services/account.service.ts @@ -53,58 +53,68 @@ export default class AccountService { } public async getAccountByType(type: string): Promise<Account | null> { - const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) - // eslint-disable-next-line @typescript-eslint/camelcase - .where({ account_type: type }) - .indexFields(['account_type']) - const { data: accounts }: QueryResult<Account[]> = await this._client.query( - query - ) - if (accounts.length > 1) { - // If several account are found we will used trigger date to select the older - const triggerService = new TriggerService(this._client) - const triggers: (Trigger | null)[] = await Promise.all( - accounts.map((_account: Account) => - triggerService.getTriggerForAccount(_account) + try { + const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) + // eslint-disable-next-line @typescript-eslint/camelcase + .where({ account_type: type }) + // .indexFields(['account_type']) + const { + data: accounts, + }: QueryResult<Account[]> = await this._client.query(query) + if (accounts.length > 1) { + // If several account are found we will used trigger date to select the older + const triggerService = new TriggerService(this._client) + const triggers: (Trigger | null)[] = await Promise.all( + accounts.map((_account: Account) => + triggerService.getTriggerForAccount(_account) + ) ) - ) - // Keep the accountid which have the older trigger - let olderDate: DateTime = DateTime.now() - let olderAccountId: string | null = null - for (const _trigger of triggers) { - if ( - _trigger && - _trigger.cozyMetadata && - _trigger.cozyMetadata.createdAt && - DateTime.fromISO(_trigger.cozyMetadata.createdAt, { - zone: 'utc', - }) < olderDate - ) { - olderDate = DateTime.fromISO(_trigger.cozyMetadata.createdAt, { - zone: 'utc', - }) - olderAccountId = _trigger.message.account + // Keep the accountid which have the older trigger + let olderDate: DateTime = DateTime.now() + let olderAccountId: string | null = null + for (const _trigger of triggers) { + if ( + _trigger && + _trigger.cozyMetadata && + _trigger.cozyMetadata.createdAt && + DateTime.fromISO(_trigger.cozyMetadata.createdAt, { + zone: 'utc', + }) < olderDate + ) { + olderDate = DateTime.fromISO(_trigger.cozyMetadata.createdAt, { + zone: 'utc', + }) + olderAccountId = _trigger.message.account + } } + // Retrieve the accountId and return it + const filteredAccounts: Account[] = accounts.filter( + _account => _account._id === olderAccountId + ) + return filteredAccounts[0] ? filteredAccounts[0] : null + } else { + return accounts[0] ? accounts[0] : null } - // Retrieve the accountId and return it - const filteredAccounts: Account[] = accounts.filter( - _account => _account._id === olderAccountId - ) - return filteredAccounts[0] ? filteredAccounts[0] : null - } else { - return accounts[0] ? accounts[0] : null + } catch (err) { + console.error(`Error GetAccountByType: ${err}`) + return null } } public async getAccountsByType(type: string): Promise<Account[]> { - const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) - // eslint-disable-next-line @typescript-eslint/camelcase - .where({ account_type: type }) - .indexFields(['account_type']) - const { data: accounts }: QueryResult<Account[]> = await this._client.query( - query - ) - return accounts + try { + const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) + // eslint-disable-next-line @typescript-eslint/camelcase + .where({ account_type: type }) + // .indexFields(['account_type']) + const { + data: accounts, + }: QueryResult<Account[]> = await this._client.query(query) + return accounts + } catch (err) { + console.error(`Error: GetAccountsByType: ${err}`) + return [] + } } public async updateAccount(account: Account): Promise<Account> { @@ -131,7 +141,7 @@ export default class AccountService { const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) // eslint-disable-next-line @typescript-eslint/camelcase .where({ account_type: 'index' }) - .indexFields(['account_type']) + // .indexFields(['account_type']) .limitBy(1) const { data: result }: QueryResult<[]> = await this._client.query(query) return result -- GitLab