diff --git a/packages/api/src/apollo.ts b/packages/api/src/apollo.ts index 0326ec95a..b2c748921 100644 --- a/packages/api/src/apollo.ts +++ b/packages/api/src/apollo.ts @@ -29,7 +29,10 @@ import { logger } from './utils/logger' import { ReadingProgressDataSource } from './datasources/reading_progress_data_source' import { createPrometheusExporterPlugin } from '@bmatei/apollo-prometheus-exporter' import { ApolloServerPlugin } from 'apollo-server-plugin-base' -import { countDailyServiceUsage } from './services/service_usage' +import { + countDailyServiceUsage, + createServiceUsage, +} from './services/service_usage' const signToken = promisify(jwt.sign) const pubsub = createPubSubClient() @@ -135,6 +138,21 @@ export function makeApolloServer(app: Express): ApolloServer { throw new Error('You have reached the daily email limit') } } + + return { + // track usage of the API + async willSendResponse(requestContext) { + // if the request was successful, increment the user's email sent count + if ( + userId && + query?.includes(action) && + !requestContext.response.errors && + !requestContext.response.data?.replyToEmail?.errorCodes + ) { + await createServiceUsage(userId, action) + } + }, + } }, } } diff --git a/packages/api/src/services/service_usage.ts b/packages/api/src/services/service_usage.ts index 9d4ada1d8..454f3d9a9 100644 --- a/packages/api/src/services/service_usage.ts +++ b/packages/api/src/services/service_usage.ts @@ -20,3 +20,12 @@ export const countDailyServiceUsage = async ( }) ) } + +export const createServiceUsage = async (userId: string, action: string) => { + return authTrx((tx) => + tx.withRepository(repo).save({ + user: { id: userId }, + action, + }) + ) +}