diff --git a/tsconfig.json b/tsconfig.json index f27c76f..e9efea9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,10 +19,11 @@ } ], "paths": { - "@app/*": ["./app/*"], + "@anthropic": ["./utils/anthropicClient.ts"], "@components/*": ["./components/*"], "@utils/*": ["./utils/*"], "@consumer/*": ["./utils/consumer/*"], + "@prisma": ["./prisma/prisma"], "@purchases/*": ["./utils/purchases/*"] } }, diff --git a/utils/consumer/store.ts b/utils/consumer/store.ts index 2979cda..61ea383 100644 --- a/utils/consumer/store.ts +++ b/utils/consumer/store.ts @@ -1,23 +1,15 @@ import 'dotenv/config'; import { Consumer, consumerSchema } from './types'; import { Tool } from './tool'; -import { BaseTool, makeRequest } from '../anthropicClient'; +import { BaseTool, makeRequest } from '@anthropic'; import { generatePrompt } from './prompt'; import { generateConsumerSeed } from '@utils/generateConsumerSeed'; -import prisma from '../../prisma/prisma'; +import prisma from '@prisma'; export async function generate() { const { letters, birthday, zipCode } = generateConsumerSeed(); - const newConsumer = await prisma.consumer.create({ - data: { - letters, - birthday: birthday.toDate(), - zipCode - } - }); - - console.info(`New consumer being generated with id ${newConsumer.id}`); + console.info(`New consumer being generated`); const prompt = generatePrompt(letters, birthday, zipCode); @@ -32,11 +24,11 @@ export async function generate() { console.info('Generated consumer by Anthropic', validConsumer.data); - await prisma.consumer.update({ - where: { - id: newConsumer.id - }, + const newConsumer = await prisma.consumer.create({ data: { + letters, + birthday: birthday.toDate(), + zipCode, value: validConsumer.data } }); diff --git a/utils/purchases/prompt.ts b/utils/purchases/prompt.ts index 74d9f52..bc728d4 100644 --- a/utils/purchases/prompt.ts +++ b/utils/purchases/prompt.ts @@ -1,4 +1,4 @@ -import { ExerciseActivity, Consumer, SocialActivity } from '../consumer/types'; +import { ExerciseActivity, Consumer, SocialActivity } from '@consumer/types'; import { getWeekRanges, isDateInRange } from '../dateFunctions'; function formatCategories( diff --git a/utils/purchases/store.ts b/utils/purchases/store.ts index 024b8ab..3f86507 100644 --- a/utils/purchases/store.ts +++ b/utils/purchases/store.ts @@ -1,9 +1,9 @@ import { PurchaseList, purchaseListSchema } from './types'; import { Tool } from './tool'; -import { BaseTool, makeRequest } from '../anthropicClient'; +import { BaseTool, makeRequest } from '@anthropic'; import { generatePrompt } from './prompt'; -import { Consumer } from '../consumer/types'; -import prisma from '../../prisma/prisma'; +import { Consumer } from '@consumer/types'; +import prisma from '@prisma'; export async function generate( id: number | undefined, @@ -17,29 +17,8 @@ export async function generate( parseInt(process.env.NUMBER_OF_WEEKS ?? '4') ); - const consumer = id - ? await prisma.consumer.update({ - where: { - id - }, - data: { - editedValue: editedConsumer - } - }) - : await prisma.consumer.create({ - data: { - editedValue: editedConsumer - } - }); - - const newPurchaseList = await prisma.purchaseList.create({ - data: { - consumerId: consumer.id - } - }); - console.info( - `Generating purchase list with id ${newPurchaseList.id} for consumer with id ${consumer.id}` + `Generating new purchase list for consumer with id ${id ?? 'N/A'}` ); try { @@ -58,21 +37,33 @@ export async function generate( (acc, week) => acc + week.purchases.length, 0 ); + console.info( - `Generated ${totalPurchases} purchases for purchase list with id ${newPurchaseList.id} for consumer wth id ${id}` + `Generated ${totalPurchases} purchases for new purchase list for consumer wth id ${id}` ); - await prisma.purchaseList.update({ - where: { - id: newPurchaseList.id - }, - data: { - value: validPurchases.data - } + const [consumer, purchaseList] = await prisma.$transaction(async tx => { + const consumer = id + ? await tx.consumer.update({ + where: { id }, + data: { editedValue: editedConsumer } + }) + : await tx.consumer.create({ + data: { editedValue: editedConsumer } + }); + + const purchaseList = await tx.purchaseList.create({ + data: { + consumerId: consumer.id, + value: validPurchases.data + } + }); + + return [consumer, purchaseList]; }); console.info( - `Purchase list with id ${newPurchaseList.id} for consumer with id ${id} stored in database.` + `Purchase list with id ${purchaseList.id} for consumer with id ${consumer.id} stored in database.` ); return validPurchases.data; diff --git a/utils/rateLimiter.ts b/utils/rateLimiter.ts index f65e497..39431b0 100644 --- a/utils/rateLimiter.ts +++ b/utils/rateLimiter.ts @@ -1,4 +1,4 @@ -import prisma from '../prisma/prisma'; +import prisma from '@prisma'; export async function rateLimiter() { if (!process.env.RATE_LIMIT) { @@ -7,21 +7,24 @@ export async function rateLimiter() { const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000); - const consumersCount = await prisma.consumer.count({ - where: { - createdAt: { - gt: yesterday + const count = await prisma.$transaction(async tx => { + const consumersCount = await tx.consumer.count({ + where: { + createdAt: { + gt: yesterday + } } - } + }); + + const purchaseListsCount = await tx.purchaseList.count({ + where: { + createdAt: { + gt: yesterday + } + } + }); + return consumersCount + purchaseListsCount; }); - const purchaseListsCount = await prisma.purchaseList.count({ - where: { - createdAt: { - gt: yesterday - } - } - }); - - return consumersCount + purchaseListsCount > parseInt(process.env.RATE_LIMIT); + return count > parseInt(process.env.RATE_LIMIT); }