()
| 115 | * Returns separate routers for page routes (/admin/addie/*) and API routes (/api/admin/addie/*) |
| 116 | */ |
| 117 | export function createAddieAdminRouter(): { pageRouter: Router; apiRouter: Router } { |
| 118 | const pageRouter = Router(); |
| 119 | const apiRouter = Router(); |
| 120 | |
| 121 | // ========================================================================= |
| 122 | // ADMIN PAGE ROUTES (mounted at /admin/addie) |
| 123 | // ========================================================================= |
| 124 | |
| 125 | // Main Addie dashboard |
| 126 | pageRouter.get("/", requireAuth, requireAdmin, (req, res) => { |
| 127 | serveHtmlWithConfig(req, res, "admin-addie.html").catch((err) => { |
| 128 | logger.error({ err }, "Error serving Addie admin page"); |
| 129 | res.status(500).send("Internal server error"); |
| 130 | }); |
| 131 | }); |
| 132 | |
| 133 | // ========================================================================= |
| 134 | // KNOWLEDGE MANAGEMENT API (mounted at /api/admin/addie/knowledge) |
| 135 | // ========================================================================= |
| 136 | |
| 137 | // GET /api/admin/addie/knowledge - List all knowledge documents |
| 138 | apiRouter.get("/knowledge", requireAuth, requireAdmin, async (req, res) => { |
| 139 | try { |
| 140 | const { category, active_only, source_type, status, limit, offset } = req.query; |
| 141 | |
| 142 | const { rows: documents, total } = await addieDb.listKnowledge({ |
| 143 | category: category as string | undefined, |
| 144 | sourceType: source_type as string | undefined, |
| 145 | fetchStatus: status as string | undefined, |
| 146 | activeOnly: active_only !== "false", |
| 147 | limit: clampLimit(limit, 100, 500), |
| 148 | offset: clampOffset(offset), |
| 149 | }); |
| 150 | |
| 151 | res.json({ |
| 152 | documents, |
| 153 | total, |
| 154 | }); |
| 155 | } catch (error) { |
| 156 | logger.error({ err: error }, "Error fetching knowledge documents"); |
| 157 | res.status(500).json({ |
| 158 | error: "Internal server error", |
| 159 | message: "Unable to fetch knowledge documents", |
| 160 | }); |
| 161 | } |
| 162 | }); |
| 163 | |
| 164 | // GET /api/admin/addie/knowledge/categories - Get category list with counts |
| 165 | apiRouter.get("/knowledge/categories", requireAuth, requireAdmin, async (req, res) => { |
| 166 | try { |
| 167 | const categories = await addieDb.getKnowledgeCategories(); |
| 168 | res.json({ categories }); |
| 169 | } catch (error) { |
| 170 | logger.error({ err: error }, "Error fetching knowledge categories"); |
| 171 | res.status(500).json({ |
| 172 | error: "Internal server error", |
| 173 | message: "Unable to fetch knowledge categories", |
| 174 | }); |
no test coverage detected