@@ -172,7 +172,7 @@ export class TrustScoreDatabase {
172
172
risk_score REAL DEFAULT 0,
173
173
consistency_score REAL DEFAULT 0,
174
174
virtual_confidence REAL DEFAULT 0,
175
- last_active_date DATETIME DEFAULT CURRENT_TIMESTAMP
175
+ last_active_date DATETIME DEFAULT CURRENT_TIMESTAMP,
176
176
trust_decay REAL DEFAULT 0,
177
177
last_updated DATETIME DEFAULT CURRENT_TIMESTAMP,
178
178
FOREIGN KEY (recommender_id) REFERENCES recommenders(id) ON DELETE CASCADE
@@ -349,6 +349,61 @@ export class TrustScoreDatabase {
349
349
return recommender || null ;
350
350
}
351
351
352
+ /**
353
+ * Retrieves an existing recommender or creates a new one if not found.
354
+ * Also initializes metrics for the recommender if they haven't been initialized yet.
355
+ * @param recommender Recommender object containing at least one identifier
356
+ * @returns Recommender object with all details, or null if failed
357
+ */
358
+ getOrCreateRecommender ( recommender : Recommender ) : Recommender | null {
359
+ try {
360
+ // Begin a transaction
361
+ const transaction = this . db . transaction ( ( ) => {
362
+ // Attempt to retrieve the recommender
363
+ const existingRecommender = this . getRecommender (
364
+ recommender . address
365
+ ) ;
366
+ if ( existingRecommender ) {
367
+ // Recommender exists, ensure metrics are initialized
368
+ this . initializeRecommenderMetrics ( existingRecommender . id ! ) ;
369
+ return existingRecommender ;
370
+ }
371
+
372
+ // Recommender does not exist, create a new one
373
+ const newRecommenderId = this . addRecommender ( recommender ) ;
374
+ if ( ! newRecommenderId ) {
375
+ throw new Error ( "Failed to add new recommender." ) ;
376
+ }
377
+
378
+ // Initialize metrics for the new recommender
379
+ const metricsInitialized =
380
+ this . initializeRecommenderMetrics ( newRecommenderId ) ;
381
+ if ( ! metricsInitialized ) {
382
+ throw new Error (
383
+ "Failed to initialize recommender metrics."
384
+ ) ;
385
+ }
386
+
387
+ // Retrieve and return the newly created recommender
388
+ const newRecommender = this . getRecommender ( newRecommenderId ) ;
389
+ if ( ! newRecommender ) {
390
+ throw new Error (
391
+ "Failed to retrieve the newly created recommender."
392
+ ) ;
393
+ }
394
+
395
+ return newRecommender ;
396
+ } ) ;
397
+
398
+ // Execute the transaction and return the recommender
399
+ const recommenderResult = transaction ( ) ;
400
+ return recommenderResult ;
401
+ } catch ( error ) {
402
+ console . error ( "Error in getOrCreateRecommender:" , error ) ;
403
+ return null ;
404
+ }
405
+ }
406
+
352
407
/**
353
408
* Initializes metrics for a recommender if not present.
354
409
* @param recommenderId Recommender's UUID
@@ -548,6 +603,8 @@ export class TrustScoreDatabase {
548
603
performance . tokenAddress ,
549
604
performance . priceChange24h ,
550
605
performance . volumeChange24h ,
606
+ performance . trade_24h_change ,
607
+ performance . liquidity ,
551
608
performance . liquidityChange24h ,
552
609
performance . holderChange24h , // Ensure column name matches schema
553
610
performance . rugPull ? 1 : 0 ,
@@ -916,7 +973,7 @@ export class TrustScoreDatabase {
916
973
market_cap_change = ?,
917
974
sell_liquidity = ?,
918
975
liquidity_change = ?,
919
- rapidDump = ?
976
+ rapidDump = ?,
920
977
sell_recommender_id = ?
921
978
WHERE
922
979
token_address = ?
@@ -1016,6 +1073,56 @@ export class TrustScoreDatabase {
1016
1073
} ;
1017
1074
}
1018
1075
1076
+ /**
1077
+ * Retrieves the latest trade performance metrics without requiring buyTimeStamp.
1078
+ * @param tokenAddress Token's address
1079
+ * @param recommenderId Recommender's UUID
1080
+ * @param isSimulation Whether the trade is a simulation. If true, retrieves from simulation_trade; otherwise, from trade.
1081
+ * @returns TradePerformance object or null
1082
+ */
1083
+ getLatestTradePerformance (
1084
+ tokenAddress : string ,
1085
+ recommenderId : string ,
1086
+ isSimulation : boolean
1087
+ ) : TradePerformance | null {
1088
+ const tableName = isSimulation ? "simulation_trade" : "trade" ;
1089
+ const sql = `
1090
+ SELECT * FROM ${ tableName }
1091
+ WHERE token_address = ? AND recommender_id = ?
1092
+ ORDER BY buy_timeStamp DESC
1093
+ LIMIT 1;
1094
+ ` ;
1095
+ const row = this . db . prepare ( sql ) . get ( tokenAddress , recommenderId ) as
1096
+ | TradePerformance
1097
+ | undefined ;
1098
+ if ( ! row ) return null ;
1099
+
1100
+ return {
1101
+ token_address : row . token_address ,
1102
+ recommender_id : row . recommender_id ,
1103
+ buy_price : row . buy_price ,
1104
+ sell_price : row . sell_price ,
1105
+ buy_timeStamp : row . buy_timeStamp ,
1106
+ sell_timeStamp : row . sell_timeStamp ,
1107
+ buy_amount : row . buy_amount ,
1108
+ sell_amount : row . sell_amount ,
1109
+ buy_sol : row . buy_sol ,
1110
+ received_sol : row . received_sol ,
1111
+ buy_value_usd : row . buy_value_usd ,
1112
+ sell_value_usd : row . sell_value_usd ,
1113
+ profit_usd : row . profit_usd ,
1114
+ profit_percent : row . profit_percent ,
1115
+ buy_market_cap : row . buy_market_cap ,
1116
+ sell_market_cap : row . sell_market_cap ,
1117
+ market_cap_change : row . market_cap_change ,
1118
+ buy_liquidity : row . buy_liquidity ,
1119
+ sell_liquidity : row . sell_liquidity ,
1120
+ liquidity_change : row . liquidity_change ,
1121
+ last_updated : row . last_updated ,
1122
+ rapidDump : row . rapidDump ,
1123
+ } ;
1124
+ }
1125
+
1019
1126
/**
1020
1127
* Close the database connection gracefully.
1021
1128
*/
0 commit comments