resp = $this->call(Endpoints::WORK->value)->params([ WorkModel::IS_LISTED->value => true, self::API_PARAM_LIMIT => $_GET[self::API_PARAM_LIMIT] ?? null ])->get(); // Fetch metadata for work items if we got an ok from work endpoint if ($this->resp->ok) { $this->tags = $this->call(Endpoints::WORK_TAGS->value)->get(); $this->actions = $this->call(Endpoints::WORK_ACTIONS->value)->get(); } } /* Order response from endpoint into a multi-dimensional array. For example, a single item created at 14th of February 2024 would be ordered like this [2024 => [[02 => [14 => []]]]] */ public function get_timeline(): array { if (!$this->resp->ok) { return []; } $timeline = []; // Create array of arrays ordered by decending year, month, day, items foreach ($this->resp->json() as $row) { // Create array for current year if it doesn't exist if (!array_key_exists($row[WorkModel::DATE_YEAR->value], $timeline)) { $timeline[$row[WorkModel::DATE_YEAR->value]] = []; } // Create array for current month if it doesn't exist if (!array_key_exists($row[WorkModel::DATE_MONTH->value], $timeline[$row[WorkModel::DATE_YEAR->value]])) { $timeline[$row[WorkModel::DATE_YEAR->value]][$row[WorkModel::DATE_MONTH->value]] = []; } // Create array for current day if it doesn't exist if (!array_key_exists($row[WorkModel::DATE_DAY->value], $timeline[$row[WorkModel::DATE_YEAR->value]][$row[WorkModel::DATE_MONTH->value]])) { $timeline[$row[WorkModel::DATE_YEAR->value]][$row[WorkModel::DATE_MONTH->value]][$row[WorkModel::DATE_DAY->value]] = []; } // Append item to ordered array $timeline[$row[WorkModel::DATE_YEAR->value]][$row[WorkModel::DATE_MONTH->value]][$row[WorkModel::DATE_DAY->value]][] = $row; } return $timeline; } public function get_tags(string $key): array { if (!$this->resp->ok) { return []; } return in_array($key, $this->tags->json()) ? $this->tags->json()[$key] : []; } public function get_actions(string $key): array { if (!$this->resp->ok) { return []; } return array_key_exists($key, $this->actions->json()) ? $this->actions->json()[$key] : []; } } ?>

This timeline has most but not all of my FOSS software. If you want to see a list of all things I've created for the free software world, check out my repos on Codeberg or Forgejo.

get_timeline() as $year => $months): ?>

$days): ?>

$items): ?>

get_tags($item[WorkModel::ID->value])): ?>
get_tags($item[WorkModel::ID->value]) as $tag): ?>

value] ?>

value])): ?>

value] ?>

value] ?>

get_actions($item[WorkModel::ID->value])): ?> get_actions($item[WorkModel::ID->value]) as $action): ?>