<?php namespace Makai\Projects; use Index\Colour\{Colour,ColourRgb}; use Index\Db\{DbConnection,DbStatementCache}; class Projects { private DbStatementCache $cache; public function __construct(DbConnection $dbConn) { $this->cache = new DbStatementCache($dbConn); } public function getProjects( bool $featuredOnly = false, ?bool $deleted = null, ?int $take = null, bool $random = false ): array { $hasDeleted = $deleted !== null; $hasTake = $take !== null; $args = 0; $query = 'SELECT project_id, project_name, COALESCE(project_name_clean, REPLACE(LOWER(project_name), \' \', \'-\')), project_summary, project_description, project_order, project_type, project_featured, project_colour, project_homepage, project_repository, project_forum, UNIX_TIMESTAMP(project_created), UNIX_TIMESTAMP(project_deleted), UNIX_TIMESTAMP(project_archived) FROM fm_projects'; if($featuredOnly) { ++$args; $query .= ' WHERE project_featured <> 0'; } if($hasDeleted) $query .= sprintf(' %s project_deleted %s NULL', ++$args > 1 ? 'AND' : 'WHERE', $deleted ? 'IS NOT' : 'IS'); $query .= sprintf(' ORDER BY %s', $random ? 'RAND()' : 'project_order DESC'); if($hasTake) $query .= ' LIMIT ?'; $stmt = $this->cache->get($query); if($hasTake) $stmt->addParameter(1, $take); $stmt->execute(); $result = $stmt->getResult(); $projects = []; while($result->next()) $projects[] = new ProjectInfo($result); return $projects; } public function getLanguages( ProjectInfo|string|null $projectInfo = null ): array { $hasProjectInfo = $projectInfo !== null; $query = 'SELECT l.language_id, l.language_name, l.language_colour FROM fm_proglangs AS l'; if($hasProjectInfo) $query .= ' LEFT JOIN fm_projects_proglangs AS pl ON pl.language_id = l.language_id WHERE pl.project_id = ? ORDER BY pl.priority ASC'; $stmt = $this->cache->get($query); if($hasProjectInfo) $stmt->addParameter(1, $projectInfo instanceof ProjectInfo ? $projectInfo->getId() : $projectInfo); $stmt->execute(); $result = $stmt->getResult(); $langs = []; while($result->next()) $langs[] = new LanguageInfo($result); return $langs; } public function getProjectColour(ProjectInfo|string $projectInfo): Colour { $query = 'SELECT language_colour FROM fm_proglangs WHERE language_id = (SELECT language_id FROM fm_projects_proglangs WHERE project_id = ? ORDER BY priority ASC)'; $stmt = $this->cache->get($query); $stmt->addParameter(1, $projectInfo instanceof ProjectInfo ? $projectInfo->getId() : $projectInfo); $stmt->execute(); $result = $stmt->getResult(); if(!$result->next() || $result->isNull(0)) return Colour::none(); return ColourRgb::fromRawRGB($result->getInteger(0)); } }