ad32c6b2cd
Co-authored-by: nova28 <17953305+nova28@users.noreply.github.com> Co-authored-by: Carlos Florencio <carlosmflorencio@gmail.com>
41 lines
1.3 KiB
Go
41 lines
1.3 KiB
Go
package service
|
|
|
|
import (
|
|
"maps"
|
|
|
|
"github.com/kandev/kandev/internal/task/models"
|
|
)
|
|
|
|
// cloneTaskMetadata copies the top-level task metadata map so request-owned
|
|
// maps cannot be mutated while the service adds or protects server state.
|
|
func cloneTaskMetadata(metadata map[string]interface{}) map[string]interface{} {
|
|
if metadata == nil {
|
|
return nil
|
|
}
|
|
cloned := make(map[string]interface{}, len(metadata))
|
|
maps.Copy(cloned, metadata)
|
|
return cloned
|
|
}
|
|
|
|
// protectedTaskMetadataUpdate applies a generic metadata replacement while
|
|
// keeping server-managed deferred-launch and step-handoff records owned by the
|
|
// server. The HTTP PATCH surface may replace ordinary metadata, but it cannot
|
|
// create, replace, or remove either record.
|
|
func protectedTaskMetadataUpdate(existing, requested map[string]interface{}) map[string]interface{} {
|
|
updated := cloneTaskMetadata(requested)
|
|
if updated == nil {
|
|
updated = make(map[string]interface{})
|
|
}
|
|
if deferred, ok := existing[models.MetaKeyDeferredLaunch]; ok {
|
|
updated[models.MetaKeyDeferredLaunch] = deferred
|
|
} else {
|
|
delete(updated, models.MetaKeyDeferredLaunch)
|
|
}
|
|
if carry, ok := existing[models.MetaKeyStepHandoffCarry]; ok {
|
|
updated[models.MetaKeyStepHandoffCarry] = carry
|
|
} else {
|
|
delete(updated, models.MetaKeyStepHandoffCarry)
|
|
}
|
|
return updated
|
|
}
|