veza/veza-backend-api/internal
senke ac31a54405 feat(tracks): migrate chunked upload to S3 post-assembly (v1.0.8 P1)
After `CompleteChunkedUpload` lands the assembled file on local FS,
stream it to S3 and delete the local copy when TrackService is in
s3-backend mode. Symmetrical to copyFileAsyncS3 for regular uploads
(`f47141fe`), closing the Phase 1 write path.

Changes:

- internal/core/track/service.go
  - New method: `TrackService.MigrateLocalToS3IfConfigured(ctx, trackID,
    userID, localPath)`. Opens local file, streams to S3 at
    tracks/<userID>/<trackID>.<ext>, updates DB row
    (storage_backend='s3', storage_key=<key>), removes local file.
    No-op when storageBackend != 's3' or s3Service == nil.
  - New method: `TrackService.IsS3Backend() bool` — convenience for
    handlers that need to skip path-based transcode triggers when the
    file has been migrated off local FS.

- internal/core/track/track_upload_handler.go
  - `CompleteChunkedUpload`: after `CreateTrackFromPath` succeeds, call
    `MigrateLocalToS3IfConfigured` with a dedicated 10-min context
    (S3 stream of up to 500MB can outlive the HTTP request ctx).
  - Migration failure is logged but does NOT fail the HTTP response —
    the track row exists locally; admin can re-migrate via
    cmd/migrate_storage (Phase 3).
  - When `IsS3Backend()`, skip the two path-based transcode triggers
    (streamService.StartProcessing + jobEnqueuer.EnqueueTranscodingJob).
    Phase 2 will re-wire them against signed URLs. For now, tracks
    routed to S3 sit in Processing status until Phase 2 lands — same
    trade-off as copyFileAsyncS3.

Out of scope (Phase 2 wires these): read path for S3-backed tracks,
transcoder reading from signed URL, HLS segments to MinIO.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 23:23:24 +02:00
..
api feat(tracks): wire S3 storage backend into TrackService.UploadTrack (v1.0.8 P1) 2026-04-23 23:20:17 +02:00
common v0.9.2 2026-03-05 19:27:34 +01:00
config feat(storage): add track storage_backend column + config prep (v1.0.8 P0) 2026-04-23 19:54:28 +02:00
core feat(tracks): migrate chunked upload to S3 post-assembly (v1.0.8 P1) 2026-04-23 23:23:24 +02:00
database v0.9.4 2026-03-05 23:03:43 +01:00
dto Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy 2026-02-14 17:23:32 +01:00
elasticsearch style(backend): gofmt -w on 85 files (whitespace only) 2026-04-14 12:22:14 +02:00
email refactor(backend,infra): unify SMTP env schema on canonical SMTP_* names 2026-04-16 20:44:09 +02:00
errors v0.9.8 2026-03-06 19:13:16 +01:00
eventbus fix(eventbus): log RabbitMQ publish failures instead of silent drop 2026-04-16 20:50:51 +02:00
features adding initial backend API (Go) 2025-12-03 20:29:37 +01:00
handlers feat(marketplace): async stripe connect reversal worker — v1.0.7 item B day 2 2026-04-17 15:34:29 +02:00
infrastructure v0.9.4 2026-03-05 23:03:43 +01:00
integration style(backend): gofmt -w on 85 files (whitespace only) 2026-04-14 12:22:14 +02:00
interfaces adding initial backend API (Go) 2025-12-03 20:29:37 +01:00
jobs feat(webhooks): persist raw hyperswitch payloads to audit log — v1.0.7 item E 2026-04-18 02:44:58 +02:00
logging style(backend): gofmt -w on 85 files (whitespace only) 2026-04-14 12:22:14 +02:00
metrics v0.9.4 2026-03-05 23:03:43 +01:00
middleware feat(middleware): wire UserRateLimiter into AuthMiddleware (BE-SVC-002) 2026-04-21 09:52:07 +02:00
models feat(storage): add track storage_backend column + config prep (v1.0.8 P0) 2026-04-23 19:54:28 +02:00
monitoring feat(metrics): ledger-health gauges + alert rules — v1.0.7 item F 2026-04-18 03:40:14 +02:00
pagination v0.9.8 2026-03-06 19:13:16 +01:00
recovery chore(v0.102): consolidate remaining changes — docs, frontend, backend 2026-02-20 13:02:12 +01:00
repositories fix(v0.12.6.1): remediate 2 CRITICAL + 10 HIGH + 1 MEDIUM pentest findings 2026-03-12 05:40:53 +01:00
resilience chore: consolidate CI, E2E, backend and frontend updates 2026-02-17 16:43:21 +01:00
response fix: stabilize builds, tests, and lint across all stacks 2026-04-05 16:48:07 +02:00
security refactor(backend): replace 40 fmt.Printf calls with zap structured logging 2026-02-22 17:44:38 +01:00
services feat(s3): add UploadStream + GetSignedURL with explicit TTL (v1.0.8 P1 prep) 2026-04-23 20:49:19 +02:00
shutdown incus deployement fully implemented, Makefile updated and make fmt ran 2026-01-13 19:47:57 +01:00
testutils ci: retire legacy backend-ci.yml, centralize Docker probe in SkipIfNoIntegration 2026-04-15 16:12:45 +02:00
tracing incus deployement fully implemented, Makefile updated and make fmt ran 2026-01-13 19:47:57 +01:00
types feat(profile): add profile privacy toggle (B3) 2026-02-20 15:10:02 +01:00
upload [INT-015] int: Add file upload format standardization 2025-12-25 15:40:01 +01:00
utils fix(v0.12.6): apply all pentest remediations — 36 findings across 36 files 2026-03-14 00:44:46 +01:00
validators feat(v0.13.3): complete - Polish Sécurité Avancée 2026-03-13 10:09:01 +01:00
websocket style(backend): gofmt -w on 85 files (whitespace only) 2026-04-14 12:22:14 +02:00
workers fix(backend): J4 — GDPR-compliant hard delete with Redis and ES cleanup 2026-04-15 12:25:39 +02:00