fetchReleases method

Future<List<Map<String, dynamic>>> fetchReleases(
  1. String owner,
  2. String repo, {
  3. int perPage = 100,
})

Fetch GitHub releases for a repository.

GET /repos/{owner}/{repo}/releases

Returns a list of release objects, each containing tag_name, name, body (release notes), published_at, prerelease, etc.

Returns an empty list on failure.

Implementation

Future<List<Map<String, dynamic>>> fetchReleases(
  String owner,
  String repo, {
  int perPage = 100,
}) async {
  final cacheKey = 'github_releases_${owner}_$repo';
  final cached = await _cache.get(cacheKey);
  if (cached != null) {
    final entries = cached['entries'] as List<dynamic>? ?? [];
    return entries.cast<Map<String, dynamic>>();
  }

  try {
    Logger.debug('Fetching releases for $owner/$repo');
    final response = await _http.get(
      '$_apiBase/repos/$owner/$repo/releases?per_page=$perPage',
    );
    if (!response.isSuccess) {
      Logger.warn(
        'Failed to fetch releases for $owner/$repo: '
        'HTTP ${response.statusCode}',
      );
      return [];
    }

    final releases = response.jsonList
        .map((e) => e as Map<String, dynamic>)
        .toList();

    await _cache.set(
      cacheKey,
      {'entries': releases},
      CacheManager.changelogTtl,
    );
    return releases;
  } catch (e, stack) {
    Logger.error('Error fetching releases for $owner/$repo', e, stack);
    return [];
  }
}