1- import { and , Database , eq , gte , inArray , isNull , lte , or , sql } from "@opencode-ai/console-core/drizzle/index.js"
1+ import { and , Database , eq , gte , inArray , isNull , lte , or , sql , sum } from "@opencode-ai/console-core/drizzle/index.js"
22import { UsageTable } from "@opencode-ai/console-core/schema/billing.sql.js"
33import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js"
44import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
@@ -35,7 +35,7 @@ async function getCosts(workspaceID: string, year: number, month: number) {
3535 . select ( {
3636 date : sql < string > `DATE(${ UsageTable . timeCreated } )` ,
3737 model : UsageTable . model ,
38- totalCost : sql < number > `SUM( ${ UsageTable . cost } )` ,
38+ totalCost : sum ( UsageTable . cost ) ,
3939 keyId : UsageTable . keyID ,
4040 } )
4141 . from ( UsageTable )
@@ -46,7 +46,13 @@ async function getCosts(workspaceID: string, year: number, month: number) {
4646 lte ( UsageTable . timeCreated , endDate ) ,
4747 ) ,
4848 )
49- . groupBy ( sql `DATE(${ UsageTable . timeCreated } )` , UsageTable . model , UsageTable . keyID ) ,
49+ . groupBy ( sql `DATE(${ UsageTable . timeCreated } )` , UsageTable . model , UsageTable . keyID )
50+ . then ( ( x ) =>
51+ x . map ( ( r ) => ( {
52+ ...r ,
53+ totalCost : r . totalCost ? parseInt ( r . totalCost ) : 0 ,
54+ } ) ) ,
55+ ) ,
5056 )
5157
5258 // Get unique key IDs from usage
@@ -204,26 +210,24 @@ export function GraphSection() {
204210 const dates = getDates ( )
205211 if ( ! data ?. usage ?. length ) return null
206212
207- const filteredUsageResults = store . key ? data . usage . filter ( ( row ) => row . keyId === store . key ) : data . usage
208-
209213 const dailyData = new Map < string , Map < string , number > > ( )
210214 for ( const dateKey of dates ) dailyData . set ( dateKey , new Map ( ) )
211215
212- for ( const row of filteredUsageResults ) {
213- const dayMap = dailyData . get ( row . date )
214- if ( dayMap ) {
215- const existing = dayMap . get ( row . model ) || 0
216- dayMap . set ( row . model , existing + row . totalCost )
217- }
218- }
216+ data . usage
217+ . filter ( ( row ) => ( store . key ? row . keyId === store . key : true ) )
218+ . forEach ( ( row ) => {
219+ const dayMap = dailyData . get ( row . date )
220+ if ( ! dayMap ) return
221+ dayMap . set ( row . model , ( dayMap . get ( row . model ) ?? 0 ) + row . totalCost )
222+ } )
219223
220224 const filteredModels = store . model === null ? getModels ( ) : [ store . model ]
221225
222226 const datasets = filteredModels . map ( ( model ) => {
223227 const color = getModelColor ( model )
224228 return {
225229 label : model ,
226- data : dates . map ( ( date ) => ( dailyData . get ( date ) ?. get ( model ) || 0 ) / 100000000 ) ,
230+ data : dates . map ( ( date ) => ( dailyData . get ( date ) ?. get ( model ) || 0 ) / 100_000_000 ) ,
227231 backgroundColor : color ,
228232 hoverBackgroundColor : color ,
229233 borderWidth : 0 ,
0 commit comments