@@ -29,20 +29,31 @@ type ApiResponse = {
2929
3030/**
3131 * Transform GraphQL data to the format expected by the frontend
32+ * Aggregates multiple hourly entries per day to a single daily entry
3233 */
3334const transformGraphQLData = ( graphqlData : SGhoRatesData [ ] ) => {
34- return graphqlData . map ( ( item ) => {
35- // Convert blockHour (ISO datetime) to date string (YYYY-MM-DD)
36- const date = new Date ( item . blockHour ) ;
37- const dateString = date . toISOString ( ) . split ( 'T' ) [ 0 ] ;
38-
39- return {
40- day : {
41- value : dateString ,
42- } ,
43- merit_apy : item . apr ,
44- } ;
35+ const dailyData = new Map < string , { timestamp : Date ; merit_apy : number } > ( ) ;
36+
37+ graphqlData . forEach ( ( item ) => {
38+ const timestamp = new Date ( item . blockHour ) ;
39+ const dateString = timestamp . toISOString ( ) . split ( 'T' ) [ 0 ] ;
40+
41+ // Keep the latest entry for each day (or first if no existing entry)
42+ const existing = dailyData . get ( dateString ) ;
43+ if ( ! existing || timestamp > existing . timestamp ) {
44+ dailyData . set ( dateString , {
45+ timestamp,
46+ merit_apy : item . apr ,
47+ } ) ;
48+ }
4549 } ) ;
50+
51+ return Array . from ( dailyData . entries ( ) ) . map ( ( [ dateString , { merit_apy } ] ) => ( {
52+ day : {
53+ value : dateString ,
54+ } ,
55+ merit_apy,
56+ } ) ) ;
4657} ;
4758
4859/**
@@ -148,10 +159,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse<
148159 } ) ;
149160 }
150161
151- // Transform and sort data
152162 const transformedData = transformGraphQLData ( result . data . aaveV3RatesSgho ) ;
153163
154- // Sort by date (oldest first) since we removed ordering from GraphQL query
155164 const sortedData = transformedData . sort ( ( a , b ) => {
156165 const dateA = new Date ( a . day . value ) ;
157166 const dateB = new Date ( b . day . value ) ;
0 commit comments