Files
speckle-server/packages/server/modules/gendo/services/userCredits.ts
T
Gergő Jedlicska 01b222ced8 gergo/web 2155 gendo module multi region (#3528)
* fix(workspaces): allow workspace delete for paid workspaces

* feat(gendo): multi region gendo with new api integration and limits

* feat(gendo): user credits

* feat: adds limits to gendo panel, and terms and conditions link

* fix: reworks setting back camera view

* feat(gendo): webhook signature verification

* fix(gendo): nullability

* test(blobstorage): fix test dependency injection

---------

Co-authored-by: Dimitrie Stefanescu <didimitrie@gmail.com>
2024-11-22 16:43:31 +01:00

51 lines
1.5 KiB
TypeScript

import { GetUserCredits, UpsertUserCredits } from '@/modules/gendo/domain/operations'
import { UserCredits } from '@/modules/gendo/domain/types'
import { InsufficientGendoRenderCreditsError } from '@/modules/gendo/errors/main'
import dayjs from 'dayjs'
type GetUserGendoAiCredits = (args: { userId: string }) => Promise<UserCredits>
export const getUserGendoAiCreditsFactory =
({
getUserCredits,
upsertUserCredits
}: {
getUserCredits: GetUserCredits
upsertUserCredits: UpsertUserCredits
}) =>
async ({ userId }: { userId: string }) => {
//
const userCredits = await getUserCredits({ userId })
if (userCredits && userCredits.resetDate.getTime() > new Date().getTime())
return userCredits
const resetDate = dayjs(userCredits?.resetDate || new Date())
.add(1, 'month')
.toDate()
const newCredits = {
used: 0,
userId,
resetDate
}
await upsertUserCredits({ userCredits: newCredits })
return newCredits
}
export const useUserGendoAiCreditsFactory =
({
getUserGendoAiCredits,
upsertUserCredits,
maxCredits
}: {
getUserGendoAiCredits: GetUserGendoAiCredits
upsertUserCredits: UpsertUserCredits
maxCredits: number
}) =>
async ({ userId, credits }: { userId: string; credits: number }) => {
const userCredits = await getUserGendoAiCredits({ userId })
userCredits.used += credits
if (userCredits.used > maxCredits) throw new InsufficientGendoRenderCreditsError()
await upsertUserCredits({ userCredits })
}