# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ### Added - Added `StorageBackend` protocol/interface for backend-agnostic storage (#33) - Added `health_check()` method to storage backend with `/health` endpoint integration (#33) - Added `verify_integrity()` method for post-upload hash validation (#33) - Added S3 configuration options: `s3_verify_ssl`, `s3_connect_timeout`, `s3_read_timeout`, `s3_max_retries` (#33) - Added `S3StorageUnavailableError` and `HashCollisionError` exception types (#33) - Added hash collision detection by comparing file sizes during deduplication (#33) - Added garbage collection endpoint `POST /api/v1/admin/garbage-collect` for orphaned artifacts (#36) - Added orphaned artifacts listing endpoint `GET /api/v1/admin/orphaned-artifacts` (#36) - Added global storage statistics endpoint `GET /api/v1/stats` (#34) - Added storage breakdown endpoint `GET /api/v1/stats/storage` (#34) - Added deduplication metrics endpoint `GET /api/v1/stats/deduplication` (#34) - Added per-project statistics endpoint `GET /api/v1/projects/{project}/stats` (#34) - Added per-package statistics endpoint `GET /api/v1/project/{project}/packages/{package}/stats` (#34) - Added per-artifact statistics endpoint `GET /api/v1/artifact/{id}/stats` (#34) - Added cross-project deduplication endpoint `GET /api/v1/stats/cross-project` (#34) - Added timeline statistics endpoint `GET /api/v1/stats/timeline` with daily/weekly/monthly periods (#34) - Added stats export endpoint `GET /api/v1/stats/export` with JSON/CSV formats (#34) - Added summary report endpoint `GET /api/v1/stats/report` with markdown/JSON formats (#34) - Added Dashboard page at `/dashboard` with storage and deduplication visualizations (#34) - Added pytest infrastructure with mock S3 client for unit testing (#35) - Added unit tests for SHA256 hash calculation (#35) - Added unit tests for duplicate detection and deduplication behavior (#35) - Added integration tests for upload scenarios and ref_count management (#35) - Added integration tests for S3 verification and failure cleanup (#35) - Added integration tests for all stats endpoints (#35) - Added integration tests for cascade deletion ref_count behavior (package/project delete) (#35) - Added integration tests for tag update ref_count adjustments (#35) - Added integration tests for garbage collection endpoints (#35) - Added integration tests for file size validation (#35) - Added test dependencies to requirements.txt (pytest, pytest-asyncio, pytest-cov, httpx, moto) (#35) - Added `ORCHARD_MAX_FILE_SIZE` config option (default: 10GB) for upload size limits (#37) - Added `ORCHARD_MIN_FILE_SIZE` config option (default: 1 byte, rejects empty files) (#37) - Added file size validation to upload and resumable upload endpoints (#37) - Added comprehensive deduplication design document (`docs/design/deduplication-design.md`) (#37) ### Fixed - Fixed Helm chart `minio.ingress` conflicting with Bitnami MinIO subchart by renaming to `minioIngress` (#48) - Fixed JSON report serialization error for Decimal types in `GET /api/v1/stats/report` (#34) - Fixed resumable upload double-counting ref_count when tag provided (removed manual increment, SQL triggers handle it) (#35) ## [0.3.0] - 2025-12-15 ### Changed - Changed default download mode from `proxy` to `presigned` for better performance (#48) ### Added - Added presigned URL support for direct S3 downloads (#48) - Added `ORCHARD_DOWNLOAD_MODE` config option (`presigned`, `redirect`, `proxy`) (#48) - Added `ORCHARD_PRESIGNED_URL_EXPIRY` config option (default: 3600 seconds) (#48) - Added `?mode=` query parameter to override download mode per-request (#48) - Added `/api/v1/project/{project}/{package}/+/{ref}/url` endpoint for getting presigned URLs (#48) - Added `PresignedUrlResponse` schema with URL, expiry, checksums, and artifact metadata (#48) - Added MinIO ingress support in Helm chart for presigned URL access (#48) - Added `orchard.download.mode` and `orchard.download.presignedUrlExpiry` Helm values (#48) - Added integrity verification workflow design document (#24) - Added `sha256` field to API responses for clarity (alias of `id`) (#25) - Added `checksum_sha1` field to artifacts table for compatibility (#25) - Added `s3_etag` field to artifacts table for S3 verification (#25) - Compute and store MD5, SHA1, and S3 ETag alongside SHA256 during upload (#25) - Added `Dockerfile.local` and `docker-compose.local.yml` for local development (#25) - Added migration script `003_checksum_fields.sql` for existing databases (#25) ## [0.2.0] - 2025-12-15 ### Added - Added `format` and `platform` fields to packages table (#16) - Added `checksum_md5` and `metadata` JSONB fields to artifacts table (#16) - Added `updated_at` field to tags table (#16) - Added `tag_name`, `user_agent`, `duration_ms`, `deduplicated`, `checksum_verified` fields to uploads table (#16) - Added `change_type` field to tag_history table (#16) - Added composite indexes for common query patterns (#16) - Added GIN indexes on JSONB fields for efficient JSON queries (#16) - Added partial index for public projects (#16) - Added database triggers for `updated_at` timestamps (#16) - Added database triggers for maintaining artifact `ref_count` accuracy (#16) - Added CHECK constraints for data integrity (`size > 0`, `ref_count >= 0`) (#16) - Added migration script `002_schema_enhancements.sql` for existing databases (#16) ### Changed - Updated images to use internal container BSF proxy (#46) ## [0.1.0] - 2025-12-12 ### Added - Added Prosper docker template config (#45) ### Changed - Changed the Dockerfile npm build arg to use the deps.global.bsf.tools URL as the default registry (#45)