# 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