128 lines
3.8 KiB
PHP
128 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace Tests\Fakes;
|
|
|
|
use App\Schedule\CreateScheduleDto;
|
|
use App\Schedule\AssignmentForDate;
|
|
use App\Schedule\Schedule;
|
|
use App\Schedule\ScheduleAssignment;
|
|
use App\Schedule\ScheduleRepository;
|
|
use App\User\User;
|
|
use DateTimeImmutable;
|
|
|
|
class FakeScheduleRepository implements ScheduleRepository
|
|
{
|
|
/**
|
|
* @var array<int, Schedule>
|
|
*/
|
|
private array $schedules = [];
|
|
|
|
public function create(CreateScheduleDto $dto): Schedule
|
|
{
|
|
$id = count($this->schedules) + 1;
|
|
$assignments = [];
|
|
|
|
foreach ($dto->assignments as $assignmentDto) {
|
|
$assignments[] = new ScheduleAssignment(
|
|
id: count($assignments) + 1,
|
|
name: $assignmentDto->name,
|
|
kind: $assignmentDto->kind,
|
|
path: $assignmentDto->path,
|
|
scheduledDate: $assignmentDto->scheduledDate,
|
|
position: $assignmentDto->position,
|
|
);
|
|
}
|
|
|
|
$schedule = new Schedule(
|
|
id: $id,
|
|
user: $dto->user,
|
|
setName: $dto->setName,
|
|
elementKind: $dto->elementKind,
|
|
startDate: $dto->startDate,
|
|
targetDate: $dto->targetDate,
|
|
assignments: $assignments,
|
|
);
|
|
$this->schedules[$id] = $schedule;
|
|
|
|
return $this->copy($schedule);
|
|
}
|
|
|
|
public function findForUser(int $id, User $user): ?Schedule
|
|
{
|
|
$schedule = $this->schedules[$id] ?? null;
|
|
if ($schedule === null || $schedule->getUser()->getId()
|
|
!== $user->getId()
|
|
) {
|
|
return null;
|
|
}
|
|
|
|
return $this->copy($schedule);
|
|
}
|
|
|
|
public function findAllForUser(User $user): array
|
|
{
|
|
$schedules = array_filter(
|
|
$this->schedules,
|
|
function (Schedule $schedule) use ($user): bool {
|
|
return $schedule->getUser()->getId() === $user->getId();
|
|
},
|
|
);
|
|
krsort($schedules);
|
|
|
|
return array_map(function (Schedule $schedule): Schedule {
|
|
return $this->copy($schedule);
|
|
}, array_values($schedules));
|
|
}
|
|
|
|
public function findAssignmentsForUserOnDate(
|
|
User $user,
|
|
DateTimeImmutable $date,
|
|
): array {
|
|
$assignments = [];
|
|
|
|
foreach ($this->findAllForUser($user) as $schedule) {
|
|
foreach ($schedule->getAssignments() as $assignment) {
|
|
if ($assignment->getScheduledDate()->format('Y-m-d')
|
|
!== $date->format('Y-m-d')
|
|
) {
|
|
continue;
|
|
}
|
|
|
|
$assignments[] = new AssignmentForDate(
|
|
scheduleId: $schedule->getId(),
|
|
setName: $schedule->getSetName(),
|
|
assignment: $assignment,
|
|
);
|
|
}
|
|
}
|
|
|
|
return $assignments;
|
|
}
|
|
|
|
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(),
|
|
);
|
|
|
|
return new Schedule(
|
|
id: $schedule->getId(),
|
|
user: $schedule->getUser(),
|
|
setName: $schedule->getSetName(),
|
|
elementKind: $schedule->getElementKind(),
|
|
startDate: $schedule->getStartDate(),
|
|
targetDate: $schedule->getTargetDate(),
|
|
assignments: $assignments,
|
|
);
|
|
}
|
|
}
|