Feature Request: Implement User Activity Logging System
Overview
Our Indic language corpus collector is live with real-time users. To support auditing, analytics, and moderation, we need to implement a user activity logging system across all user roles: contributors, reviewera, and admins.
This system will help us:
- Understand how users interact with the platform
- Monitor content submissions and reviewing actions
- Track system abuse or unusual patterns
- Enable future analytics and insights
User Roles
- Contributors: Submit recordings/text, validate content, interact with UI
- Moderators: Mark submissions as valid/invalid, flag issues
- Admins: Manage users, system settings, oversee reviewer actions
Activities to Track
✅ General
- Login / Logout
- User preferences changes
- Navigation to specific pages/components (optional)
🗣 ️ Contributor Actions
- Submit recording/text
- Validate others' contributions
- Flag content
- Skip/next actions
🛠 ️ Moderator/Admin Actions
- Approve/reject/flag contributions
- Ban/unban users
- Modify contribution metadata
- Assign/reassign content
Each activity should log the following:
| Field | Description |
|---|---|
user_id |
UUID or internal ID |
role |
contributor / moderator / admin |
action |
String or Enum (e.g. SUBMIT_TEXT) |
timestamp |
UTC timestamp of the action |
metadata |
Optional JSON (e.g. content ID, lang) |
ip_address |
Optional (from request headers) |
Tasks
-
Define SQLAlchemy model: ActivityLog -
Define matching Pydantic schema -
Add logging utility function/service (async-safe) -
Hook logging calls into key endpoints (e.g., submission, validation, moderation) -
(Optional) Add middleware for common actions (login/logout) -
Create admin-only endpoint to query logs (with filters: user, action, date range, etc.) -
Write unit/integration tests -
Document common action types (Enum or constants module)
Example DB Schema (PostgreSQL + SQLAlchemy)
class ActivityLog(Base):
__tablename__ = "activity_logs"
id = Column(Integer, primary_key=True, index=True)
user_id = Column(UUID, ForeignKey("users.id"))
role = Column(String) # 'contributor', 'moderator', 'admin'
action = Column(String) # e.g., 'SUBMIT_TEXT', 'VALIDATE_AUDIO'
metadata = Column(JSON, nullable=True) # e.g., {"contribution_id": "abc123"}
ip_address = Column(String, nullable=True)
timestamp = Column(DateTime, default=datetime.utcnow)
Future Considerations
- Add frontend logging hooks (e.g., page visits, UI interactions)
- Export logs for analytics pipelines
- Alerting for suspicious patterns (e.g., spamming submissions)
Edited by Alex Thuruthel