Files
speckle-server/packages/server/modules/gendo/services/userCredits.ts
T
Kristaps Fabians Geikins 4b06f42db7 chore(server): run TS files directly (no compilation) (#5134)
* sort of works

* type fixes

* added option to run old way too
2025-07-23 11:20:40 +02:00

54 lines
1.5 KiB
TypeScript

import type {
GetUserCredits,
UpsertUserCredits
} from '@/modules/gendo/domain/operations'
import type { 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 })
}