53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package job
|
|
|
|
import (
|
|
"strings"
|
|
|
|
app "haixun-backend/internal/library/errors"
|
|
"haixun-backend/internal/library/errors/code"
|
|
"haixun-backend/internal/model/job/domain/entity"
|
|
)
|
|
|
|
func runOwnedBy(run *entity.Run, tenantID, uid string) bool {
|
|
if run == nil || strings.TrimSpace(uid) == "" {
|
|
return false
|
|
}
|
|
ownerUID := strings.TrimSpace(run.OwnerUID)
|
|
runTenantID := strings.TrimSpace(run.TenantID)
|
|
if ownerUID == "" && run.Payload != nil {
|
|
ownerUID = stringFromPayload(run.Payload, "owner_uid")
|
|
runTenantID = stringFromPayload(run.Payload, "tenant_id")
|
|
}
|
|
if ownerUID != "" {
|
|
if ownerUID != uid {
|
|
return false
|
|
}
|
|
if runTenantID != "" && tenantID != "" && runTenantID != tenantID {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
return run.Scope == "user" && run.ScopeID == uid
|
|
}
|
|
|
|
func ensureRunAccess(run *entity.Run, tenantID, uid string) error {
|
|
if runOwnedBy(run, tenantID, uid) {
|
|
return nil
|
|
}
|
|
return app.For(code.Job).ResNotFound("job run not found")
|
|
}
|
|
|
|
func stringFromPayload(payload map[string]any, key string) string {
|
|
if payload == nil {
|
|
return ""
|
|
}
|
|
value, ok := payload[key]
|
|
if !ok || value == nil {
|
|
return ""
|
|
}
|
|
text, ok := value.(string)
|
|
if !ok {
|
|
return ""
|
|
}
|
|
return strings.TrimSpace(text)
|
|
} |