Alpha 5 #20
@ -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)];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										53
									
								
								src/util/refresh.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/util/refresh.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,53 @@
 | 
			
		||||
<?php
 | 
			
		||||
use JetBrains\PhpStorm\NoReturn;
 | 
			
		||||
 | 
			
		||||
require __DIR__ . '/../cli-start.php';
 | 
			
		||||
 | 
			
		||||
cli_title('FEED REFRESH');
 | 
			
		||||
 | 
			
		||||
if ($argc < 2) display_help();
 | 
			
		||||
 | 
			
		||||
switch ($argv[1]) {
 | 
			
		||||
    case 'all':
 | 
			
		||||
        refresh_all();
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        printfn('Unrecognized option "%s"', $argv[1]);
 | 
			
		||||
        display_help();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Display the options for this utility and exit
 | 
			
		||||
 */
 | 
			
		||||
#[NoReturn]
 | 
			
		||||
function display_help(): void {
 | 
			
		||||
    printfn('Options:');
 | 
			
		||||
    printfn(' - all');
 | 
			
		||||
    printfn('     Refreshes all feeds');
 | 
			
		||||
    exit(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function refresh_all(): void {
 | 
			
		||||
    $db = Data::getConnection();
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
        $feeds = Feed::retrieveAll($db);
 | 
			
		||||
        if (array_key_exists('error', $feeds)) {
 | 
			
		||||
            printfn('SQLite error: %s', $feeds['error']);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        array_walk($feeds, function ($feed) use ($db) {
 | 
			
		||||
            $result = Feed::refreshFeed($feed['id'], $feed['url'], $db);
 | 
			
		||||
            if (array_key_exists('error', $result)) {
 | 
			
		||||
                printfn('ERR (%s) %s', $feed['email'], $feed['url']);
 | 
			
		||||
                printfn('         %s', $result['error']);
 | 
			
		||||
            } else {
 | 
			
		||||
                printfn('OK  (%s) %s', $feed['email'], $feed['url']);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        printfn(PHP_EOL . 'All feeds refreshed');
 | 
			
		||||
    } finally {
 | 
			
		||||
        $db->close();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user