Skip to content

Commit d1f4d44

Browse files
committed
fix(core): enforce TaskFieldValidatorRegistry validation in CreateTaskUseCase
1 parent 4c9a055 commit d1f4d44

4 files changed

Lines changed: 24 additions & 7 deletions

File tree

packages/taskdog-core/src/taskdog_core/application/use_cases/create_task.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
from taskdog_core.application.dto.task_operation_output import TaskOperationOutput
88
from taskdog_core.application.queries.workload._strategies import ActualScheduleStrategy
99
from taskdog_core.application.use_cases.base import UseCase
10+
from taskdog_core.application.validators.validator_registry import (
11+
TaskFieldValidatorRegistry,
12+
)
1013
from taskdog_core.domain.repositories.task_repository import TaskRepository
1114

1215
if TYPE_CHECKING:
@@ -29,6 +32,7 @@ def __init__(
2932
from daily allocation calculations
3033
"""
3134
self.repository = repository
35+
self.validator_registry = TaskFieldValidatorRegistry(repository)
3236
self._strategy = ActualScheduleStrategy(holiday_checker=holiday_checker)
3337

3438
def execute(self, input_dto: CreateTaskInput) -> TaskOperationOutput:
@@ -45,6 +49,19 @@ def execute(self, input_dto: CreateTaskInput) -> TaskOperationOutput:
4549
daily_allocations is automatically calculated using ActualScheduleStrategy.
4650
This enables SQL aggregation for workload calculations.
4751
"""
52+
# Validate fields using field validator registry
53+
field_mapping = {
54+
"name": input_dto.name,
55+
"priority": input_dto.priority,
56+
"planned_start": input_dto.planned_start,
57+
"planned_end": input_dto.planned_end,
58+
"deadline": input_dto.deadline,
59+
"estimated_duration": input_dto.estimated_duration,
60+
}
61+
for field_name, value in field_mapping.items():
62+
if value is not None:
63+
self.validator_registry.validate_field(field_name, value)
64+
4865
# Calculate daily_allocations if all required fields are present
4966
daily_allocations = self._calculate_daily_allocations(input_dto)
5067

packages/taskdog-core/src/taskdog_core/application/validators/datetime_validator.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ def __init__(self, field_name: str):
2727
"""
2828
self.field_name = field_name
2929

30-
def validate(self, value: Any, task: Task, repository: TaskRepository) -> None:
30+
def validate(self, value: Any, task: Task | None, repository: TaskRepository) -> None:
3131
"""Validate datetime field value.
3232
3333
Args:
3434
value: The datetime object to validate
35-
task: The task being updated
35+
task: The task being updated (or None if creating a new task)
3636
repository: Repository for data access (unused)
3737
3838
Raises:
@@ -53,7 +53,7 @@ def validate(self, value: Any, task: Task, repository: TaskRepository) -> None:
5353
now = datetime.now()
5454

5555
# Allow past dates if task has already started
56-
if task.actual_start is not None:
56+
if task is not None and task.actual_start is not None:
5757
return
5858

5959
# Reject past dates for tasks that haven't started

packages/taskdog-core/src/taskdog_core/application/validators/field_validator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ class FieldValidator(ABC):
1515
"""
1616

1717
@abstractmethod
18-
def validate(self, value: Any, task: Task, repository: TaskRepository) -> None:
18+
def validate(self, value: Any, task: Task | None, repository: TaskRepository) -> None:
1919
"""Validate a field value for the given task.
2020
2121
Args:
2222
value: The new value to validate
23-
task: The task being updated
23+
task: The task being updated (or None if creating a new task)
2424
repository: Repository for data access (if needed)
2525
2626
Raises:

packages/taskdog-core/src/taskdog_core/application/validators/validator_registry.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ def _register_validators(self) -> None:
4444
)
4545
self._validators["priority"] = NumericFieldValidator("priority")
4646

47-
def validate_field(self, field_name: str, value: Any, task: Task) -> None:
47+
def validate_field(self, field_name: str, value: Any, task: Task | None = None) -> None:
4848
"""Validate a field value if a validator exists for that field.
4949
5050
Args:
5151
field_name: Name of the field being updated
5252
value: New value for the field
53-
task: Task being updated
53+
task: Task being updated (or None if creating a task)
5454
5555
Raises:
5656
TaskValidationError: If validation fails

0 commit comments

Comments
 (0)