Store SHA256 checksums with artifacts and add multiple hash support
- Add sha256 field to API responses as explicit alias of artifact id - Add checksum_sha1 and s3_etag fields to artifacts table - Compute MD5, SHA1, and capture S3 ETag during upload - Update StorageResult to return all checksums from storage layer - Add migration 003_checksum_fields.sql for existing databases - Add Dockerfile.local and docker-compose.local.yml for local development - Update schemas to include all checksum fields in responses
This commit is contained in:
@@ -520,40 +520,51 @@ def upload_artifact(
|
||||
)
|
||||
|
||||
# Store file (uses multipart for large files)
|
||||
sha256_hash, size, s3_key = storage.store(file.file, content_length)
|
||||
storage_result = storage.store(file.file, content_length)
|
||||
|
||||
# Check if this is a deduplicated upload
|
||||
deduplicated = False
|
||||
|
||||
# Create or update artifact record
|
||||
artifact = db.query(Artifact).filter(Artifact.id == sha256_hash).first()
|
||||
artifact = db.query(Artifact).filter(Artifact.id == storage_result.sha256).first()
|
||||
if artifact:
|
||||
artifact.ref_count += 1
|
||||
deduplicated = True
|
||||
# Merge metadata if new metadata was extracted
|
||||
if file_metadata and artifact.format_metadata:
|
||||
artifact.format_metadata = {**artifact.format_metadata, **file_metadata}
|
||||
if file_metadata and artifact.artifact_metadata:
|
||||
artifact.artifact_metadata = {**artifact.artifact_metadata, **file_metadata}
|
||||
elif file_metadata:
|
||||
artifact.format_metadata = file_metadata
|
||||
artifact.artifact_metadata = file_metadata
|
||||
# Update checksums if not already set
|
||||
if not artifact.checksum_md5 and storage_result.md5:
|
||||
artifact.checksum_md5 = storage_result.md5
|
||||
if not artifact.checksum_sha1 and storage_result.sha1:
|
||||
artifact.checksum_sha1 = storage_result.sha1
|
||||
if not artifact.s3_etag and storage_result.s3_etag:
|
||||
artifact.s3_etag = storage_result.s3_etag
|
||||
else:
|
||||
artifact = Artifact(
|
||||
id=sha256_hash,
|
||||
size=size,
|
||||
id=storage_result.sha256,
|
||||
size=storage_result.size,
|
||||
content_type=file.content_type,
|
||||
original_name=file.filename,
|
||||
checksum_md5=storage_result.md5,
|
||||
checksum_sha1=storage_result.sha1,
|
||||
s3_etag=storage_result.s3_etag,
|
||||
created_by=user_id,
|
||||
s3_key=s3_key,
|
||||
format_metadata=file_metadata or {},
|
||||
s3_key=storage_result.s3_key,
|
||||
artifact_metadata=file_metadata or {},
|
||||
)
|
||||
db.add(artifact)
|
||||
|
||||
# Record upload
|
||||
upload = Upload(
|
||||
artifact_id=sha256_hash,
|
||||
artifact_id=storage_result.sha256,
|
||||
package_id=package.id,
|
||||
original_name=file.filename,
|
||||
uploaded_by=user_id,
|
||||
source_ip=request.client.host if request.client else None,
|
||||
deduplicated=deduplicated,
|
||||
)
|
||||
db.add(upload)
|
||||
|
||||
@@ -561,13 +572,13 @@ def upload_artifact(
|
||||
if tag:
|
||||
existing_tag = db.query(Tag).filter(Tag.package_id == package.id, Tag.name == tag).first()
|
||||
if existing_tag:
|
||||
existing_tag.artifact_id = sha256_hash
|
||||
existing_tag.artifact_id = storage_result.sha256
|
||||
existing_tag.created_by = user_id
|
||||
else:
|
||||
new_tag = Tag(
|
||||
package_id=package.id,
|
||||
name=tag,
|
||||
artifact_id=sha256_hash,
|
||||
artifact_id=storage_result.sha256,
|
||||
created_by=user_id,
|
||||
)
|
||||
db.add(new_tag)
|
||||
@@ -575,12 +586,16 @@ def upload_artifact(
|
||||
db.commit()
|
||||
|
||||
return UploadResponse(
|
||||
artifact_id=sha256_hash,
|
||||
size=size,
|
||||
artifact_id=storage_result.sha256,
|
||||
sha256=storage_result.sha256,
|
||||
size=storage_result.size,
|
||||
project=project_name,
|
||||
package=package_name,
|
||||
tag=tag,
|
||||
format_metadata=artifact.format_metadata,
|
||||
checksum_md5=storage_result.md5,
|
||||
checksum_sha1=storage_result.sha1,
|
||||
s3_etag=storage_result.s3_etag,
|
||||
format_metadata=artifact.artifact_metadata,
|
||||
deduplicated=deduplicated,
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user