Commit da912f8d authored by Mahmoud Aglan's avatar Mahmoud Aglan

fix(manager): counts that read 0, and achievement names on player progress

- Database::count() kept the caller's order next to select=count; Postgres
  refuses an order on a plain column in an aggregate (42803), so counts on
  achievements, training, spotlights, media and content read 0. The order
  is dropped for counts.
- Player progress looked every achievement up as a club badge (uuid), but
  game achievements are text keys (win_streak_3): the query failed and every
  row read "unknown". Keys are resolved from achievements, uuids from
  org_achievements.
Co-Authored-By: 's avatarClaude Opus 5.5 <noreply@anthropic.com>
parent 166011ba
......@@ -62,6 +62,9 @@ class Database
public function count(string $table, array $params = []): int
{
// select=count is an aggregate: an order on a plain column makes
// Postgres refuse the whole query (42803), and the count reads 0.
unset($params['order']);
$params['select'] = 'count';
$headers = ['Prefer' => 'count=exact'];
$url = "{$this->baseUrl}/{$table}?" . http_build_query($params);
......
......@@ -236,11 +236,20 @@ class OrgAchievementsController
$progress = $this->db->select('player_achievements', $queryParams);
$achievementIds = array_column($progress, 'achievement_id');
// achievement_id is text: a club badge's uuid (org_achievements) or a
// game achievement's key such as win_streak_3 (achievements).
$achievementIds = array_values(array_unique(array_filter(array_column($progress, 'achievement_id'))));
$isUuid = fn($v) => (bool)preg_match('/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i', (string)$v);
$badgeIds = array_values(array_filter($achievementIds, $isUuid));
$gameKeys = array_values(array_filter($achievementIds, fn($v) => !$isUuid($v) && preg_match('/^[A-Za-z0-9_.-]+$/', (string)$v)));
$achievements = [];
if (!empty($achievementIds)) {
$idList = '(' . implode(',', $achievementIds) . ')';
foreach ($this->db->select('org_achievements', ['id' => "in.{$idList}"]) as $a) {
if ($badgeIds) {
foreach ($this->db->select('org_achievements', ['id' => 'in.(' . implode(',', $badgeIds) . ')']) as $a) {
$achievements[$a['id']] = $a;
}
}
if ($gameKeys) {
foreach ($this->db->select('achievements', ['select' => 'id,name,name_ar,icon_url', 'id' => 'in.(' . implode(',', $gameKeys) . ')']) as $a) {
$achievements[$a['id']] = $a;
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment