Skip to content

Commit 3d9f39d

Browse files
committed
Fix admins in about page being not public
1 parent c4b0c71 commit 3d9f39d

File tree

5 files changed

+58
-3
lines changed

5 files changed

+58
-3
lines changed

backend/app/factory.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from .config import get_settings
1010
from .database import create_tables
1111
from .logging_config import LoggingManager, request_id_var, request_start_time_var, get_logger
12-
from .routers import health, commits, binaries, environments, runs, benchmarks, upload, admin
12+
from .routers import health, commits, binaries, environments, runs, benchmarks, upload, admin, public
1313

1414

1515
def create_app(settings=None) -> FastAPI:
@@ -155,5 +155,6 @@ async def startup_event():
155155
app.include_router(benchmarks.router)
156156
app.include_router(upload.router)
157157
app.include_router(admin.router)
158+
app.include_router(public.router)
158159

159160
return app

backend/app/routers/public.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"""
2+
Public API routes that don't require authentication.
3+
"""
4+
5+
import logging
6+
from typing import List
7+
from fastapi import APIRouter, Depends
8+
from sqlalchemy import select
9+
from sqlalchemy.ext.asyncio import AsyncSession
10+
11+
from ..database import get_database
12+
from ..models import AdminUser
13+
from ..schemas import AdminUserPublic
14+
15+
logger = logging.getLogger(__name__)
16+
17+
router = APIRouter(prefix="/api", tags=["public"])
18+
19+
20+
@router.get("/maintainers", response_model=List[AdminUserPublic])
21+
async def get_maintainers(
22+
db: AsyncSession = Depends(get_database),
23+
):
24+
"""Get list of active maintainers (admin users) - public endpoint."""
25+
# Only return active admin users
26+
result = await db.execute(
27+
select(AdminUser)
28+
.where(AdminUser.is_active == True)
29+
.order_by(AdminUser.added_at)
30+
)
31+
admin_users = result.scalars().all()
32+
33+
return admin_users

backend/app/schemas.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,14 @@ class BenchmarkUpload(BaseModel):
169169
environment_id: str
170170
python_version: PythonVersion
171171
benchmark_results: List[BenchmarkResultJson]
172+
173+
174+
class AdminUserPublic(BaseModel):
175+
id: int
176+
github_username: str
177+
added_by: str
178+
added_at: datetime
179+
is_active: bool
180+
181+
class Config:
182+
from_attributes = True

frontend/src/app/about/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@ export default function AboutPage() {
3535
useEffect(() => {
3636
const fetchAdminUsers = async () => {
3737
try {
38-
const users = await api.getAdminUsers();
38+
const users = await api.getMaintainers();
3939
setAdminUsers(users.filter(user => user.is_active));
4040
} catch (error) {
41-
console.error('Failed to fetch admin users:', error);
41+
console.error('Failed to fetch maintainers:', error);
4242
// Fallback to hardcoded admin if API fails
4343
setAdminUsers([{
4444
id: 1,

frontend/src/lib/api.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,16 @@ export const api = {
307307
}>>('/admin/users', {
308308
credentials: 'include',
309309
}),
310+
311+
// Public endpoints
312+
getMaintainers: () =>
313+
fetchApi<Array<{
314+
id: number;
315+
github_username: string;
316+
added_by: string;
317+
added_at: string;
318+
is_active: boolean;
319+
}>>('/maintainers'),
310320
};
311321

312322
export default api;

0 commit comments

Comments
 (0)