From 512f0e4f8d8665a46b23a3ade0a190fc50cea2fb Mon Sep 17 00:00:00 2001 From: Nevo David Date: Tue, 9 Jul 2024 17:35:51 +0700 Subject: [PATCH] feat: fix analytics --- .../src/api/routes/analytics.controller.ts | 76 ++++++++++++++----- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/apps/backend/src/api/routes/analytics.controller.ts b/apps/backend/src/api/routes/analytics.controller.ts index ab0571f6..d7eccbba 100644 --- a/apps/backend/src/api/routes/analytics.controller.ts +++ b/apps/backend/src/api/routes/analytics.controller.ts @@ -1,4 +1,12 @@ -import { Body, Controller, Get, Inject, Param, Post, Query } from '@nestjs/common'; +import { + Body, + Controller, + Get, + Inject, + Param, + Post, + Query, +} from '@nestjs/common'; import { Organization } from '@prisma/client'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; import { StarsService } from '@gitroom/nestjs-libraries/database/prisma/stars/stars.service'; @@ -61,23 +69,57 @@ export class AnalyticsController { throw new Error('Invalid integration'); } - if (getIntegration.type === 'social') { - const integrationProvider = this._integrationManager.getSocialIntegration( - getIntegration.providerIdentifier - ); - - const getIntegrationData = await ioRedis.get(`integration:${org.id}:${integration}:${date}`); - if (getIntegrationData) { - return JSON.parse(getIntegrationData) - } - - if (integrationProvider.analytics) { - const loadAnalytics = await integrationProvider.analytics(getIntegration.internalId, getIntegration.token, +date); - await ioRedis.set(`integration:${org.id}:${integration}:${date}`, JSON.stringify(loadAnalytics), 'EX', !process.env.NODE_ENV || process.env.NODE_ENV === 'development' ? 1 : 3600); - return loadAnalytics; - } - + if (getIntegration.type !== 'social') { return {}; } + + const integrationProvider = this._integrationManager.getSocialIntegration( + getIntegration.providerIdentifier + ); + + if (dayjs(getIntegration?.tokenExpiration).isBefore(dayjs())) { + const { accessToken, expiresIn, refreshToken } = + await integrationProvider.refreshToken(getIntegration.refreshToken!); + + await this._integrationService.createOrUpdateIntegration( + getIntegration.organizationId, + getIntegration.name, + getIntegration.picture!, + 'social', + getIntegration.internalId, + getIntegration.providerIdentifier, + accessToken, + refreshToken, + expiresIn + ); + + getIntegration.token = accessToken; + } + + const getIntegrationData = await ioRedis.get( + `integration:${org.id}:${integration}:${date}` + ); + if (getIntegrationData) { + return JSON.parse(getIntegrationData); + } + + if (integrationProvider.analytics) { + const loadAnalytics = await integrationProvider.analytics( + getIntegration.internalId, + getIntegration.token, + +date + ); + await ioRedis.set( + `integration:${org.id}:${integration}:${date}`, + JSON.stringify(loadAnalytics), + 'EX', + !process.env.NODE_ENV || process.env.NODE_ENV === 'development' + ? 1 + : 3600 + ); + return loadAnalytics; + } + + return {}; } }