(params: {
userId: string
billingPeriodStart: Date
weeklyCreditsLimit: number
logger: Logger
conn?: DbConn
})
| 197 | * billing-aligned week. |
| 198 | */ |
| 199 | export async function getWeeklyUsage(params: { |
| 200 | userId: string |
| 201 | billingPeriodStart: Date |
| 202 | weeklyCreditsLimit: number |
| 203 | logger: Logger |
| 204 | conn?: DbConn |
| 205 | }): Promise<WeeklyUsage> { |
| 206 | const { |
| 207 | userId, |
| 208 | billingPeriodStart, |
| 209 | weeklyCreditsLimit, |
| 210 | conn = db, |
| 211 | } = params |
| 212 | |
| 213 | const now = new Date() |
| 214 | const weekStart = getWeekStart(billingPeriodStart, now) |
| 215 | const weekEnd = getWeekEnd(billingPeriodStart, now) |
| 216 | |
| 217 | const result = await conn |
| 218 | .select({ |
| 219 | total: sql<number>`COALESCE(SUM(${schema.creditLedger.principal} - ${schema.creditLedger.balance}), 0)`, |
| 220 | }) |
| 221 | .from(schema.creditLedger) |
| 222 | .where( |
| 223 | and( |
| 224 | eq(schema.creditLedger.user_id, userId), |
| 225 | eq(schema.creditLedger.type, 'subscription'), |
| 226 | gte(schema.creditLedger.created_at, weekStart), |
| 227 | lt(schema.creditLedger.created_at, weekEnd), |
| 228 | ), |
| 229 | ) |
| 230 | |
| 231 | const used = Number(result[0]?.total ?? 0) |
| 232 | |
| 233 | return { |
| 234 | used, |
| 235 | limit: weeklyCreditsLimit, |
| 236 | remaining: Math.max(0, weeklyCreditsLimit - used), |
| 237 | resetsAt: weekEnd, |
| 238 | percentUsed: weeklyCreditsLimit > 0 |
| 239 | ? Math.round((used / weeklyCreditsLimit) * 100) |
| 240 | : 0, |
| 241 | } |
| 242 | } |
| 243 | |
| 244 | // --------------------------------------------------------------------------- |
| 245 | // Block grant management |
no test coverage detected