* Record a Slack activity event
(activity: {
slack_user_id: string;
activity_type: string;
channel_id?: string;
channel_name?: string;
activity_timestamp: Date;
organization_id?: string;
metadata?: Record<string, unknown>;
})
| 490 | * Record a Slack activity event |
| 491 | */ |
| 492 | async recordActivity(activity: { |
| 493 | slack_user_id: string; |
| 494 | activity_type: string; |
| 495 | channel_id?: string; |
| 496 | channel_name?: string; |
| 497 | activity_timestamp: Date; |
| 498 | organization_id?: string; |
| 499 | metadata?: Record<string, unknown>; |
| 500 | }): Promise<void> { |
| 501 | // Insert raw activity |
| 502 | await query( |
| 503 | `INSERT INTO slack_activities ( |
| 504 | slack_user_id, activity_type, channel_id, channel_name, |
| 505 | activity_timestamp, organization_id, metadata |
| 506 | ) VALUES ($1, $2, $3, $4, $5, $6, $7)`, |
| 507 | [ |
| 508 | activity.slack_user_id, |
| 509 | activity.activity_type, |
| 510 | activity.channel_id || null, |
| 511 | activity.channel_name || null, |
| 512 | activity.activity_timestamp, |
| 513 | activity.organization_id || null, |
| 514 | activity.metadata ? JSON.stringify(activity.metadata) : null, |
| 515 | ] |
| 516 | ); |
| 517 | |
| 518 | // Update daily aggregation |
| 519 | const activityDate = activity.activity_timestamp.toISOString().split('T')[0]; |
| 520 | const columnMap: Record<string, string> = { |
| 521 | message: 'message_count', |
| 522 | reaction: 'reaction_count', |
| 523 | thread_reply: 'thread_reply_count', |
| 524 | channel_join: 'channel_join_count', |
| 525 | }; |
| 526 | const countColumn = columnMap[activity.activity_type] || null; |
| 527 | |
| 528 | if (countColumn) { |
| 529 | await query( |
| 530 | `INSERT INTO slack_activity_daily ( |
| 531 | slack_user_id, activity_date, ${countColumn}, total_activity, organization_id |
| 532 | ) VALUES ($1, $2, 1, 1, $3) |
| 533 | ON CONFLICT (slack_user_id, activity_date) |
| 534 | DO UPDATE SET |
| 535 | ${countColumn} = slack_activity_daily.${countColumn} + 1, |
| 536 | total_activity = slack_activity_daily.total_activity + 1, |
| 537 | organization_id = COALESCE(EXCLUDED.organization_id, slack_activity_daily.organization_id), |
| 538 | updated_at = NOW()`, |
| 539 | [activity.slack_user_id, activityDate, activity.organization_id || null] |
| 540 | ); |
| 541 | } else { |
| 542 | // Unknown activity type - just increment total |
| 543 | await query( |
| 544 | `INSERT INTO slack_activity_daily ( |
| 545 | slack_user_id, activity_date, total_activity, organization_id |
| 546 | ) VALUES ($1, $2, 1, $3) |
| 547 | ON CONFLICT (slack_user_id, activity_date) |
| 548 | DO UPDATE SET |
| 549 | total_activity = slack_activity_daily.total_activity + 1, |
no test coverage detected