mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 02:32:57 +00:00
dev day #62
This commit is contained in:
@@ -0,0 +1,226 @@
|
||||
# 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
|
||||
<NavItem to="/admin/docs" icon={FiBook}>
|
||||
Developer Docs
|
||||
</NavItem>
|
||||
```
|
||||
|
||||
And add the route:
|
||||
|
||||
```tsx
|
||||
// In admin routes
|
||||
<Route path="/admin/docs" element={<DevDocsPage />} />
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Status**: ✅ Complete API Implementation
|
||||
Reference in New Issue
Block a user