272 lines
7.6 KiB
Markdown
272 lines
7.6 KiB
Markdown
# MakerStash - New Features Implementation
|
|
|
|
## Backend Features Completed
|
|
|
|
### 1. Search Filters & Sorting (✓ Complete)
|
|
**File:** `server/routes/models.js`
|
|
|
|
**New Query Parameters:**
|
|
- `fileType` - Filter by file extension (.stl, .3mf, .obj, etc.)
|
|
- `minSize` / `maxSize` - Filter by file size in bytes
|
|
- `hasSupports` - Filter by support status (true/false)
|
|
- `sortBy` - Sort field (name, created_at, updated_at, file_size)
|
|
- `sortOrder` - Sort direction (ASC/DESC)
|
|
|
|
**API Example:**
|
|
```
|
|
GET /api/models?fileType=.stl&sortBy=name&sortOrder=ASC&hasSupports=true
|
|
```
|
|
|
|
### 2. Bulk Operations (✓ Complete)
|
|
**File:** `server/routes/bulk.js`
|
|
|
|
**Endpoints:**
|
|
- `POST /api/bulk/tag` - Add tags to multiple models
|
|
- Body: `{ modelIds: [1,2,3], tags: ["tag1", "tag2"] }`
|
|
- `POST /api/bulk/move` - Move models to collection
|
|
- Body: `{ modelIds: [1,2,3], collectionId: 5 }`
|
|
- `POST /api/bulk/delete` - Delete multiple models
|
|
- Body: `{ modelIds: [1,2,3] }`
|
|
|
|
### 3. Nested Collections (✓ Complete)
|
|
**File:** `server/routes/collections.js`, `server/database.js`
|
|
|
|
**Database Changes:**
|
|
- Added `parent_id` field to collections table
|
|
- Supports unlimited nesting depth
|
|
|
|
**API Changes:**
|
|
- `GET /api/collections` - Returns hierarchical structure
|
|
- `POST /api/collections` - Accepts `parentId` parameter
|
|
- Response includes `children` array and `parent_name`
|
|
|
|
### 4. Print Queue Management (✓ Complete)
|
|
**File:** `server/routes/printQueue.js`
|
|
|
|
**Endpoints:**
|
|
- `GET /api/print-queue` - Get user's queue
|
|
- `POST /api/print-queue` - Add model to queue
|
|
- Body: `{ modelId: 1, priority: 5, notes: "..." }`
|
|
- `PUT /api/print-queue/:id` - Update queue item
|
|
- Body: `{ priority: 10, status: "completed" }`
|
|
- `DELETE /api/print-queue/:id` - Remove from queue
|
|
- `POST /api/print-queue/reorder` - Reorder entire queue
|
|
- Body: `{ queueOrder: [{id: 1, priority: 10}, {id: 2, priority: 5}] }`
|
|
|
|
### 5. Export/Backup (✓ Complete)
|
|
**File:** `server/routes/export.js`
|
|
|
|
**Endpoints:**
|
|
- `GET /api/export/all` - Export all user's models as ZIP
|
|
- Includes models, thumbnails, and metadata.json
|
|
- `POST /api/export/models` - Export specific models
|
|
- Body: `{ modelIds: [1,2,3] }`
|
|
|
|
### 6. Import from URLs (✓ Complete)
|
|
**File:** `server/routes/import.js`
|
|
|
|
**Endpoints:**
|
|
- `POST /api/import/url` - Import from Thingiverse/Printables/MakerWorld
|
|
- Body: `{ url: "https://..." }`
|
|
- Scrapes metadata (name, description, creator)
|
|
- Downloads file if available (requires authentication on most sites)
|
|
- Creates model entry with source URL
|
|
|
|
**Note:** Most 3D model sites require authentication to download files. The scraper captures metadata but users may need to manually download and upload files.
|
|
|
|
### 7. Multi-File Support (Database Ready)
|
|
**File:** `server/database.js`
|
|
|
|
**Database Table:** `model_files`
|
|
- Supports multiple files per model
|
|
- `is_primary` flag to identify main file
|
|
- Ready for frontend implementation
|
|
|
|
## Frontend Features To Implement
|
|
|
|
### 1. Search Filters UI
|
|
**Location:** Add to sidebar in `client/index.html`
|
|
|
|
**Elements Needed:**
|
|
- File type dropdown (.stl, .3mf, .obj, .gcode, .zip)
|
|
- Size range sliders (min/max)
|
|
- Support status checkbox
|
|
- Sort by dropdown (Name, Date, Size)
|
|
- Sort order toggle (A-Z / Z-A)
|
|
|
|
**JavaScript:** Update `loadAllModels()` in `client/app.js` to pass filter parameters
|
|
|
|
### 2. Bulk Operations UI
|
|
**Elements Needed:**
|
|
- Checkbox on each model card
|
|
- "Select All" button
|
|
- Bulk actions toolbar (appears when items selected):
|
|
- Add Tags button
|
|
- Move to Collection button
|
|
- Delete button
|
|
- Modal dialogs for bulk tag/move operations
|
|
|
|
**JavaScript Functions:**
|
|
```javascript
|
|
let selectedModels = [];
|
|
|
|
function toggleModelSelection(modelId) {
|
|
// Toggle selection
|
|
}
|
|
|
|
function bulkAddTags() {
|
|
// Show modal, then POST /api/bulk/tag
|
|
}
|
|
|
|
function bulkMove() {
|
|
// Show modal with collection picker, then POST /api/bulk/move
|
|
}
|
|
|
|
function bulkDelete() {
|
|
// Confirm, then POST /api/bulk/delete
|
|
}
|
|
```
|
|
|
|
### 3. Sorting UI
|
|
**Location:** Above model grid
|
|
|
|
**Elements:**
|
|
- Sort dropdown: Name, Date Added, Last Updated, File Size
|
|
- Direction toggle button (↑↓)
|
|
|
|
**Update:** Modify `loadAllModels()` to include sortBy and sortOrder parameters
|
|
|
|
### 4. Nested Collections UI
|
|
**Location:** Sidebar collections list
|
|
|
|
**Changes:**
|
|
- Display collections as tree structure
|
|
- Indent child collections
|
|
- Add "+" button to create subcollection
|
|
- Update create collection modal to include parent selector
|
|
|
|
**JavaScript:**
|
|
```javascript
|
|
function renderCollectionsTree(collections, level = 0) {
|
|
// Recursive rendering with indentation
|
|
}
|
|
```
|
|
|
|
### 5. Print Queue UI
|
|
**Location:** New section in sidebar or separate page
|
|
|
|
**Elements:**
|
|
- List of queued models
|
|
- Drag-and-drop reordering
|
|
- Priority number input
|
|
- Status indicators (pending/completed)
|
|
- "Add to Queue" button on model details
|
|
- Notes field per queue item
|
|
|
|
**New modals:**
|
|
- Print Queue modal with full queue list
|
|
- Add to queue confirmation
|
|
|
|
### 6. Export/Import UI
|
|
**Location:** User menu or settings
|
|
|
|
**Elements:**
|
|
- "Export All Models" button → downloads ZIP
|
|
- "Export Selected" button (with bulk selection)
|
|
- "Import from URL" button → shows modal with URL input
|
|
- Support for Thingiverse, Printables, MakerWorld URLs
|
|
|
|
### 7. Multi-File Upload
|
|
**Changes to upload modal:**
|
|
- Allow multiple file selection
|
|
- Show list of selected files
|
|
- Mark one as primary (for thumbnail generation)
|
|
- On download, create ZIP of all files
|
|
|
|
**Backend endpoint needed:**
|
|
- `POST /api/models` - Update to accept multiple files
|
|
- `GET /api/models/:id/download-all` - ZIP all files
|
|
|
|
## CSS Classes Needed
|
|
|
|
```css
|
|
/* Bulk Selection */
|
|
.model-card.selected { border: 2px solid var(--primary-color); }
|
|
.model-checkbox { position: absolute; top: 10px; left: 10px; }
|
|
.bulk-toolbar { position: fixed; bottom: 20px; ... }
|
|
|
|
/* Nested Collections */
|
|
.collection-item.nested { padding-left: 20px; }
|
|
.collection-item.level-2 { padding-left: 40px; }
|
|
|
|
/* Print Queue */
|
|
.queue-item { draggable: true; }
|
|
.queue-item.dragging { opacity: 0.5; }
|
|
|
|
/* Filters */
|
|
.filter-section { margin-bottom: 20px; }
|
|
.filter-group { margin-bottom: 10px; }
|
|
```
|
|
|
|
## Next Steps
|
|
|
|
1. **Update `client/index.html`:**
|
|
- Add filter controls to sidebar
|
|
- Add bulk selection checkboxes
|
|
- Add print queue section
|
|
- Add export/import buttons
|
|
|
|
2. **Update `client/app.js`:**
|
|
- Implement filter parameter building
|
|
- Add bulk selection functions
|
|
- Add print queue functions
|
|
- Add export/import functions
|
|
- Update loadAllModels() to support all filters
|
|
|
|
3. **Update `client/styles.css`:**
|
|
- Add styles for new UI elements
|
|
- Ensure mobile responsiveness
|
|
|
|
4. **Test all features:**
|
|
- Verify filters work correctly
|
|
- Test bulk operations
|
|
- Test nested collections
|
|
- Test print queue
|
|
- Test export/import
|
|
|
|
## API Testing Commands
|
|
|
|
```bash
|
|
# Test filters
|
|
curl "http://localhost:3000/api/models?fileType=.stl&sortBy=name"
|
|
|
|
# Test bulk tag
|
|
curl -X POST http://localhost:3000/api/bulk/tag \\
|
|
-H "Authorization: Bearer YOUR_TOKEN" \\
|
|
-H "Content-Type: application/json" \\
|
|
-d '{"modelIds":[1,2],"tags":["test"]}'
|
|
|
|
# Test export
|
|
curl http://localhost:3000/api/export/all \\
|
|
-H "Authorization: Bearer YOUR_TOKEN" \\
|
|
-o export.zip
|
|
|
|
# Test import
|
|
curl -X POST http://localhost:3000/api/import/url \\
|
|
-H "Authorization: Bearer YOUR_TOKEN" \\
|
|
-H "Content-Type: application/json" \\
|
|
-d '{"url":"https://www.thingiverse.com/thing:..."}'
|
|
|
|
# Test print queue
|
|
curl http://localhost:3000/api/print-queue \\
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|
```
|
|
|
|
## Database Schema Summary
|
|
|
|
### Updated Tables:
|
|
- **collections**: Added `parent_id` for nesting
|
|
- **model_files**: Added `is_primary` flag
|
|
- **print_queue**: New table for queue management
|
|
|
|
All tables are created automatically on server start.
|