chore: query optimization

This commit is contained in:
2024-12-08 10:17:25 +01:00
parent a91c4d56b0
commit b154474075
5 changed files with 53 additions and 66 deletions

View File

@@ -19,10 +19,11 @@
} }
], ],
"paths": { "paths": {
"@app/*": ["./app/*"], "@anthropic": ["./utils/anthropicClient.ts"],
"@components/*": ["./components/*"], "@components/*": ["./components/*"],
"@utils/*": ["./utils/*"], "@utils/*": ["./utils/*"],
"@consumer/*": ["./utils/consumer/*"], "@consumer/*": ["./utils/consumer/*"],
"@prisma": ["./prisma/prisma"],
"@purchases/*": ["./utils/purchases/*"] "@purchases/*": ["./utils/purchases/*"]
} }
}, },

View File

@@ -1,23 +1,15 @@
import 'dotenv/config'; import 'dotenv/config';
import { Consumer, consumerSchema } from './types'; import { Consumer, consumerSchema } from './types';
import { Tool } from './tool'; import { Tool } from './tool';
import { BaseTool, makeRequest } from '../anthropicClient'; import { BaseTool, makeRequest } from '@anthropic';
import { generatePrompt } from './prompt'; import { generatePrompt } from './prompt';
import { generateConsumerSeed } from '@utils/generateConsumerSeed'; import { generateConsumerSeed } from '@utils/generateConsumerSeed';
import prisma from '../../prisma/prisma'; import prisma from '@prisma';
export async function generate() { export async function generate() {
const { letters, birthday, zipCode } = generateConsumerSeed(); const { letters, birthday, zipCode } = generateConsumerSeed();
const newConsumer = await prisma.consumer.create({ console.info(`New consumer being generated`);
data: {
letters,
birthday: birthday.toDate(),
zipCode
}
});
console.info(`New consumer being generated with id ${newConsumer.id}`);
const prompt = generatePrompt(letters, birthday, zipCode); const prompt = generatePrompt(letters, birthday, zipCode);
@@ -32,11 +24,11 @@ export async function generate() {
console.info('Generated consumer by Anthropic', validConsumer.data); console.info('Generated consumer by Anthropic', validConsumer.data);
await prisma.consumer.update({ const newConsumer = await prisma.consumer.create({
where: {
id: newConsumer.id
},
data: { data: {
letters,
birthday: birthday.toDate(),
zipCode,
value: validConsumer.data value: validConsumer.data
} }
}); });

View File

@@ -1,4 +1,4 @@
import { ExerciseActivity, Consumer, SocialActivity } from '../consumer/types'; import { ExerciseActivity, Consumer, SocialActivity } from '@consumer/types';
import { getWeekRanges, isDateInRange } from '../dateFunctions'; import { getWeekRanges, isDateInRange } from '../dateFunctions';
function formatCategories( function formatCategories(

View File

@@ -1,9 +1,9 @@
import { PurchaseList, purchaseListSchema } from './types'; import { PurchaseList, purchaseListSchema } from './types';
import { Tool } from './tool'; import { Tool } from './tool';
import { BaseTool, makeRequest } from '../anthropicClient'; import { BaseTool, makeRequest } from '@anthropic';
import { generatePrompt } from './prompt'; import { generatePrompt } from './prompt';
import { Consumer } from '../consumer/types'; import { Consumer } from '@consumer/types';
import prisma from '../../prisma/prisma'; import prisma from '@prisma';
export async function generate( export async function generate(
id: number | undefined, id: number | undefined,
@@ -17,29 +17,8 @@ export async function generate(
parseInt(process.env.NUMBER_OF_WEEKS ?? '4') 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( 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 { try {
@@ -58,21 +37,33 @@ export async function generate(
(acc, week) => acc + week.purchases.length, (acc, week) => acc + week.purchases.length,
0 0
); );
console.info( 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({ const [consumer, purchaseList] = await prisma.$transaction(async tx => {
where: { const consumer = id
id: newPurchaseList.id ? await tx.consumer.update({
}, where: { id },
data: { data: { editedValue: editedConsumer }
value: validPurchases.data })
} : 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( 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; return validPurchases.data;

View File

@@ -1,4 +1,4 @@
import prisma from '../prisma/prisma'; import prisma from '@prisma';
export async function rateLimiter() { export async function rateLimiter() {
if (!process.env.RATE_LIMIT) { if (!process.env.RATE_LIMIT) {
@@ -7,21 +7,24 @@ export async function rateLimiter() {
const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000); const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000);
const consumersCount = await prisma.consumer.count({ const count = await prisma.$transaction(async tx => {
where: { const consumersCount = await tx.consumer.count({
createdAt: { where: {
gt: yesterday createdAt: {
gt: yesterday
}
} }
} });
const purchaseListsCount = await tx.purchaseList.count({
where: {
createdAt: {
gt: yesterday
}
}
});
return consumersCount + purchaseListsCount;
}); });
const purchaseListsCount = await prisma.purchaseList.count({ return count > parseInt(process.env.RATE_LIMIT);
where: {
createdAt: {
gt: yesterday
}
}
});
return consumersCount + purchaseListsCount > parseInt(process.env.RATE_LIMIT);
} }