Afegir acció getStartupData de l'API

Aquesta acció retorna informació bàsica que necessita el frontend quan
es carrega, com pot ser l'estat de l'inici de sessió, el correu
electrònic de l'usuari, la llista d'assignatures o l'enllaç per iniciar
sessió.
diff --git a/inc/API.php b/inc/API.php
index 1eac89f..7a8acc0 100644
--- a/inc/API.php
+++ b/inc/API.php
@@ -88,6 +88,21 @@
         ]);
         break;
 
+      case 'getStartupData':
+        self::checkRequestMethod('GET');
+
+        $payload = [];
+        $payload['user'] = [];
+        $payload['user']['signedIn'] = \DAFME\Covid\Users::isSignedIn();
+        $payload['user']['email'] = ($payload['user']['signedIn'] ? Users::getUserData('email') : null);
+
+        $auth = new Auth();
+        $payload['authUrl'] = $auth->getAuthUrl();
+        $payload['subjects'] = \DAFME\Covid\Subjects::getStartupSubjects();
+
+        self::returnPayload($payload);
+        break;
+
       case 'signOut':
         self::checkRequestMethod('POST');
         \DAFME\Covid\Users::signOut();
diff --git a/inc/Classes.php b/inc/Classes.php
index f174393..f080d56 100644
--- a/inc/Classes.php
+++ b/inc/Classes.php
@@ -53,13 +53,7 @@
     if (!$query->execute($query_params)) return false;
     $classes = $query->fetchAll(\PDO::FETCH_ASSOC);
 
-    foreach ($classes as &$class) {
-      if (!$isSignedIn)
-        $class['user_subject_id'] = null;
-
-      $class['user_selected'] = $class['user_subject_id'] !== null;
-    }
-
+    Subjects::addIsUserSelected($classes);
     return $classes;
   }
 }
diff --git a/inc/Subjects.php b/inc/Subjects.php
index 1578398..6b4ec70 100644
--- a/inc/Subjects.php
+++ b/inc/Subjects.php
@@ -12,6 +12,43 @@
     return $query->fetchAll(\PDO::FETCH_ASSOC);
   }
 
+  public static function addIsUserSelected(&$entries, $doIfSignedOut = true) {
+    $isSignedIn = Users::isSignedIn();
+
+    if (!$doIfSignedOut) return;
+
+    foreach ($entries as &$entry) {
+      if (!$isSignedIn)
+        $entry['user_subject_id'] = null;
+
+      $entry['user_selected'] = $entry['user_subject_id'] !== null;
+    }
+  }
+
+  public static function getStartupSubjects() {
+    global $con;
+    $isSignedIn = Users::isSignedIn();
+
+    $query = $con->prepare('SELECT s.id, s.friendly_name'.($isSignedIn ? ', us.id user_subject_id' : '').'
+      FROM subjects s'.($isSignedIn ? '
+      LEFT JOIN user_subjects us
+        ON s.id = us.subject_id
+      WHERE
+        us.user_id = :user_id OR
+        us.user_id IS NULL' : '').'
+      ORDER BY s.friendly_name ASC');
+
+    $query_params = [
+      "user_id" => Users::getUserId()
+    ];
+
+    if (!$query->execute($query_params)) return false;
+    $subjects = $query->fetchAll(\PDO::FETCH_ASSOC);
+
+    self::addIsUserSelected($subjects, false);
+    return $subjects;
+  }
+
   public static function exists(int $subject): bool {
     global $con;
     $query = $con->prepare('SELECT id FROM subjects WHERE id = ?');
diff --git a/inc/Users.php b/inc/Users.php
index b91737f..a13d1e9 100644
--- a/inc/Users.php
+++ b/inc/Users.php
@@ -53,4 +53,15 @@
     global $_SESSION;
     return (self::isSignedIn() ? $_SESSION['userId'] : -1);
   }
+
+  public static function getUserData(string $field) {
+    global $con;
+    if (!self::isSignedIn()) return false;
+    $userId = self::getUserId();
+
+    $query = $con->prepare('SELECT '.$field.' FROM users WHERE id = ?');
+    if (!$query->execute([$userId])) return false;
+
+    return $query->fetchColumn();
+  }
 }