add assignment completion api

This commit is contained in:
Yisroel Baum 2026-08-15 22:43:06 +03:00
parent 916f070455
commit 350d2ec0b7
Signed by: yisroelbaum
GPG key ID: 0FA60884F75520A9
11 changed files with 281 additions and 16 deletions

View file

@ -9,6 +9,7 @@ use App\Schedule\ScheduleAssignment;
use App\Schedule\ScheduleRepository;
use App\User\User;
use DateTimeImmutable;
use DomainException;
class FakeScheduleRepository implements ScheduleRepository
{
@ -17,6 +18,8 @@ class FakeScheduleRepository implements ScheduleRepository
*/
private array $schedules = [];
private int $nextAssignmentId = 1;
public function create(CreateScheduleDto $dto): Schedule
{
$id = count($this->schedules) + 1;
@ -24,12 +27,13 @@ class FakeScheduleRepository implements ScheduleRepository
foreach ($dto->assignments as $assignmentDto) {
$assignments[] = new ScheduleAssignment(
id: count($assignments) + 1,
id: $this->nextAssignmentId++,
name: $assignmentDto->name,
kind: $assignmentDto->kind,
path: $assignmentDto->path,
scheduledDate: $assignmentDto->scheduledDate,
position: $assignmentDto->position,
completedAt: null,
);
}
@ -84,6 +88,7 @@ class FakeScheduleRepository implements ScheduleRepository
foreach ($schedule->getAssignments() as $assignment) {
if ($assignment->getScheduledDate()->format('Y-m-d')
!== $date->format('Y-m-d')
|| $assignment->getCompletedAt() !== null
) {
continue;
}
@ -99,21 +104,66 @@ class FakeScheduleRepository implements ScheduleRepository
return $assignments;
}
public function findAssignmentForUser(
int $id,
User $user,
): ?ScheduleAssignment {
foreach ($this->findAllForUser($user) as $schedule) {
foreach ($schedule->getAssignments() as $assignment) {
if ($assignment->getId() === $id) {
return $this->copyAssignment($assignment);
}
}
}
return null;
}
public function updateAssignment(
ScheduleAssignment $assignment,
): ScheduleAssignment {
foreach ($this->schedules as $id => $schedule) {
$assignments = [];
$found = false;
foreach ($schedule->getAssignments() as $storedAssignment) {
if ($storedAssignment->getId() === $assignment->getId()) {
$assignments[] = $this->copyAssignment($assignment);
$found = true;
} else {
$assignments[] = $this->copyAssignment(
$storedAssignment,
);
}
}
if ($found) {
$this->schedules[$id] = new Schedule(
id: $schedule->getId(),
user: $schedule->getUser(),
setName: $schedule->getSetName(),
elementKind: $schedule->getElementKind(),
startDate: $schedule->getStartDate(),
targetDate: $schedule->getTargetDate(),
assignments: $assignments,
);
return $this->copyAssignment($assignment);
}
}
throw new DomainException(
"Assignment with id {$assignment->getId()} not found",
);
}
private function copy(Schedule $schedule): Schedule
{
$assignments = array_map(
function (ScheduleAssignment $assignment): ScheduleAssignment {
return new ScheduleAssignment(
id: $assignment->getId(),
name: $assignment->getName(),
kind: $assignment->getKind(),
path: $assignment->getPath(),
scheduledDate: $assignment->getScheduledDate(),
position: $assignment->getPosition(),
);
},
$schedule->getAssignments(),
);
$assignments = array_map(function (
ScheduleAssignment $assignment,
): ScheduleAssignment {
return $this->copyAssignment($assignment);
}, $schedule->getAssignments());
return new Schedule(
id: $schedule->getId(),
@ -125,4 +175,18 @@ class FakeScheduleRepository implements ScheduleRepository
assignments: $assignments,
);
}
private function copyAssignment(
ScheduleAssignment $assignment,
): ScheduleAssignment {
return new ScheduleAssignment(
id: $assignment->getId(),
name: $assignment->getName(),
kind: $assignment->getKind(),
path: $assignment->getPath(),
scheduledDate: $assignment->getScheduledDate(),
position: $assignment->getPosition(),
completedAt: $assignment->getCompletedAt(),
);
}
}