Fix server file browse flow

This commit is contained in:
npc0-hue
2026-08-26 22:00:23 +08:00
parent 861ee752ed
commit 6369a8099a
22 changed files with 627 additions and 132 deletions
+17 -17
View File
@@ -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 {