Knowledge Article System - Technical Documentation ## System Architecture ### Overview The KA System is a local desktop application with a client-server architecture: - **Backend:** Node.js + Express + SQLite (sql.js) - **Frontend:** React (Vite) - **Database:** SQLite file-based database ### Components ``` knowledge_article_system/ ├── server/ # Backend │ ├── server.js # Express server │ ├── db.js # Database functions │ ├── ka.db # SQLite database (created at runtime) │ └── package.json # Dependencies │ └── client/ # Frontend ├── src/ │ ├── App.jsx # Main application component │ ├── components/ # UI components │ └── App.css # Styles └── package.json # Dependencies ``` --- ## Installation & Setup ### Prerequisites - Node.js (v16 or higher) - npm (comes with Node.js) ### First-Time Setup #### Backend Setup ```bash cd server npm install ``` Dependencies installed: - `express` - Web server framework - `sql.js` - SQLite database - `cors` - Cross-origin resource sharing #### Frontend Setup ```bash cd client/kb-frontend npm install ``` Dependencies installed: - `react` - UI framework - `vite` - Build tool and dev server - `react-quill` - Rich text editor (optional, currently using textarea) ### Running the Application #### Start Backend (Terminal 1) ```bash cd server node server.js ``` Server runs on: `http://localhost:9000` #### Start Frontend (Terminal 2) ```bash cd client/kb-frontend npm run dev ``` Frontend runs on: `http://localhost:5173` --- ## API Documentation ### Base URL ``` http://localhost:9000/api ``` ### Endpoints #### Get All Articles ``` GET /api/articles ``` Returns: Array of all articles, ordered by creation date (newest first) **Response:** ```json [ { "id": 1, "ka_number": "KA001", "title": "How to Reset Password", "content": "Steps to reset...", "created_at": "2024-11-24 12:00:00", "updated_at": null } ] ``` #### Get Single Article ``` GET /api/articles/:ka_number ``` Parameters: `ka_number` (e.g., "KA001") Returns: Single article object or 404 if not found #### Search Articles ``` GET /api/search?q={query} ``` Query Parameters: `q` - search term Searches across: title, content, and ka_number Returns: Array of matching articles #### Create Article ``` POST /api/articles ``` Headers: `Content-Type: application/json` Body: ```json { "title": "Article Title", "content": "Article content..." } ``` Returns: Newly created article with auto-generated KA number #### Update Article ``` PUT /api/articles/:ka_number ``` Headers: `Content-Type: application/json` Body: ```json { "title": "Updated Title", "content": "Updated content..." } ``` Returns: Updated article object #### Delete Article ``` DELETE /api/articles/:ka_number ``` Returns: Success message --- ## Database Schema ### Articles Table ```sql CREATE TABLE articles ( id INTEGER PRIMARY KEY AUTOINCREMENT, ka_number TEXT UNIQUE NOT NULL, title TEXT NOT NULL, content TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME ); CREATE INDEX idx_ka_number ON articles(ka_number); ``` ### Fields | Field | Type | Description | |-------|------|-------------| | id | INTEGER | Auto-incrementing primary key | | ka_number | TEXT | Unique identifier (KA001, KA002, etc.) | | title | TEXT | Article title (required) | | content | TEXT | Article content (HTML/text) | | created_at | DATETIME | Timestamp of creation | | updated_at | DATETIME | Timestamp of last update | ### KA Number Generation KA numbers are auto-generated sequentially: - Format: `KA` + 3-digit number padded with zeros - Examples: KA001, KA002, ..., KA999 - Logic in `db.js` → `getNextKANumber()` --- ## Code Structure ### Backend (server.js) **Key Components:** - Express server initialization - CORS configuration for frontend access - JSON body parsing middleware - API route handlers - Error handling **Important:** - `app.use(express.json())` must be present for POST/PUT requests - `app.use(cors())` allows frontend to make requests - Database is initialized before routes are registered ### Database Layer (db.js) **Functions:** - `initDb()` - Initialize/load database - `getAllArticles()` - Fetch all articles - `getArticle(ka_number)` - Get single article - `createArticle(title, content)` - Create new article - `updateArticle(ka_number, title, content)` - Update article - `deleteArticle(ka_number)` - Delete article - `searchArticles(query)` - Search articles **Key Points:** - Uses prepared statements for security - Database saved to disk after each write operation - KA numbers generated automatically ### Frontend (App.jsx) **State Management:** - `currentView` - Controls which view to show ('list', 'detail', 'edit') - `selectedArticle` - Currently selected article - `articles` - Array of articles for the list view **Key Functions:** - `handleSearch()` - Search or load all articles - `handleArticleClick()` - View article details - `handleEdit()` - Switch to edit mode - `handleSave()` - Save new or updated article - `handleDelete()` - Delete article - `handleCreateNew()` - Create new article **Component Tree:** ``` App ├── Header ├── SearchBar (list view) ├── ArticleList (list view) ├── ArticleDetail (detail view) └── ArticleEditor (edit view) ``` --- ## Maintenance ### Database Backup **Manual Backup:** ```bash # Stop the server first cp server/ka.db server/ka.db.backup-$(date +%Y%m%d) ``` **Automated Backup Script (Linux/Mac):** ```bash #!/bin/bash # save as backup-ka.sh SOURCE="./server/ka.db" DEST="./backups/ka.db.$(date +%Y%m%d-%H%M%S)" mkdir -p backups cp $SOURCE $DEST echo "Backup created: $DEST" # Keep only last 30 backups ls -t backups/ka.db.* | tail -n +31 | xargs rm -f ``` **Windows Backup Script:** ```batch @echo off REM save as backup-ka.bat set SOURCE=server\ka.db set DEST=backups\ka.db.%date:~-4,4%%date:~-10,2%%date:~-7,2% if not exist backups mkdir backups copy %SOURCE% %DEST% echo Backup created: %DEST% ``` ### Database Restore 1. Stop the backend server 2. Replace `server/ka.db` with backup file 3. Restart the server ### Troubleshooting **Server won't start:** - Check port 9000 is available - Verify npm dependencies installed - Check for syntax errors in server.js **Frontend won't connect:** - Verify backend is running on port 9000 - Check CORS is enabled in server.js - Clear browser cache **Database corruption:** - Restore from backup - If no backup, delete ka.db and restart (creates new empty database) **Search not working:** - Check database has articles - Verify search endpoint in server.js - Check browser console for errors --- ## Deployment ### Building for Production #### Backend Use `pkg` to create executable: ```bash npm install -g pkg cd server pkg server.js ``` Creates executables: - `server-win.exe` (Windows) - `server-linux` (Linux) - `server-macos` (macOS) #### Frontend Build static files: ```bash cd client/kb-frontend npm run build ``` Output in `dist/` folder - can be served by any static file server. ### Distribution COMING SOON --- ## Future Enhancements Potential features for Week 2+: - Rich text editor improvements - Article categories/tags - Attachment support (screenshots, logs) - Version history - Export to PDF - Article templates - User tracking (who created/edited) - Dark mode - Keyboard shortcuts --- ## Security Considerations **Current State:** - No authentication (local use only) - No input sanitization for XSS - SQL injection protected by prepared statements **For Production Use:** - Add user authentication - Implement role-based access control - Sanitize HTML content from editor - Add rate limiting - Use HTTPS - Validate all inputs --- ## Performance **Current Performance:** - Handles hundreds of articles easily - Search is fast with ka_number index - No pagination needed for small teams **If Database Grows:** - Add pagination to article list - Implement full-text search (SQLite FTS5) - Add more indexes - Consider caching frequently accessed articles --- ## Testing ### Manual Testing Checklist **Backend:** - [ ] Server starts without errors - [ ] All API endpoints return correct data - [ ] Create article returns new article with KA number - [ ] Update article modifies existing article - [ ] Delete article removes from database - [ ] Search returns relevant results **Frontend:** - [ ] Article list displays all articles - [ ] Search updates results correctly - [ ] Clicking article shows detail view - [ ] Edit button opens editor with current data - [ ] Save button updates article - [ ] Cancel button returns without saving - [ ] Delete button removes article after confirmation - [ ] Create new article generates KA number ### API Testing with curl ```bash # Create article curl -X POST http://localhost:9000/api/articles \ -H "Content-Type: application/json" \ -d '{"title":"Test","content":"Test content"}' # Get all articles curl http://localhost:9000/api/articles # Search curl "http://localhost:9000/api/search?q=test" # Update article curl -X PUT http://localhost:9000/api/articles/KA001 \ -H "Content-Type: application/json" \ -d '{"title":"Updated","content":"New content"}' # Delete article curl -X DELETE http://localhost:9000/api/articles/KA001 ``` --- ## Version History ### v0.0.1 (MVP) - Week 1 **Features:** - Basic CRUD operations (Create, Read, Update, Delete) - Search functionality (title, content, KA number) - Auto-generated KA numbers - Simple text editor (textarea) - Responsive layout - Local SQLite database **Known Limitations:** - No rich text editing (plain text/basic HTML only) - No authentication - No version history - No attachments - No categories/tags --- ## Support For issues or questions: - Check this documentation - Review USER_GUIDE.md for usage questions - Contact: Matt Taylor (developer) --- ## License MIT License