getAnnouncements method

Future<List<Announcement>> getAnnouncements({
  1. required String courseId,
})

Returns a list of Course's announcements. Requires that the User is logged in.

Implementation

Future<List<Announcement>> getAnnouncements(
    {required String courseId}) async {
  List<Announcement> announcements = [];
  Announcement announcement;
  XmlDocument xmlDecodedResponse;
  await _getUid();
  var response = await _client.get(
    Uri.https(
      'eclass.$instituteId.gr',
      '/modules/announcements/',
      {'course': courseId},
    ),
    headers: {'Cookie': 'PHPSESSID=$_token'},
  );
  if (response.statusCode != 200 ||
      response.statusCode == 403 ||
      response.statusCode == 404) {
    throw ("Failed to get course's announcements");
  }
  final htmlDecodedResponse = parse(response.body);
  final link = htmlDecodedResponse
      .getElementsByTagName('a')
      .where((e) => e.attributes.containsKey('href'))
      .map((e) => e.attributes['href'])
      .where((e) => e!.contains('rss'))
      .first
      ?.split('&')
      .last
      .split('=')
      .last;

  if (link != null) {
    response = await _client.get(
      Uri.https(
        'eclass.$instituteId.gr',
        '/modules/announcements/rss.php',
        {
          'c': courseId,
          'uid': _uid,
          'token': link,
        },
      ),
      headers: {'Cookie': 'PHPSESSID=$_token'},
    );
  }
  if (response.statusCode != 200) {
    throw Exception("Failed to get course's announcements.");
  }
  try {
    xmlDecodedResponse =
        XmlDocument.parse(Utf8Codec().decode(response.bodyBytes));
  } on Exception {
    throw ("Can't retrieve course's announcements because user is not logged in or the token has expired.");
  }
  final nodes = xmlDecodedResponse.findAllElements('item');
  for (final node in nodes) {
    announcement = Announcement(
      title: node.children[0].text,
      link: node.children[1].text,
      description: node.children[2].text,
      pubDate: node.children[3].text,
      guid: node.children[4].text,
    );
    announcements.add(announcement);
  }
  return announcements;
}