diff --git a/src/lib/Feed.php b/src/lib/Feed.php index 08c21f2..459fc83 100644 --- a/src/lib/Feed.php +++ b/src/lib/Feed.php @@ -228,7 +228,7 @@ class Feed { // Relative URL; feed should be retrieved in the context of the original URL $original = parse_url($url); $port = array_key_exists('port', $original) ? ":{$original['port']}" : ''; - $feedURL = "{$original['scheme']}://{$original['host']}$port$feedURL"; + $feedURL = $original['scheme'] . '://' . $original['host'] . $port . $feedURL; } $doc = self::retrieveDocument($feedURL); } @@ -329,17 +329,12 @@ class Feed { /** * Refresh a feed * + * @param int $feedId The ID of the feed to be refreshed * @param string $url The URL of the feed to be refreshed * @param SQLite3 $db A database connection to use to refresh the feed * @return array|string[]|true[] ['ok' => true] if successful, ['error' => message] if not */ - private static function refreshFeed(string $url, SQLite3 $db): array { - $feedQuery = $db->prepare('SELECT id FROM feed WHERE url = :url AND user_id = :user'); - $feedQuery->bindValue(':url', $url); - $feedQuery->bindValue(':user', $_SESSION[Key::USER_ID]); - $feedResult = $feedQuery->execute(); - $feedId = $feedResult ? $feedResult->fetchArray(SQLITE3_NUM)[0] : -1; - if ($feedId < 0) return ['error' => "No feed for URL $url found"]; + public static function refreshFeed(int $feedId, string $url, SQLite3 $db): array { $feedExtract = self::retrieveFeed($url); if (array_key_exists('error', $feedExtract)) return $feedExtract; @@ -423,7 +418,26 @@ class Feed { $query->bindValue(':user', $_SESSION[Key::USER_ID]); $query->execute(); - return self::refreshFeed($url, $db); + return self::refreshFeed($existing['id'], $url, $db); + } + + /** + * Retrieve all feeds, optionally for a specific user + * + * @param SQLite3 $db The database connection to use to retrieve the feeds + * @param int $user The ID of the user whose feeds should be retrieved (optional, defaults to all feeds) + * @return array An array of arrays with ['id', 'url', 'email'] keys + */ + public static function retrieveAll(SQLite3 $db, int $user = 0): array { + $extraSQL = $user > 0 ? ' WHERE u.id = :user' : ''; + $query = $db->prepare( + "SELECT f.id, f.url, u.email FROM feed f INNER JOIN frc_user u ON u.id = f.user_id$extraSQL"); + if ($user > 0) $query->bindValue(':user', $user); + $result = $query->execute(); + if (!$result) return ['error', $db->lastErrorMsg()]; + $feeds = []; + while ($feed = $result->fetchArray(SQLITE3_ASSOC)) $feeds[] = $feed; + return $feeds; } /** @@ -433,19 +447,15 @@ class Feed { * @return array|true[] ['ok => true] if successful, ['error' => message] if not (may have multiple error lines) */ public static function refreshAll(SQLite3 $db): array { - $query = $db->prepare('SELECT url FROM feed WHERE user_id = :user'); - $query->bindValue(':user', $_SESSION[Key::USER_ID]); - $result = $query->execute(); - $url = $result ? $result->fetchArray(SQLITE3_NUM) : false; - if ($url) { - $errors = array(); - while ($url) { - $updateResult = self::refreshFeed($url[0], $db); - if (array_key_exists('error', $updateResult)) $errors[] = $updateResult['error']; - $url = $result->fetchArray(SQLITE3_NUM); - } - return sizeof($errors) == 0 ? ['ok' => true] : ['error' => implode("\n", $errors)]; - } - return ['error' => $db->lastErrorMsg()]; + $feeds = self::retrieveAll($db, $_SESSION[Key::USER_ID]); + if (array_key_exists('error', $feeds)) return $feeds; + + $errors = []; + array_walk($feeds, function ($feed) use ($db, &$errors) { + $result = self::refreshFeed($feed['id'], $feed['url'], $db); + if (array_key_exists('error', $result)) $errors[] = $result['error']; + }); + + return sizeof($errors) == 0 ? ['ok' => true] : ['error' => implode("\n", $errors)]; } } diff --git a/src/util/refresh.php b/src/util/refresh.php new file mode 100644 index 0000000..0f77868 --- /dev/null +++ b/src/util/refresh.php @@ -0,0 +1,53 @@ +close(); + } +}