@@ -4392,3 +4392,69 @@ func setToSlice(set map[int64]struct{}) []int64 {
43924392 }
43934393 return out
43944394}
4395+
4396+ // GetRecentAccountUsers returns users who used the account in the last N minutes
4397+ func (r * usageLogRepository ) GetRecentAccountUsers (ctx context.Context , accountID int64 , minutes int ) ([]service.RecentAccountUser , error ) {
4398+ query := `
4399+ SELECT
4400+ ul.user_id,
4401+ COALESCE(u.email, '') as email,
4402+ COUNT(*) as requests,
4403+ COALESCE(SUM(COALESCE(ul.account_stats_cost, ul.total_cost) * COALESCE(ul.account_rate_multiplier, 1)), 0) as account_cost,
4404+ COALESCE(SUM(ul.actual_cost), 0) as user_cost,
4405+ MAX(ul.created_at) as last_used_at
4406+ FROM usage_logs ul
4407+ LEFT JOIN users u ON u.id = ul.user_id
4408+ WHERE ul.account_id = $1 AND ul.created_at >= NOW() - make_interval(mins => $2)
4409+ GROUP BY ul.user_id, u.email
4410+ ORDER BY last_used_at DESC
4411+ LIMIT 50
4412+ `
4413+ rows , err := r .db .QueryContext (ctx , query , accountID , minutes )
4414+ if err != nil {
4415+ return nil , err
4416+ }
4417+ defer rows .Close ()
4418+ var result []service.RecentAccountUser
4419+ for rows .Next () {
4420+ var u service.RecentAccountUser
4421+ if err := rows .Scan (& u .UserID , & u .Email , & u .Requests , & u .AccountCost , & u .UserCost , & u .LastUsedAt ); err != nil {
4422+ return nil , err
4423+ }
4424+ result = append (result , u )
4425+ }
4426+ return result , rows .Err ()
4427+ }
4428+
4429+ // GetAccountUsersByTimeRange returns users who used the account within a selected time range.
4430+ func (r * usageLogRepository ) GetAccountUsersByTimeRange (ctx context.Context , accountID int64 , startTime , endTime time.Time ) ([]service.RecentAccountUser , error ) {
4431+ query := `
4432+ SELECT
4433+ ul.user_id,
4434+ COALESCE(u.email, '') as email,
4435+ COUNT(*) as requests,
4436+ COALESCE(SUM(COALESCE(ul.account_stats_cost, ul.total_cost) * COALESCE(ul.account_rate_multiplier, 1)), 0) as account_cost,
4437+ COALESCE(SUM(ul.actual_cost), 0) as user_cost,
4438+ MAX(ul.created_at) as last_used_at
4439+ FROM usage_logs ul
4440+ LEFT JOIN users u ON u.id = ul.user_id
4441+ WHERE ul.account_id = $1 AND ul.created_at >= $2 AND ul.created_at < $3
4442+ GROUP BY ul.user_id, u.email
4443+ ORDER BY requests DESC, last_used_at DESC
4444+ LIMIT 200
4445+ `
4446+ rows , err := r .db .QueryContext (ctx , query , accountID , startTime , endTime )
4447+ if err != nil {
4448+ return nil , err
4449+ }
4450+ defer rows .Close ()
4451+ var result []service.RecentAccountUser
4452+ for rows .Next () {
4453+ var u service.RecentAccountUser
4454+ if err := rows .Scan (& u .UserID , & u .Email , & u .Requests , & u .AccountCost , & u .UserCost , & u .LastUsedAt ); err != nil {
4455+ return nil , err
4456+ }
4457+ result = append (result , u )
4458+ }
4459+ return result , rows .Err ()
4460+ }
0 commit comments