makerstash/FEATURES_IMPLEMENTED.md

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 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:

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 files
  • GET /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

  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

# 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.