Scanning documentation library
Scanning documentation library
Scanning documentation library
Ring Platform provides a comprehensive administrative API with 12 secure endpoints for system management, user administration, analytics access, and configuration control. All admin endpoints require ADMIN role and implement enterprise-grade security measures.
All admin endpoints require ADMIN role authentication and are subject to strict rate limiting and audit logging. Unauthorized access attempts are logged and may trigger security alerts.
Authentication → Role Verification → Permission Check → Action Logging → ResponseGET /api/admin/usersList and search platform users with advanced filtering and pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1) |
limit | number | No | Users per page (default: 50, max: 200) |
search | string | No | Search by name, email, or username |
role | string | No | Filter by role: VISITOR, MEMBER, CONFIDENTIAL, ADMIN |
status | string | No | Filter by status: active, suspended, banned |
verified | boolean | No | Filter by email verification status |
createdAfter | string | No | ISO date - users created after this date |
createdBefore | string | No | ISO date - users created before this date |
lastLoginAfter | string | No | ISO date - users logged in after this date |
sortBy | string | No | Sort field: createdAt, lastLogin, name, email |
sortOrder | string | No | Sort order: asc, desc (default: desc) |
GET /api/admin/users/{id}Get detailed information about a specific user.
PUT /api/admin/users/{id}/roleUpdate a user's role and permissions.
PUT /api/admin/users/{id}/statusUpdate a user's account status (suspend, ban, activate).
DELETE /api/admin/users/{id}Permanently delete a user account (GDPR compliance).
| Parameter | Type | Required | Description |
|---|---|---|---|
anonymize | boolean | No | Replace user data with anonymous placeholders (default: true) |
deleteContent | boolean | No | Delete all user-generated content (default: false) |
reason | string | Yes | Reason for account deletion |
GET /api/admin/analyticsGet comprehensive platform analytics and metrics.
| Parameter | Type | Required | Description |
|---|---|---|---|
period | string | No | Time period: hour, day, week, month, year (default: week) |
startDate | string | No | ISO date string for custom range |
endDate | string | No | ISO date string for custom range |
metrics | string[] | No | Specific metrics to include |
GET /api/admin/analytics/usersGet detailed user analytics.
| Parameter | Type | Required | Description |
|---|---|---|---|
groupBy | string | No | Group results by: day, week, month, role, status |
includeInactive | boolean | No | Include inactive users in results (default: false) |
GET /api/admin/configGet current system configuration settings.
PUT /api/admin/configUpdate system configuration settings.
POST /api/admin/config/rollbackRollback configuration changes.
GET /api/admin/auditGet audit logs for admin actions.
| Parameter | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1) |
limit | number | No | Logs per page (default: 50) |
action | string | No | Filter by action type |
userId | string | No | Filter by user who performed action |
targetUserId | string | No | Filter by user who was affected |
startDate | string | No | ISO date - logs after this date |
endDate | string | No | ISO date - logs before this date |
import { useState, useEffect } from 'react'
interface AdminStats {
totalUsers: number
activeUsers: number
newUsersToday: number
totalEntities: number
totalOpportunities: number
systemHealth: 'healthy' | 'warning' | 'critical'
}
export function AdminDashboard() {
const [stats, setStats] = useState<AdminStats | null>(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
fetchAdminStats()
}, [])
const fetchAdminStats = async () => {
try {
const [usersRes, analyticsRes] = await Promise.all([
fetch('/api/admin/users?limit=1'),
fetch('/api/admin/analytics?period=day')
])
const usersData = await usersRes.json()
const analyticsData = await analyticsRes.json()
setStats({
totalUsers: usersData.pagination.total,
activeUsers: analyticsData.userMetrics.activity.dailyActiveUsers,
newUsersToday: analyticsData.userMetrics.registrations.byDay.slice(-1)[0],
totalEntities: analyticsData.contentMetrics.entities.active,
totalOpportunities: analyticsData.contentMetrics.opportunities.posted,
systemHealth: analyticsData.systemMetrics.performance.errorRate < 0.01 ? 'healthy' :
analyticsData.systemMetrics.performance.errorRate < 0.05 ? 'warning' : 'critical'
})
} catch (error) {
console.error('Failed to fetch admin stats:', error)
} finally {
setLoading(false)
}
}
if (loading) return <div>Loading admin dashboard...</div>
return (
<div className="admin-dashboard">
<h1 className="text-2xl font-bold mb-6">Admin Dashboard</h1>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-6">
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">Total Users</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className="text-2xl font-bold">{stats?.totalUsers.toLocaleString()}</div>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">Active Today</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className="text-2xl font-bold">{stats?.activeUsers.toLocaleString()}</div>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">New Today</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className="text-2xl font-bold text-green-600">+{stats?.newUsersToday}</div>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">System Health</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className={`text-2xl font-bold ${
stats?.systemHealth === 'healthy' ? 'text-green-600' :
stats?.systemHealth === 'warning' ? 'text-yellow-600' : 'text-red-600'
}`}>
{stats?.systemHealth.toUpperCase()}
</div>
</UiCardContent>
</UiCard>
</div>
{/* Additional admin components */}
<UserManagement />
<SystemConfiguration />
<AuditLogs />
</div>
)
}
import { useState } from 'react'
import { Button } from '@/components/ui/button'
import { Badge } from '@/components/ui/badge'
interface User {
id: string
name: string
email: string
role: string
status: string
createdAt: string
}
export function UserManagement() {
const [users, setUsers] = useState<User[]>([])
const [loading, setLoading] = useState(false)
const updateUserRole = async (userId: string, newRole: string) => {
try {
setLoading(true)
const response = await fetch(`/api/admin/users/${userId}/role`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
role: newRole,
reason: 'Administrative role update',
notifyUser: true
})
})
if (response.ok) {
// Update local state
setUsers(users.map(user =>
user.id === userId ? { ...user, role: newRole } : user
))
}
} catch (error) {
console.error('Failed to update user role:', error)
} finally {
setLoading(false)
}
}
const suspendUser = async (userId: string) => {
try {
const response = await fetch(`/api/admin/users/${userId}/status`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
status: 'suspended',
reason: 'Administrative action',
duration: '7 days',
notifyUser: true
})
})
if (response.ok) {
setUsers(users.map(user =>
user.id === userId ? { ...user, status: 'suspended' } : user
))
}
} catch (error) {
console.error('Failed to suspend user:', error)
}
}
return (
<div className="user-management">
<h2 className="text-xl font-semibold mb-4">User Management</h2>
<div className="overflow-x-auto">
<table className="w-full border-collapse">
<thead>
<tr className="border-b">
<th className="text-left p-2">User</th>
<th className="text-left p-2">Role</th>
<th className="text-left p-2">Status</th>
<th className="text-left p-2">Joined</th>
<th className="text-left p-2">Actions</th>
</tr>
</thead>
<tbody>
{users.map(user => (
<tr key={user.id} className="border-b">
<td className="p-2">
<div>
<div className="font-medium">{user.name}</div>
<div className="text-sm text-gray-500">{user.email}</div>
</div>
</td>
<td className="p-2">
<Badge variant={user.role === 'ADMIN' ? 'destructive' : 'default'}>
{user.role}
</Badge>
</td>
<td className="p-2">
<Badge variant={
user.status === 'active' ? 'default' :
user.status === 'suspended' ? 'secondary' : 'destructive'
}>
{user.status}
</Badge>
</td>
<td className="p-2 text-sm text-gray-500">
{new Date(user.createdAt).toLocaleDateString()}
</td>
<td className="p-2">
<div className="flex gap-2">
<Button
size="sm"
variant="outline"
onClick={() => updateUserRole(user.id, 'CONFIDENTIAL')}
disabled={loading}
>
Promote
</Button>
<Button
size="sm"
variant="outline"
onClick={() => suspendUser(user.id)}
disabled={loading || user.status === 'suspended'}
>
Suspend
</Button>
</div>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
)
}Admin Security Audit Logging System Protection Monitoring
Ring Platform's Admin API provides enterprise-grade administrative control with comprehensive security, audit trails, and operational monitoring.
Ring Platform provides a comprehensive administrative API with 12 secure endpoints for system management, user administration, analytics access, and configuration control. All admin endpoints require ADMIN role and implement enterprise-grade security measures.
All admin endpoints require ADMIN role authentication and are subject to strict rate limiting and audit logging. Unauthorized access attempts are logged and may trigger security alerts.
Authentication → Role Verification → Permission Check → Action Logging → ResponseGET /api/admin/usersList and search platform users with advanced filtering and pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1) |
limit | number | No | Users per page (default: 50, max: 200) |
search | string | No | Search by name, email, or username |
role | string | No | Filter by role: VISITOR, MEMBER, CONFIDENTIAL, ADMIN |
status | string | No | Filter by status: active, suspended, banned |
verified | boolean | No | Filter by email verification status |
createdAfter | string | No | ISO date - users created after this date |
createdBefore | string | No | ISO date - users created before this date |
lastLoginAfter | string | No | ISO date - users logged in after this date |
sortBy | string | No | Sort field: createdAt, lastLogin, name, email |
sortOrder | string | No | Sort order: asc, desc (default: desc) |
GET /api/admin/users/{id}Get detailed information about a specific user.
PUT /api/admin/users/{id}/roleUpdate a user's role and permissions.
PUT /api/admin/users/{id}/statusUpdate a user's account status (suspend, ban, activate).
DELETE /api/admin/users/{id}Permanently delete a user account (GDPR compliance).
| Parameter | Type | Required | Description |
|---|---|---|---|
anonymize | boolean | No | Replace user data with anonymous placeholders (default: true) |
deleteContent | boolean | No | Delete all user-generated content (default: false) |
reason | string | Yes | Reason for account deletion |
GET /api/admin/analyticsGet comprehensive platform analytics and metrics.
| Parameter | Type | Required | Description |
|---|---|---|---|
period | string | No | Time period: hour, day, week, month, year (default: week) |
startDate | string | No | ISO date string for custom range |
endDate | string | No | ISO date string for custom range |
metrics | string[] | No | Specific metrics to include |
GET /api/admin/analytics/usersGet detailed user analytics.
| Parameter | Type | Required | Description |
|---|---|---|---|
groupBy | string | No | Group results by: day, week, month, role, status |
includeInactive | boolean | No | Include inactive users in results (default: false) |
GET /api/admin/configGet current system configuration settings.
PUT /api/admin/configUpdate system configuration settings.
POST /api/admin/config/rollbackRollback configuration changes.
GET /api/admin/auditGet audit logs for admin actions.
| Parameter | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1) |
limit | number | No | Logs per page (default: 50) |
action | string | No | Filter by action type |
userId | string | No | Filter by user who performed action |
targetUserId | string | No | Filter by user who was affected |
startDate | string | No | ISO date - logs after this date |
endDate | string | No | ISO date - logs before this date |
import { useState, useEffect } from 'react'
interface AdminStats {
totalUsers: number
activeUsers: number
newUsersToday: number
totalEntities: number
totalOpportunities: number
systemHealth: 'healthy' | 'warning' | 'critical'
}
export function AdminDashboard() {
const [stats, setStats] = useState<AdminStats | null>(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
fetchAdminStats()
}, [])
const fetchAdminStats = async () => {
try {
const [usersRes, analyticsRes] = await Promise.all([
fetch('/api/admin/users?limit=1'),
fetch('/api/admin/analytics?period=day')
])
const usersData = await usersRes.json()
const analyticsData = await analyticsRes.json()
setStats({
totalUsers: usersData.pagination.total,
activeUsers: analyticsData.userMetrics.activity.dailyActiveUsers,
newUsersToday: analyticsData.userMetrics.registrations.byDay.slice(-1)[0],
totalEntities: analyticsData.contentMetrics.entities.active,
totalOpportunities: analyticsData.contentMetrics.opportunities.posted,
systemHealth: analyticsData.systemMetrics.performance.errorRate < 0.01 ? 'healthy' :
analyticsData.systemMetrics.performance.errorRate < 0.05 ? 'warning' : 'critical'
})
} catch (error) {
console.error('Failed to fetch admin stats:', error)
} finally {
setLoading(false)
}
}
if (loading) return <div>Loading admin dashboard...</div>
return (
<div className="admin-dashboard">
<h1 className="text-2xl font-bold mb-6">Admin Dashboard</h1>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-6">
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">Total Users</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className="text-2xl font-bold">{stats?.totalUsers.toLocaleString()}</div>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">Active Today</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className="text-2xl font-bold">{stats?.activeUsers.toLocaleString()}</div>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">New Today</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className="text-2xl font-bold text-green-600">+{stats?.newUsersToday}</div>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">System Health</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className={`text-2xl font-bold ${
stats?.systemHealth === 'healthy' ? 'text-green-600' :
stats?.systemHealth === 'warning' ? 'text-yellow-600' : 'text-red-600'
}`}>
{stats?.systemHealth.toUpperCase()}
</div>
</UiCardContent>
</UiCard>
</div>
{/* Additional admin components */}
<UserManagement />
<SystemConfiguration />
<AuditLogs />
</div>
)
}
import { useState } from 'react'
import { Button } from '@/components/ui/button'
import { Badge } from '@/components/ui/badge'
interface User {
id: string
name: string
email: string
role: string
status: string
createdAt: string
}
export function UserManagement() {
const [users, setUsers] = useState<User[]>([])
const [loading, setLoading] = useState(false)
const updateUserRole = async (userId: string, newRole: string) => {
try {
setLoading(true)
const response = await fetch(`/api/admin/users/${userId}/role`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
role: newRole,
reason: 'Administrative role update',
notifyUser: true
})
})
if (response.ok) {
// Update local state
setUsers(users.map(user =>
user.id === userId ? { ...user, role: newRole } : user
))
}
} catch (error) {
console.error('Failed to update user role:', error)
} finally {
setLoading(false)
}
}
const suspendUser = async (userId: string) => {
try {
const response = await fetch(`/api/admin/users/${userId}/status`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
status: 'suspended',
reason: 'Administrative action',
duration: '7 days',
notifyUser: true
})
})
if (response.ok) {
setUsers(users.map(user =>
user.id === userId ? { ...user, status: 'suspended' } : user
))
}
} catch (error) {
console.error('Failed to suspend user:', error)
}
}
return (
<div className="user-management">
<h2 className="text-xl font-semibold mb-4">User Management</h2>
<div className="overflow-x-auto">
<table className="w-full border-collapse">
<thead>
<tr className="border-b">
<th className="text-left p-2">User</th>
<th className="text-left p-2">Role</th>
<th className="text-left p-2">Status</th>
<th className="text-left p-2">Joined</th>
<th className="text-left p-2">Actions</th>
</tr>
</thead>
<tbody>
{users.map(user => (
<tr key={user.id} className="border-b">
<td className="p-2">
<div>
<div className="font-medium">{user.name}</div>
<div className="text-sm text-gray-500">{user.email}</div>
</div>
</td>
<td className="p-2">
<Badge variant={user.role === 'ADMIN' ? 'destructive' : 'default'}>
{user.role}
</Badge>
</td>
<td className="p-2">
<Badge variant={
user.status === 'active' ? 'default' :
user.status === 'suspended' ? 'secondary' : 'destructive'
}>
{user.status}
</Badge>
</td>
<td className="p-2 text-sm text-gray-500">
{new Date(user.createdAt).toLocaleDateString()}
</td>
<td className="p-2">
<div className="flex gap-2">
<Button
size="sm"
variant="outline"
onClick={() => updateUserRole(user.id, 'CONFIDENTIAL')}
disabled={loading}
>
Promote
</Button>
<Button
size="sm"
variant="outline"
onClick={() => suspendUser(user.id)}
disabled={loading || user.status === 'suspended'}
>
Suspend
</Button>
</div>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
)
}Admin Security Audit Logging System Protection Monitoring
Ring Platform's Admin API provides enterprise-grade administrative control with comprehensive security, audit trails, and operational monitoring.
Ring Platform provides a comprehensive administrative API with 12 secure endpoints for system management, user administration, analytics access, and configuration control. All admin endpoints require ADMIN role and implement enterprise-grade security measures.
All admin endpoints require ADMIN role authentication and are subject to strict rate limiting and audit logging. Unauthorized access attempts are logged and may trigger security alerts.
Authentication → Role Verification → Permission Check → Action Logging → ResponseGET /api/admin/usersList and search platform users with advanced filtering and pagination.
| Parameter | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1) |
limit | number | No | Users per page (default: 50, max: 200) |
search | string | No | Search by name, email, or username |
role | string | No | Filter by role: VISITOR, MEMBER, CONFIDENTIAL, ADMIN |
status | string | No | Filter by status: active, suspended, banned |
verified | boolean | No | Filter by email verification status |
createdAfter | string | No | ISO date - users created after this date |
createdBefore | string | No | ISO date - users created before this date |
lastLoginAfter | string | No | ISO date - users logged in after this date |
sortBy | string | No | Sort field: createdAt, lastLogin, name, email |
sortOrder | string | No | Sort order: asc, desc (default: desc) |
GET /api/admin/users/{id}Get detailed information about a specific user.
PUT /api/admin/users/{id}/roleUpdate a user's role and permissions.
PUT /api/admin/users/{id}/statusUpdate a user's account status (suspend, ban, activate).
DELETE /api/admin/users/{id}Permanently delete a user account (GDPR compliance).
| Parameter | Type | Required | Description |
|---|---|---|---|
anonymize | boolean | No | Replace user data with anonymous placeholders (default: true) |
deleteContent | boolean | No | Delete all user-generated content (default: false) |
reason | string | Yes | Reason for account deletion |
GET /api/admin/analyticsGet comprehensive platform analytics and metrics.
| Parameter | Type | Required | Description |
|---|---|---|---|
period | string | No | Time period: hour, day, week, month, year (default: week) |
startDate | string | No | ISO date string for custom range |
endDate | string | No | ISO date string for custom range |
metrics | string[] | No | Specific metrics to include |
GET /api/admin/analytics/usersGet detailed user analytics.
| Parameter | Type | Required | Description |
|---|---|---|---|
groupBy | string | No | Group results by: day, week, month, role, status |
includeInactive | boolean | No | Include inactive users in results (default: false) |
GET /api/admin/configGet current system configuration settings.
PUT /api/admin/configUpdate system configuration settings.
POST /api/admin/config/rollbackRollback configuration changes.
GET /api/admin/auditGet audit logs for admin actions.
| Parameter | Type | Required | Description |
|---|---|---|---|
page | number | No | Page number (default: 1) |
limit | number | No | Logs per page (default: 50) |
action | string | No | Filter by action type |
userId | string | No | Filter by user who performed action |
targetUserId | string | No | Filter by user who was affected |
startDate | string | No | ISO date - logs after this date |
endDate | string | No | ISO date - logs before this date |
import { useState, useEffect } from 'react'
interface AdminStats {
totalUsers: number
activeUsers: number
newUsersToday: number
totalEntities: number
totalOpportunities: number
systemHealth: 'healthy' | 'warning' | 'critical'
}
export function AdminDashboard() {
const [stats, setStats] = useState<AdminStats | null>(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
fetchAdminStats()
}, [])
const fetchAdminStats = async () => {
try {
const [usersRes, analyticsRes] = await Promise.all([
fetch('/api/admin/users?limit=1'),
fetch('/api/admin/analytics?period=day')
])
const usersData = await usersRes.json()
const analyticsData = await analyticsRes.json()
setStats({
totalUsers: usersData.pagination.total,
activeUsers: analyticsData.userMetrics.activity.dailyActiveUsers,
newUsersToday: analyticsData.userMetrics.registrations.byDay.slice(-1)[0],
totalEntities: analyticsData.contentMetrics.entities.active,
totalOpportunities: analyticsData.contentMetrics.opportunities.posted,
systemHealth: analyticsData.systemMetrics.performance.errorRate < 0.01 ? 'healthy' :
analyticsData.systemMetrics.performance.errorRate < 0.05 ? 'warning' : 'critical'
})
} catch (error) {
console.error('Failed to fetch admin stats:', error)
} finally {
setLoading(false)
}
}
if (loading) return <div>Loading admin dashboard...</div>
return (
<div className="admin-dashboard">
<h1 className="text-2xl font-bold mb-6">Admin Dashboard</h1>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-6">
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">Total Users</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className="text-2xl font-bold">{stats?.totalUsers.toLocaleString()}</div>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">Active Today</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className="text-2xl font-bold">{stats?.activeUsers.toLocaleString()}</div>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">New Today</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className="text-2xl font-bold text-green-600">+{stats?.newUsersToday}</div>
</UiCardContent>
</UiCard>
<UiCard>
<UiCardHeader className="pb-2">
<UiCardTitle className="text-sm font-medium">System Health</UiCardTitle>
</UiCardHeader>
<UiCardContent>
<div className={`text-2xl font-bold ${
stats?.systemHealth === 'healthy' ? 'text-green-600' :
stats?.systemHealth === 'warning' ? 'text-yellow-600' : 'text-red-600'
}`}>
{stats?.systemHealth.toUpperCase()}
</div>
</UiCardContent>
</UiCard>
</div>
{/* Additional admin components */}
<UserManagement />
<SystemConfiguration />
<AuditLogs />
</div>
)
}
import { useState } from 'react'
import { Button } from '@/components/ui/button'
import { Badge } from '@/components/ui/badge'
interface User {
id: string
name: string
email: string
role: string
status: string
createdAt: string
}
export function UserManagement() {
const [users, setUsers] = useState<User[]>([])
const [loading, setLoading] = useState(false)
const updateUserRole = async (userId: string, newRole: string) => {
try {
setLoading(true)
const response = await fetch(`/api/admin/users/${userId}/role`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
role: newRole,
reason: 'Administrative role update',
notifyUser: true
})
})
if (response.ok) {
// Update local state
setUsers(users.map(user =>
user.id === userId ? { ...user, role: newRole } : user
))
}
} catch (error) {
console.error('Failed to update user role:', error)
} finally {
setLoading(false)
}
}
const suspendUser = async (userId: string) => {
try {
const response = await fetch(`/api/admin/users/${userId}/status`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
status: 'suspended',
reason: 'Administrative action',
duration: '7 days',
notifyUser: true
})
})
if (response.ok) {
setUsers(users.map(user =>
user.id === userId ? { ...user, status: 'suspended' } : user
))
}
} catch (error) {
console.error('Failed to suspend user:', error)
}
}
return (
<div className="user-management">
<h2 className="text-xl font-semibold mb-4">User Management</h2>
<div className="overflow-x-auto">
<table className="w-full border-collapse">
<thead>
<tr className="border-b">
<th className="text-left p-2">User</th>
<th className="text-left p-2">Role</th>
<th className="text-left p-2">Status</th>
<th className="text-left p-2">Joined</th>
<th className="text-left p-2">Actions</th>
</tr>
</thead>
<tbody>
{users.map(user => (
<tr key={user.id} className="border-b">
<td className="p-2">
<div>
<div className="font-medium">{user.name}</div>
<div className="text-sm text-gray-500">{user.email}</div>
</div>
</td>
<td className="p-2">
<Badge variant={user.role === 'ADMIN' ? 'destructive' : 'default'}>
{user.role}
</Badge>
</td>
<td className="p-2">
<Badge variant={
user.status === 'active' ? 'default' :
user.status === 'suspended' ? 'secondary' : 'destructive'
}>
{user.status}
</Badge>
</td>
<td className="p-2 text-sm text-gray-500">
{new Date(user.createdAt).toLocaleDateString()}
</td>
<td className="p-2">
<div className="flex gap-2">
<Button
size="sm"
variant="outline"
onClick={() => updateUserRole(user.id, 'CONFIDENTIAL')}
disabled={loading}
>
Promote
</Button>
<Button
size="sm"
variant="outline"
onClick={() => suspendUser(user.id)}
disabled={loading || user.status === 'suspended'}
>
Suspend
</Button>
</div>
</td>
</tr>
))}
</tbody>
</table>
</div>
</div>
)
}Admin Security Audit Logging System Protection Monitoring
Ring Platform's Admin API provides enterprise-grade administrative control with comprehensive security, audit trails, and operational monitoring.