7.6 KiB
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 byteshasSupports- 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"] }
- Body:
POST /api/bulk/move- Move models to collection- Body:
{ modelIds: [1,2,3], collectionId: 5 }
- Body:
POST /api/bulk/delete- Delete multiple models- Body:
{ modelIds: [1,2,3] }
- Body:
3. Nested Collections (✓ Complete)
File: server/routes/collections.js, server/database.js
Database Changes:
- Added
parent_idfield to collections table - Supports unlimited nesting depth
API Changes:
GET /api/collections- Returns hierarchical structurePOST /api/collections- AcceptsparentIdparameter- Response includes
childrenarray andparent_name
4. Print Queue Management (✓ Complete)
File: server/routes/printQueue.js
Endpoints:
GET /api/print-queue- Get user's queuePOST /api/print-queue- Add model to queue- Body:
{ modelId: 1, priority: 5, notes: "..." }
- Body:
PUT /api/print-queue/:id- Update queue item- Body:
{ priority: 10, status: "completed" }
- Body:
DELETE /api/print-queue/:id- Remove from queuePOST /api/print-queue/reorder- Reorder entire queue- Body:
{ queueOrder: [{id: 1, priority: 10}, {id: 2, priority: 5}] }
- Body:
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] }
- Body:
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
- Body:
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_primaryflag 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:
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:
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 filesGET /api/models/:id/download-all- ZIP all files
CSS Classes Needed
/* 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
-
Update
client/index.html:- Add filter controls to sidebar
- Add bulk selection checkboxes
- Add print queue section
- Add export/import buttons
-
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
-
Update
client/styles.css:- Add styles for new UI elements
- Ensure mobile responsiveness
-
Test all features:
- Verify filters work correctly
- Test bulk operations
- Test nested collections
- Test print queue
- Test export/import
API Testing Commands
# 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_idfor nesting - model_files: Added
is_primaryflag - print_queue: New table for queue management
All tables are created automatically on server start.