Code review fixes: wardrobe migration, response validation, path traversal guard, deduplication

- Migrate 11 character JSONs from old wardrobe keys to _BODY_GROUP_KEYS format
- Add is_favourite/is_nsfw columns to Preset model
- Add HTTP response validation and timeouts to ComfyUI client
- Add path traversal protection on replace cover route
- Deduplicate services/mcp.py (4 functions → 2 generic + 2 wrappers)
- Extract apply_library_filters() and clean_html_text() shared helpers
- Add named constants for 17 ComfyUI workflow node IDs
- Fix bare except clauses in services/llm.py
- Fix tags schema in ensure_default_outfit() (list → dict)
- Convert f-string logging to lazy % formatting
- Add 5-minute polling timeout to frontend waitForJob()
- Improve migration error handling (non-duplicate errors log at WARNING)
- Update CLAUDE.md to reflect all changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Aodhan Collins
2026-03-22 00:31:27 +00:00
parent 55ff58aba6
commit 29a6723b25
37 changed files with 464 additions and 539 deletions

View File

@@ -63,7 +63,7 @@ def register_routes(app):
clean_json = llm_response.replace('```json', '').replace('```', '').strip()
new_data = json.loads(clean_json)
except Exception as e:
logger.exception(f"Regenerate tags LLM error for {category}/{slug}")
logger.exception("Regenerate tags LLM error for %s/%s", category, slug)
return {'error': f'LLM error: {str(e)}'}, 500
# Preserve protected fields from original
@@ -106,7 +106,7 @@ def register_routes(app):
with open(file_path, 'w') as f:
json.dump(new_data, f, indent=2)
except Exception as e:
logger.warning(f"Could not write {file_path}: {e}")
logger.warning("Could not write %s: %s", file_path, e)
migrated += 1
@@ -122,7 +122,7 @@ def register_routes(app):
migrated += 1
db.session.commit()
logger.info(f"Migrated {migrated} resources from list tags to dict tags")
logger.info("Migrated %d resources from list tags to dict tags", migrated)
return {'success': True, 'migrated': migrated}
def _make_regen_task(category, slug, name, system_prompt):