Fix server file browse flow
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"sort"
|
||||
@@ -111,7 +110,7 @@ func (svc *CoreService) UploadArtifactChunk(chunk domain.ArtifactChunkUpload) (d
|
||||
}
|
||||
|
||||
if existing, exists := session.ReceivedChunks[chunk.ChunkIndex]; exists {
|
||||
if existing.Offset == chunk.Offset && existing.SizeBytes == chunk.SizeBytes && existing.Checksum == chunk.Checksum && bytes.Equal(existing.Payload, chunk.Payload) {
|
||||
if existing.Offset == chunk.Offset && existing.SizeBytes == chunk.SizeBytes && existing.Checksum == chunk.Checksum {
|
||||
return artifactChunkUploadResult(session, chunk.ChunkIndex, true, stamp), nil
|
||||
}
|
||||
return domain.ArtifactChunkUploadResult{}, validationError("artifact chunk conflicts with acknowledged chunk")
|
||||
@@ -129,7 +128,7 @@ func (svc *CoreService) UploadArtifactChunk(chunk domain.ArtifactChunkUpload) (d
|
||||
if err := svc.artifactStore.SaveTransfer(session); err != nil {
|
||||
return domain.ArtifactChunkUploadResult{}, err
|
||||
}
|
||||
svc.artifactTransfers[session.TransferID] = domain.CopyArtifactTransferSession(session)
|
||||
svc.artifactTransfers[session.TransferID] = svc.artifactTransferSessionForMemory(session)
|
||||
return artifactChunkUploadResult(session, chunk.ChunkIndex, false, stamp), nil
|
||||
}
|
||||
|
||||
@@ -185,19 +184,13 @@ func (svc *CoreService) CompleteArtifactTransfer(complete domain.ArtifactTransfe
|
||||
return domain.ArtifactTransferCompleteResult{}, validationError("artifact transfer has missing chunks")
|
||||
}
|
||||
|
||||
payload := make([]byte, 0, int(session.SizeBytes))
|
||||
for index := 0; index < session.TotalChunks; index++ {
|
||||
record, exists := session.ReceivedChunks[index]
|
||||
if !exists {
|
||||
if _, exists := session.ReceivedChunks[index]; !exists {
|
||||
return domain.ArtifactTransferCompleteResult{}, validationError("artifact transfer has missing chunks")
|
||||
}
|
||||
payload = append(payload, record.Payload...)
|
||||
}
|
||||
if int64(len(payload)) != session.SizeBytes {
|
||||
return domain.ArtifactTransferCompleteResult{}, validationError("artifact transfer size does not match metadata")
|
||||
}
|
||||
if checksum := validator.BytesChecksum(payload); checksum != session.Checksum {
|
||||
return domain.ArtifactTransferCompleteResult{}, validationError("artifact transfer checksum does not match metadata")
|
||||
if err := svc.artifactStore.CommitTransferPayload(session); err != nil {
|
||||
return domain.ArtifactTransferCompleteResult{}, err
|
||||
}
|
||||
|
||||
artifact.SizeBytes = session.SizeBytes
|
||||
@@ -207,22 +200,29 @@ func (svc *CoreService) CompleteArtifactTransfer(complete domain.ArtifactTransfe
|
||||
if err := validator.ValidateArtifact(artifact); err != nil {
|
||||
return domain.ArtifactTransferCompleteResult{}, err
|
||||
}
|
||||
if err := svc.artifactStore.PutPayload(artifact.ID, payload); err != nil {
|
||||
return domain.ArtifactTransferCompleteResult{}, err
|
||||
}
|
||||
if err := svc.store.Artifacts().Update(artifact); err != nil {
|
||||
return domain.ArtifactTransferCompleteResult{}, err
|
||||
}
|
||||
svc.artifactPayloads[artifact.ID] = domain.CopyBytes(payload)
|
||||
session.Completed = true
|
||||
session.UpdatedAt = stamp
|
||||
if err := svc.artifactStore.SaveTransfer(session); err != nil {
|
||||
return domain.ArtifactTransferCompleteResult{}, err
|
||||
}
|
||||
svc.artifactTransfers[session.TransferID] = domain.CopyArtifactTransferSession(session)
|
||||
svc.artifactTransfers[session.TransferID] = svc.artifactTransferSessionForMemory(session)
|
||||
return domain.ArtifactTransferCompleteResult{Accepted: true, TransferID: session.TransferID, Artifact: artifact, Completed: true, ServerTime: stamp}, nil
|
||||
}
|
||||
|
||||
func (svc *CoreService) artifactTransferSessionForMemory(session domain.ArtifactTransferSession) domain.ArtifactTransferSession {
|
||||
cached := domain.CopyArtifactTransferSession(session)
|
||||
if _, durableFileStore := svc.artifactStore.(*FileArtifactBodyStore); durableFileStore {
|
||||
for index, record := range cached.ReceivedChunks {
|
||||
record.Payload = nil
|
||||
cached.ReceivedChunks[index] = record
|
||||
}
|
||||
}
|
||||
return cached
|
||||
}
|
||||
|
||||
func (svc *CoreService) getArtifactTransferSession(transferID string) (domain.ArtifactTransferSession, error) {
|
||||
session, exists := svc.artifactTransfers[transferID]
|
||||
if !exists {
|
||||
|
||||
Reference in New Issue
Block a user