requireAuth()) { return $redirect; } $request = Request::capture(); $search = (string) ($request->input('search') ?? ''); $page = max(1, (int) ($request->input('page') ?? 1)); $perPage = 20; $repo = new TerritoryRepository(database()); $total = $repo->countAll($search); $pagination = new Pagination($total, $page, $perPage); $territories = $repo->findPaged($page, $perPage, $search); $counts = $repo->householdCountsKeyed(); return $this->view('territories.index', [ 'pageTitle' => 'Territories', 'territories' => $territories, 'counts' => $counts, 'search' => $search, 'pagination' => $pagination, ]); } public function show(int|string $id): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $repo = new TerritoryRepository(database()); $territory = $repo->find((int) $id); if (!$territory) { return Response::notFound('Territory not found.'); } $streets = $repo->distinctStreets((int) $id); $householdRepo = new \App\Repositories\HouseholdRepository(database()); $households = $householdRepo->findAllByTerritory((int) $id); return $this->view('territories.show', [ 'pageTitle' => e($territory['name']), 'territory' => $territory, 'streets' => $streets, 'households' => $households, ]); } public function create(): Response { if ($redirect = $this->requireAuth()) { return $redirect; } return $this->view('territories.create', [ 'pageTitle' => 'New Territory', 'errors' => [], 'old' => [], ]); } public function store(): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $request = Request::capture(); if (!verify_csrf_token($request->input('_token'))) { return $this->view('territories.create', [ 'pageTitle' => 'New Territory', 'errors' => ['_token' => ['Invalid request. Please try again.']], 'old' => $request->all(), ]); } $name = trim((string) ($request->input('name') ?? '')); $description = trim((string) ($request->input('description') ?? '')); $coordinates = trim((string) ($request->input('coordinates') ?? '')); $validator = (new Validator()) ->required('name', $name, 'Name is required.') ->maxLength('name', $name, 255); if ($validator->fails()) { return $this->view('territories.create', [ 'pageTitle' => 'New Territory', 'errors' => $validator->errors(), 'old' => $request->all(), ]); } $now = date('Y-m-d H:i:s'); database()->execute( 'INSERT INTO territories (name, description, coordinates, created_at, updated_at) VALUES (:name, :description, :coordinates, :now, :now)', ['name' => $name, 'description' => $description, 'coordinates' => $coordinates, 'now' => $now] ); flash('success', "Territory \"{$name}\" created."); return $this->redirect('/territories'); } public function edit(int|string $id): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $territory = (new TerritoryRepository(database()))->find((int) $id); if (!$territory) { return Response::notFound('Territory not found.'); } return $this->view('territories.edit', [ 'pageTitle' => 'Edit Territory', 'territory' => $territory, 'errors' => [], ]); } public function update(int|string $id): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $request = Request::capture(); $repo = new TerritoryRepository(database()); $territory = $repo->find((int) $id); if (!$territory) { return Response::notFound('Territory not found.'); } if (!verify_csrf_token($request->input('_token'))) { return $this->view('territories.edit', [ 'pageTitle' => 'Edit Territory', 'territory' => $territory, 'errors' => ['_token' => ['Invalid request. Please try again.']], ]); } $name = trim((string) ($request->input('name') ?? '')); $description = trim((string) ($request->input('description') ?? '')); $coordinates = trim((string) ($request->input('coordinates') ?? '')); $validator = (new Validator()) ->required('name', $name, 'Name is required.') ->maxLength('name', $name, 255); if ($validator->fails()) { return $this->view('territories.edit', [ 'pageTitle' => 'Edit Territory', 'territory' => array_merge($territory, ['name' => $name, 'description' => $description, 'coordinates' => $coordinates]), 'errors' => $validator->errors(), ]); } database()->execute( 'UPDATE territories SET name = :name, description = :description, coordinates = :coordinates, updated_at = :now WHERE id = :id', ['name' => $name, 'description' => $description, 'coordinates' => $coordinates, 'now' => date('Y-m-d H:i:s'), 'id' => $id] ); flash('success', "Territory \"{$name}\" updated."); return $this->redirect('/territories/' . $id); } public function delete(int|string $id): Response { if ($redirect = $this->requireAuth()) { return $redirect; } $request = Request::capture(); $territory = (new TerritoryRepository(database()))->find((int) $id); if (!$territory) { return Response::notFound('Territory not found.'); } if (!verify_csrf_token($request->input('_token'))) { flash('error', 'Invalid request.'); return $this->redirect('/territories'); } database()->execute('DELETE FROM territories WHERE id = :id', ['id' => $id]); flash('success', 'Territory deleted.'); return $this->redirect('/territories'); } }