(req BlockRequest, actor ActorContext)
| 449 | } |
| 450 | |
| 451 | func (m *Service) taskBlockFromRequest(req BlockRequest, actor ActorContext) (TaskBlock, string, string, error) { |
| 452 | now := m.now().UTC() |
| 453 | taskID := strings.TrimSpace(req.TaskID) |
| 454 | if taskID == "" { |
| 455 | return TaskBlock{}, "", "", fmt.Errorf("%w: task_block.task_id is required", ErrValidation) |
| 456 | } |
| 457 | kind := req.Kind.Normalize() |
| 458 | if err := kind.Validate("task_block.kind"); err != nil { |
| 459 | return TaskBlock{}, "", "", err |
| 460 | } |
| 461 | reason := strings.TrimSpace(req.Reason) |
| 462 | if reason == "" { |
| 463 | return TaskBlock{}, "", "", fmt.Errorf("%w: task_block.reason is required", ErrValidation) |
| 464 | } |
| 465 | if err := rejectTaskSecretText("task_block.reason", reason); err != nil { |
| 466 | return TaskBlock{}, "", "", err |
| 467 | } |
| 468 | details := cloneRawJSON(req.Details) |
| 469 | if err := rejectTaskSecretJSON("task_block.details", details); err != nil { |
| 470 | return TaskBlock{}, "", "", err |
| 471 | } |
| 472 | expiresAt := req.ExpiresAt |
| 473 | if !expiresAt.IsZero() { |
| 474 | expiresAt = expiresAt.UTC() |
| 475 | if kind != BlockKindTransient { |
| 476 | return TaskBlock{}, "", "", fmt.Errorf( |
| 477 | "%w: task_block.expires_at is only valid for %q blocks", |
| 478 | ErrValidation, |
| 479 | BlockKindTransient, |
| 480 | ) |
| 481 | } |
| 482 | } |
| 483 | runID := strings.TrimSpace(req.RunID) |
| 484 | claimToken := strings.TrimSpace(req.ClaimToken) |
| 485 | |
| 486 | return TaskBlock{ |
| 487 | ID: m.newID(taskBlockIDPrefix), |
| 488 | TaskID: taskID, |
| 489 | Kind: kind, |
| 490 | Reason: reason, |
| 491 | Details: details, |
| 492 | CreatedBy: ActorIdentity{Kind: actor.Actor.Kind.Normalize(), Ref: strings.TrimSpace(actor.Actor.Ref)}, |
| 493 | CreatedAt: now, |
| 494 | ExpiresAt: expiresAt, |
| 495 | }, runID, claimToken, nil |
| 496 | } |
| 497 | |
| 498 | func rejectTaskSecretText(path string, value string) error { |
| 499 | if redactTaskSecretText(value) != value { |
no test coverage detected