feat(backend,docker,docs): implement Go/Gin/SQLite REST API server, Docker containerization, and architecture specifications

- Implement standalone Go backend API server using Gin and pure-Go SQLite (modernc.org/sqlite)
- Add 11-table schema DDL migrations (000001_init.up.sql) based on DATA_TABLE.md
- Add seed data ingestion tool (cmd/seed) and static TypeScript content exporter (cmd/export-content)
- Add configuration loader (internal/config) supporting environment variables and .env files (HOST, PORT, DB_PATH, GIN_MODE, CORS_ALLOW_ORIGINS, AUTO_MIGRATE)
- Add lightweight multi-stage Dockerfile and docker-compose.yml with persistent SQLite volume
- Add comprehensive architecture specification (ARCHITECTURE.md) and REST API interface specification (API_INTERFACE.md)
- Harmonize frontend publications page to consume isHighlight flag from database-synced content
This commit is contained in:
2026-08-24 17:34:51 +09:00
parent 75bf334fec
commit fb6881070c
53 changed files with 8432 additions and 488 deletions
+2 -14
View File
@@ -7,21 +7,9 @@ export const metadata: Metadata = {
description: "AI Agent Networking Lab (ANL) research publications and patents overview",
};
const REPRESENTATIVE_HIGHLIGHT_TITLES = [
"Globally Integrated Trust Authority (GITA) for Resource-Constrained Edge Devices in IoT and 6G",
"Application Level Trust Authority (APPLETA) for Resource-Constrained Edge Devices in IoT and 6G",
"mQUIC: Use of QUIC for Handover Support with Connection Migration in Wireless/Mobile Networks",
"Use of QUIC for CoAP Transport in IoT Networks",
"Use of QUIC for Mobile-Oriented Future Internet (Q-MOFI)",
];
export default function PublicationsIndexPage() {
// Selected 5 representative publications
const highlights = REPRESENTATIVE_HIGHLIGHT_TITLES.map((title) =>
publications.find(
(p) => p.title.trim().toLowerCase() === title.trim().toLowerCase()
)
).filter((p): p is (typeof publications)[0] => Boolean(p));
// Selected representative publications (curated via database isHighlight flag)
const highlights = publications.filter((p) => p.isHighlight);
return (
<div className="container-content py-8 sm:py-12 space-y-10 sm:space-y-14">
+1 -1
View File
@@ -1,4 +1,4 @@
// AUTO-GENERATED by scripts/extract/generate_all.py — DO NOT EDIT BY HAND
// AUTO-GENERATED by backend/cmd/export-content — DO NOT EDIT BY HAND
import { Semester } from "./types";
export const semesters: Semester[] = [
+1 -1
View File
@@ -1,4 +1,4 @@
// AUTO-GENERATED by scripts/extract/generate_all.py — DO NOT EDIT BY HAND
// AUTO-GENERATED by backend/cmd/export-content — DO NOT EDIT BY HAND
import { Member, Alumnus } from "./types";
export const activeMembers: Member[] = [
+1 -1
View File
@@ -1,4 +1,4 @@
// AUTO-GENERATED by scripts/extract/generate_all.py — DO NOT EDIT BY HAND
// AUTO-GENERATED by backend/cmd/export-content — DO NOT EDIT BY HAND
import { ResearchProject } from "./types";
export const researchProjects: ResearchProject[] = [
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,4 +1,4 @@
// AUTO-GENERATED by scripts/extract/generate_all.py — DO NOT EDIT BY HAND
// AUTO-GENERATED by backend/cmd/export-content — DO NOT EDIT BY HAND
import { StandardsBody } from "./types";
export const standardsBodies: StandardsBody[] = [
+1
View File
@@ -31,6 +31,7 @@ export interface Publication {
publishedAt: string; // ISO 8601 YYYY-MM or YYYY-MM-DD
kci?: boolean;
doi?: string;
isHighlight?: boolean;
}
export interface Patent {