diff --git a/assets/.env b/assets/.env index 16a64f6e4..e334f398e 100644 --- a/assets/.env +++ b/assets/.env @@ -1,5 +1,6 @@ ENVIRONMENT = 'staging' -CHOREO_API = 'https://api.staging.pangea.chat' +# CHOREO_API = 'https://api.staging.pangea.chat' +CHOREO_API = 'http://localhost:3000' FRONTEND_URL = 'https://app.staging.pangea.chat' SYNAPSE_URL = 'matrix.staging.pangea.chat' diff --git a/lib/pangea/course_plans/course_plan_model.dart b/lib/pangea/course_plans/course_plan_model.dart index 23278c7a6..7fe723854 100644 --- a/lib/pangea/course_plans/course_plan_model.dart +++ b/lib/pangea/course_plans/course_plan_model.dart @@ -150,40 +150,40 @@ class CoursePlanModel { factory CoursePlanModel.fromCmsDocs( CmsCoursePlan cmsCoursePlan, List? cmsCoursePlanMedias, - List? cmsCoursePlanModules, - List? cmsCoursePlanModuleLocations, + List? cmsCoursePlanTopics, + List? cmsCoursePlanTopicLocations, List? cmsCoursePlanActivities, List? cmsCoursePlanActivityMedias, ) { // fetch topics List? topics; - if (cmsCoursePlanModules != null) { - for (final module in cmsCoursePlanModules) { - // select locations of current module - List? moduleLocations; - if (cmsCoursePlanModuleLocations != null) { - for (final location in cmsCoursePlanModuleLocations) { - if (location.coursePlanTopics.contains(module.id)) { - moduleLocations ??= []; - moduleLocations.add(location); + if (cmsCoursePlanTopics != null) { + for (final topic in cmsCoursePlanTopics) { + // select locations of current topic + List? topicLocations; + if (cmsCoursePlanTopicLocations != null) { + for (final location in cmsCoursePlanTopicLocations) { + if (location.coursePlanTopics.contains(topic.id)) { + topicLocations ??= []; + topicLocations.add(location); } } } - // select activities of current module - List? moduleActivities; + // select activities of current topic + List? topicActivities; if (cmsCoursePlanActivities != null) { for (final activity in cmsCoursePlanActivities) { - if (activity.coursePlanTopics.contains(module.id)) { - moduleActivities ??= []; - moduleActivities.add(activity); + if (activity.coursePlanTopics.contains(topic.id)) { + topicActivities ??= []; + topicActivities.add(activity); } } } List? activityPlans; - if (moduleActivities != null) { - for (final activity in moduleActivities) { + if (topicActivities != null) { + for (final activity in topicActivities) { // select media of current activity List? activityMedias; if (cmsCoursePlanActivityMedias != null) { @@ -238,11 +238,11 @@ class CoursePlanModel { topics ??= []; topics.add( Topic( - uuid: module.id, - title: module.title, - description: module.description, - location: moduleLocations != null && moduleLocations.isNotEmpty - ? moduleLocations.first.name + uuid: topic.id, + title: topic.title, + description: topic.description, + location: topicLocations != null && topicLocations.isNotEmpty + ? topicLocations.first.name : "Any", activities: activityPlans, ), diff --git a/lib/pangea/course_plans/course_plans_repo.dart b/lib/pangea/course_plans/course_plans_repo.dart index f5bcb304b..51bf3bfb1 100644 --- a/lib/pangea/course_plans/course_plans_repo.dart +++ b/lib/pangea/course_plans/course_plans_repo.dart @@ -195,19 +195,25 @@ class CoursePlansRepo { static Future _fromCmsCoursePlan( CmsCoursePlan cmsCoursePlan, ) async { - final medias = await _getMedia(cmsCoursePlan); - final topics = await _getTopics(cmsCoursePlan); - final locations = await _getTopicLocations(topics ?? []); - final activities = await _getTopicActivities(topics ?? []); - final activityMedias = await _getActivityMedia(activities ?? []); - return CoursePlanModel.fromCmsDocs( - cmsCoursePlan, - medias, - topics, - locations, - activities, - activityMedias, - ); + try { + final medias = await _getMedia(cmsCoursePlan); + final topics = await _getTopics(cmsCoursePlan); + final locations = await _getTopicLocations(topics ?? []); + final activities = await _getTopicActivities(topics ?? []); + final activityMedias = await _getActivityMedia(activities ?? []); + return CoursePlanModel.fromCmsDocs( + cmsCoursePlan, + medias, + topics, + locations, + activities, + activityMedias, + ); + } catch (e, stack) { + print(e); + print(stack); + rethrow; + } } static Future?> _getMedia( diff --git a/lib/pangea/payload_client/payload_client.dart b/lib/pangea/payload_client/payload_client.dart index 476ba7156..b0717b5e7 100644 --- a/lib/pangea/payload_client/payload_client.dart +++ b/lib/pangea/payload_client/payload_client.dart @@ -114,16 +114,15 @@ class PayloadClient { Map? where, String? sort, }) async { - final queryParams = {}; + final Map queryParams = {}; if (page != null) queryParams['page'] = page.toString(); if (limit != null) queryParams['limit'] = limit.toString(); - if (where != null) queryParams['where'] = jsonEncode(where); + if (where != null && where.isNotEmpty) queryParams['where'] = where; if (sort != null) queryParams['sort'] = sort; final endpoint = - '$basePath/$collection${queryParams.isNotEmpty ? '?${Uri(queryParameters: queryParams).query}' : ''}'; - + '$basePath/$collection${queryParams.isNotEmpty ? '?${queryStringify(queryParams)}' : ''}'; final response = await get(endpoint); final json = jsonDecode(response.body) as Map; @@ -178,4 +177,38 @@ class PayloadClient { final json = jsonDecode(response.body) as Map; return fromJson(json); } + + static String queryStringify( + Map params, { + bool encode = true, + }) { + final List parts = []; + + void build(String prefix, dynamic value) { + if (value == null) return; + + if (value is Map) { + value.forEach((k, v) { + build('$prefix[$k]', v); + }); + } else if (value is List) { + for (var i = 0; i < value.length; i++) { + build('$prefix[$i]', value[i]); + } + } else { + final String encodedKey = + encode ? Uri.encodeQueryComponent(prefix) : prefix; + final String encodedVal = encode + ? Uri.encodeQueryComponent(value.toString()) + : value.toString(); + parts.add('$encodedKey=$encodedVal'); + } + } + + params.forEach((key, value) { + build(key, value); + }); + + return parts.join('&'); + } }