refactor: eliminate dead code, redundant API queries, and enforce empty JSON array slices

- Remove redundant adminGetStatsSummary query and unused AdminStatsSummary interface
- Initialize empty repository slices with make([]T, 0) to ensure empty JSON arrays instead of null
- Add optional chaining in dashboard aggregations for strict null-safety
- Passed 100% unanimous peer reviews from planner-reviewer-claude-01 and reviewer-cline-01
This commit is contained in:
2026-08-25 15:47:31 +09:00
parent 4c78ea819f
commit d3dc7f19d9
8 changed files with 32 additions and 41 deletions
+21 -18
View File
@@ -4,7 +4,6 @@ import React, { useEffect, useState } from "react";
import Link from "next/link";
import { AdminHeader, AlertBanner } from "./_components/AdminComponents";
import {
adminGetStatsSummary,
adminGetResearchProjects,
adminGetResearchAreas,
adminGetMembers,
@@ -13,11 +12,9 @@ import {
adminGetPatents,
adminGetSemesters,
adminGetStandardsBodies,
AdminStatsSummary,
} from "../../lib/adminApi";
export default function AdminDashboardPage() {
const [stats, setStats] = useState<AdminStatsSummary | null>(null);
const [counts, setCounts] = useState<{
projects: number;
areas: number;
@@ -51,7 +48,6 @@ export default function AdminDashboardPage() {
try {
setIsLoading(true);
const [
statsData,
projects,
areas,
members,
@@ -62,7 +58,6 @@ export default function AdminDashboardPage() {
semesters,
bodies,
] = await Promise.all([
adminGetStatsSummary().catch(() => null),
adminGetResearchProjects().catch(() => []),
adminGetResearchAreas().catch(() => []),
adminGetMembers().catch(() => []),
@@ -74,25 +69,33 @@ export default function AdminDashboardPage() {
adminGetStandardsBodies().catch(() => []),
]);
if (statsData) setStats(statsData);
const safeProjects = projects || [];
const safeAreas = areas || [];
const safeMembers = members || [];
const safeAlumni = alumni || [];
const safeIntlPubs = intlPubs || [];
const safeDomPubs = domPubs || [];
const safePatents = patents || [];
const safeSemesters = semesters || [];
const safeBodies = bodies || [];
const totalCourses = semesters.reduce((acc, s) => acc + (s.courses?.length || 0), 0);
const totalDocs = bodies.reduce(
(acc, b) => acc + (b.projects?.reduce((pAcc, p) => pAcc + (p.documents?.length || 0), 0) || 0),
const totalCourses = safeSemesters.reduce((acc, s) => acc + (s?.courses?.length || 0), 0);
const totalDocs = safeBodies.reduce(
(acc, b) => acc + ((b?.projects || []).reduce((pAcc, p) => pAcc + (p?.documents?.length || 0), 0) || 0),
0
);
setCounts({
projects: projects.length,
areas: areas.length,
members: members.length,
alumni: alumni.length,
intlPubs: intlPubs.length,
domPubs: domPubs.length,
patents: patents.length,
semesters: semesters.length,
projects: safeProjects.length,
areas: safeAreas.length,
members: safeMembers.length,
alumni: safeAlumni.length,
intlPubs: safeIntlPubs.length,
domPubs: safeDomPubs.length,
patents: safePatents.length,
semesters: safeSemesters.length,
courses: totalCourses,
bodies: bodies.length,
bodies: safeBodies.length,
docs: totalDocs,
});
} catch (err: any) {
-11
View File
@@ -149,12 +149,6 @@ export interface AdminStandardsBody {
projects: AdminStandardProjectGroup[];
}
export interface AdminStatsSummary {
intl_publications: number;
standardization_docs: number;
patents: number;
}
async function request<T>(
endpoint: string,
options: RequestInit = {},
@@ -208,11 +202,6 @@ export async function adminVerifyToken(token: string): Promise<boolean> {
}
}
// 1. Stats Summary
export async function adminGetStatsSummary(): Promise<AdminStatsSummary> {
return request<AdminStatsSummary>("/stats/summary");
}
// 2. Research Projects
export async function adminGetResearchProjects(): Promise<AdminResearchProject[]> {
return request<AdminResearchProject[]>("/research-projects");
@@ -150,7 +150,7 @@ def verify():
try:
def fetch_json(endpoint):
req = urllib.request.Request(f"{API_BASE_URL}{endpoint}", headers={"User-Agent": "DataVerifier"})
with urllib.request.urlopen(req, timeout=3) as resp:
with urllib.request.urlopen(req, timeout=10) as resp:
data = json.loads(resp.read().decode("utf-8"))
return data.get("data", [])
@@ -202,8 +202,7 @@ def verify():
print(" ✅ Live REST API endpoints serve 100% losslessly verified data")
except Exception as e:
print(f" ⚠️ Live API transient query skipped ({e})")
# If SQLite DB was already verified, don't fail the whole static gate on background live server fluctuation
errors.append(f"Live API verification error: {e}")
else:
print(f"\n️ Live Go API server not responding at {API_BASE_URL} (tested offline DB mode)")