Agent skill
implement-admin-moderation
Plan and implement Stage 8 Admin/Moderation with user management, track moderation, analytics dashboards, and audit logging (plan)
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/other/implement-admin-moderation-tassadar2499-novatune-2
SKILL.md
Implement Admin / Moderation Skill
Plan and implement Stage 8 Admin/Moderation for NovaTune: user management, track moderation, analytics dashboards, and tamper-evident audit logging.
Overview
Stage 8 implements administrative capabilities with:
- GET /admin/users - List/search users with pagination
- GET /admin/users/{userId} - Get user details
- PATCH /admin/users/{userId} - Update user status with reason codes
- GET /admin/tracks - List/search all tracks across users
- GET /admin/tracks/{trackId} - Get track details (admin view)
- POST /admin/tracks/{trackId}/moderate - Moderate track with reason codes
- DELETE /admin/tracks/{trackId} - Admin delete with audit trail
- GET /admin/analytics/overview - Dashboard overview metrics
- GET /admin/analytics/tracks/top - Top tracks by play count
- GET /admin/analytics/users/active - Most active users
- GET /admin/audit-logs - View audit logs with filtering
- GET /admin/audit-logs/{auditId} - Get audit entry details
- GET /admin/audit-logs/verify - Verify audit chain integrity
Implementation Plan
Phase 1: Data Models and Configuration
-
Audit Log Entry Model (
ApiService/Models/Admin/AuditLogEntry.cs)- Actor identity, timestamp, action, target, reason codes
- Hash chain fields:
PreviousEntryHash,ContentHash - 1-year retention via RavenDB document expiration
-
Moderation Status Enum (
ApiService/Models/ModerationStatus.cs)None,UnderReview,Disabled,Removed
-
Admin DTOs (
ApiService/Models/Admin/)AdminUserListItem,AdminUserDetails,UpdateUserStatusRequestAdminTrackListItem,AdminTrackDetails,ModerateTrackRequestAnalyticsOverview,TopTrackItem,UserActivityItemAuditLogListItem,AuditLogDetails
-
Configuration (
ApiService/Configuration/AdminOptions.cs)- Page size limits, audit retention days, integrity verification settings
-
Reason Codes (
ApiService/Models/Admin/ModerationReasonCodes.cs)copyright_violation,community_guidelines,illegal_content, etc.
Phase 2: RavenDB Indexes
-
AuditLogs_ByFilters (
ApiService/Infrastructure/Indexes/)csharpMap = entries => from entry in entries select new { entry.ActorUserId, entry.Action, entry.TargetType, entry.TargetId, entry.Timestamp, entry.ReasonCode }; -
Users_ForAdminSearch (
ApiService/Infrastructure/Indexes/)- Full-text search on email and display name
- Filter by status, roles
-
Tracks_ForAdminSearch (
ApiService/Infrastructure/Indexes/)- Full-text search on title and artist
- Filter by status, moderation status, user ID
Phase 3: Service Layer
-
IAuditLogService (
ApiService/Services/Admin/)LogAsync(request, ct)- Create audit entry with hash chainListAsync(query, ct)- List with filtering and paginationGetAsync(auditId, ct)- Get single entryVerifyIntegrityAsync(startDate, endDate, ct)- Verify hash chain
-
IAdminUserService (
ApiService/Services/Admin/)ListUsersAsync(query, ct)GetUserAsync(userId, ct)UpdateUserStatusAsync(userId, request, adminUserId, ct)RevokeUserSessionsAsync(userId, ct)
-
IAdminTrackService (
ApiService/Services/Admin/)ListTracksAsync(query, ct)GetTrackAsync(trackId, ct)ModerateTrackAsync(trackId, request, adminUserId, ct)DeleteTrackAsync(trackId, request, adminUserId, ct)
-
IAdminAnalyticsService (
ApiService/Services/Admin/)GetOverviewAsync(ct)GetTopTracksAsync(count, period, ct)GetActiveUsersAsync(count, period, ct)
Phase 4: Authorization Policies
- Admin Policy (
ApiService/Configuration/)csharpoptions.AddPolicy("AdminOnly", policy => policy.RequireClaim(ClaimTypes.Role, "Admin")); options.AddPolicy("AdminWithAuditAccess", policy => policy.RequireAssertion(context => context.User.HasClaim(ClaimTypes.Role, "Admin") && context.User.HasClaim("permissions", "audit.read")));
Phase 5: API Endpoints
-
AdminEndpoints.cs (
ApiService/Endpoints/)csharpvar group = app.MapGroup("/admin") .RequireAuthorization(PolicyNames.AdminOnly) .WithTags("Admin"); // User management users.MapGet("/", HandleListUsers).RequireRateLimiting("admin-user-list"); users.MapPatch("/{userId}", HandleUpdateUserStatus).RequireRateLimiting("admin-user-modify"); // Track moderation tracks.MapPost("/{trackId}/moderate", HandleModerateTrack).RequireRateLimiting("admin-track-modify"); tracks.MapDelete("/{trackId}", HandleDeleteTrack).RequireRateLimiting("admin-track-modify"); // Analytics analytics.MapGet("/overview", HandleGetOverview).RequireRateLimiting("admin-analytics"); // Audit logs audit.MapGet("/", HandleListAuditLogs).RequireRateLimiting("admin-audit"); audit.MapGet("/verify", HandleVerifyIntegrity); -
Rate Limiting Policies
admin-user-list: 60 req/minadmin-user-modify: 30 req/minadmin-track-list: 60 req/minadmin-track-modify: 30 req/minadmin-analytics: 30 req/minadmin-audit: 30 req/min
Phase 6: Audit Log Hash Chain
-
Hash Computation
csharpprivate static string ComputeHash(AuditLogEntry entry) { var content = $"{entry.AuditId}|{entry.ActorUserId}|{entry.Action}|" + $"{entry.TargetType}|{entry.TargetId}|{entry.Timestamp:O}|" + $"{entry.PreviousState}|{entry.NewState}|{entry.PreviousEntryHash}"; using var sha256 = SHA256.Create(); var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(content)); return Convert.ToHexString(hashBytes).ToLowerInvariant(); } -
Chain Verification
- Load entries in timestamp order
- Verify each entry's
PreviousEntryHashmatches previous entry'sContentHash - Verify each entry's
ContentHashmatches recomputed hash
Phase 7: Integration Points
- Stage 1 (Authentication) - Session revocation when user disabled
- Stage 5 (Track Management) - Reuse soft-delete flow for admin deletions
- Stage 7 (Telemetry) - Query analytics aggregates for dashboards
Phase 8: Observability
-
Metrics (
ApiService/Infrastructure/Observability/)admin_user_status_changes_totaladmin_track_moderations_totaladmin_track_deletions_totaladmin_audit_queries_totaladmin_audit_integrity_checks_total
-
Logging
- Admin operations logged at Warning level
- Never log reason text content (NF-4.5)
Phase 9: Testing
-
Unit Tests
AuditLogServiceTests- Hash chain, integrity verificationAdminUserServiceTests- Status changes, session revocationAdminTrackServiceTests- Moderation, deletion
-
Integration Tests
- End-to-end admin workflows
- Authorization enforcement
- Audit trail verification
Files to Create/Modify
New Files
| File | Purpose |
|---|---|
ApiService/Models/Admin/AuditLogEntry.cs |
Audit log document |
ApiService/Models/Admin/AdminDtos.cs |
Admin request/response DTOs |
ApiService/Models/ModerationStatus.cs |
Moderation status enum |
ApiService/Services/Admin/IAuditLogService.cs |
Audit service interface |
ApiService/Services/Admin/AuditLogService.cs |
Audit service implementation |
ApiService/Services/Admin/IAdminUserService.cs |
User service interface |
ApiService/Services/Admin/AdminUserService.cs |
User service implementation |
ApiService/Services/Admin/IAdminTrackService.cs |
Track service interface |
ApiService/Services/Admin/AdminTrackService.cs |
Track service implementation |
ApiService/Services/Admin/IAdminAnalyticsService.cs |
Analytics service interface |
ApiService/Services/Admin/AdminAnalyticsService.cs |
Analytics service implementation |
ApiService/Endpoints/AdminEndpoints.cs |
All admin API routes |
ApiService/Configuration/AdminOptions.cs |
Configuration class |
ApiService/Infrastructure/Indexes/AuditLogs_ByFilters.cs |
Audit log index |
ApiService/Infrastructure/Indexes/Users_ForAdminSearch.cs |
User search index |
ApiService/Infrastructure/Indexes/Tracks_ForAdminSearch.cs |
Track search index |
Modified Files
| File | Changes |
|---|---|
ApiService/Models/Track.cs |
Add ModerationStatus, ModeratedAt, ModeratedByUserId |
ApiService/Program.cs |
Register admin services, rate limiting, authorization |
Related Skills
- add-audit-logging - For implementing tamper-evident audit logs
- add-admin-endpoints - For creating admin API endpoints
- add-cursor-pagination - For paginated list endpoints
- add-ravendb-index - For creating search indexes
- add-rate-limiting - For rate limiting policies
- add-observability - For metrics and tracing
Validation Checklist
- All admin endpoints require Admin role
- Audit log access requires additional permission
- Every state-changing operation creates audit entry
- Audit entries include hash chain for tamper evidence
- Admin cannot modify own status (self-lockout prevention)
- Rate limiting enforced on all admin endpoints
- Analytics queries use Stage 7 aggregates
- Session revocation works when user disabled
- Track moderation integrates with Stage 5 deletion flow
- All operations logged with correlation ID
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?