# Documentation API Routes ## Backend Routes Setup Add these routes to your `main.go` or router setup: ```go package main import ( "github.com/gin-gonic/gin" "your-app/internal/controllers" "your-app/internal/middleware" ) func setupDocsRoutes(router *gin.Engine) { // Initialize docs controller docsController := controllers.NewDocsController("./DOCS") // Admin-only documentation routes adminDocs := router.Group("/api/v1/admin/docs") adminDocs.Use(middleware.RequireAuth()) adminDocs.Use(middleware.RequireAdmin()) { // Get specific doc file adminDocs.GET("/file/*filepath", docsController.GetDocFile) // List all documentation files adminDocs.GET("/list", docsController.ListDocFiles) // Search documentation adminDocs.GET("/search", docsController.SearchDocs) } } ``` ## API Endpoints ### 1. Get Documentation File **GET** `/api/v1/admin/docs/file/:filepath` Get the content of a specific documentation file. **Parameters:** - `filepath` (path) - Path to the markdown file relative to DOCS folder **Example:** ```bash GET /api/v1/admin/docs/file/MYUIBRIX_ELEMENTOR_FEATURES.md ``` **Response:** ``` Content-Type: text/markdown # MyUIbrix Elementor Features ...markdown content... ``` --- ### 2. List Documentation Files **GET** `/api/v1/admin/docs/list` Get a list of all available documentation files. **Response:** ```json { "files": [ { "name": "MYUIBRIX_ELEMENTOR_FEATURES.md", "path": "/DOCS/MYUIBRIX_ELEMENTOR_FEATURES.md", "size": 52480, "modified_at": "2024-12-15T10:30:00Z" }, ... ], "total": 9 } ``` --- ### 3. Search Documentation **GET** `/api/v1/admin/docs/search?q=query` Search through all documentation files. **Parameters:** - `q` (query) - Search query string **Example:** ```bash GET /api/v1/admin/docs/search?q=inline editor ``` **Response:** ```json { "results": [ { "name": "MYUIBRIX_ELEMENTOR_FEATURES.md", "path": "/DOCS/MYUIBRIX_ELEMENTOR_FEATURES.md", "excerpt": "...inline editor activates...", "matches": 5 } ], "total": 1, "query": "inline editor" } ``` --- ## Frontend Integration Update your `DevDocsPage.tsx` to use the API: ```tsx // Load document content from API const loadDocument = async (docPath: string) => { setLoading(true); setSelectedDoc(docPath); try { const fileName = docPath.split('/').pop(); const response = await fetch(`/api/v1/admin/docs/file/${fileName}`, { headers: { 'Authorization': `Bearer ${getToken()}`, }, }); if (!response.ok) throw new Error('Failed to load document'); const content = await response.text(); setDocContent(content); } catch (error) { console.error('Error loading document:', error); toast({ title: 'Error loading document', status: 'error', }); } finally { setLoading(false); } }; ``` --- ## Security Considerations ### Access Control - All documentation routes require authentication - Only admin users can access documentation - Implements middleware checks ### Path Security - Prevents directory traversal attacks (`..` in paths) - Only allows `.md` files - Validates file paths before serving ### Implementation ```go // Prevent directory traversal if strings.Contains(docPath, "..") { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid file path"}) return } // Only allow markdown files if !strings.HasSuffix(fullPath, ".md") { c.JSON(http.StatusBadRequest, gin.H{"error": "Only markdown files are allowed"}) return } ``` --- ## Testing ### Test Get File ```bash curl -H "Authorization: Bearer YOUR_TOKEN" \ http://localhost:8080/api/v1/admin/docs/file/CSS_CLASSES_REFERENCE.md ``` ### Test List Files ```bash curl -H "Authorization: Bearer YOUR_TOKEN" \ http://localhost:8080/api/v1/admin/docs/list ``` ### Test Search ```bash curl -H "Authorization: Bearer YOUR_TOKEN" \ "http://localhost:8080/api/v1/admin/docs/search?q=custom%20css" ``` --- ## Add to Admin Navigation Update your admin navigation to include the docs link: ```tsx // In AdminLayout.tsx or similar Developer Docs ``` And add the route: ```tsx // In admin routes } /> ``` --- **Status**: ✅ Complete API Implementation