* fix: resolve all Rubocop and ERBLint offenses
Rubocop (16 offenses):
- Style/IfUnlessModifier in account_logo_controller
- Lint/RedundantSafeNavigation in templates_documents_controller
- Layout/LineLength in templates_documents_controller, account_config
- Rails/WhereMissing in teams_controller
- Rails/WhereExists in send_submitter_reminder_email_job
- Style/StringLiterals in create_teams migration
- Metrics/* (disabled via inline comments for complex case statements)
ERBLint (10 errors):
- Void element self-closing tags (img /> → img >)
- Layout/ArgumentAlignment in reminder_queue
- Style/StringLiterals + Rails/LinkToBlank in navbar_buttons
- Layout/BlockAlignment in custom_content mailer
- Style/WordArray in role_select
* feat: add local CI via Docker and pre-push lint hook
- Add docker-compose.ci.yml: lint, brakeman, rspec services
- Add Dockerfile.ci: test environment with Ruby, Node, Chromium
- Add bin/lint: quick lint-only check
- Add bin/ci: full CI suite (lint + brakeman + rspec)
- Add .githooks/pre-push: auto-runs linters before push
- Update docker-compose.yml: use ghcr.io image instead of local build
Setup: git config core.hooksPath .githooks
Usage: bin/ci or bin/lint
---------
Co-authored-by: Sebastian Noe <sebastian.schneider@boxine.de>
Add optional 'revision' parameter to PUT /api/templates/:id and
PUT /api/templates/:id/documents. When present, creates a template
version snapshot (same mechanism as the UI editor's Save button).
This enables API consumers (e.g., deploy-docuseal.py) to create
revision history entries when updating templates programmatically.
Usage: include "revision": true in the request body.
Omit the parameter to skip version creation (backwards compatible).
- Add POST /api/templates/pdf for creating templates from PDF files
- Supports base64 content and URL file sources
- Supports external_id upsert, folder assignment, explicit field coords
- Supports embedded {{field;type=x;role=y}} text tag extraction
- Add PUT /api/templates/:id/documents for add/replace/remove operations
- Add Api::DecodeDocumentFile utility for shared base64/URL handling
- Add comprehensive API documentation in docs/API.md
- Add routes for new API endpoints