refactor module to topics

pull/2245/head
WilsonLe 2 months ago
parent a62d9f8643
commit 5f12be32a0

@ -9,8 +9,8 @@ import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_p
import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_activity.dart'; import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_activity.dart';
import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_activity_media.dart'; import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_activity_media.dart';
import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_media.dart'; import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_media.dart';
import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_module.dart'; import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_topic.dart';
import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_module_location.dart'; import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_topic_location.dart';
/// Represents a topic in the course planner response. /// Represents a topic in the course planner response.
class Topic { class Topic {
@ -150,8 +150,8 @@ class CoursePlanModel {
factory CoursePlanModel.fromCmsDocs( factory CoursePlanModel.fromCmsDocs(
CmsCoursePlan cmsCoursePlan, CmsCoursePlan cmsCoursePlan,
List<CmsCoursePlanMedia>? cmsCoursePlanMedias, List<CmsCoursePlanMedia>? cmsCoursePlanMedias,
List<CmsCoursePlanModule>? cmsCoursePlanModules, List<CmsCoursePlanTopic>? cmsCoursePlanModules,
List<CmsCoursePlanModuleLocation>? cmsCoursePlanModuleLocations, List<CmsCoursePlanTopicLocation>? cmsCoursePlanModuleLocations,
List<CmsCoursePlanActivity>? cmsCoursePlanActivities, List<CmsCoursePlanActivity>? cmsCoursePlanActivities,
List<CmsCoursePlanActivityMedia>? cmsCoursePlanActivityMedias, List<CmsCoursePlanActivityMedia>? cmsCoursePlanActivityMedias,
) { ) {
@ -160,10 +160,10 @@ class CoursePlanModel {
if (cmsCoursePlanModules != null) { if (cmsCoursePlanModules != null) {
for (final module in cmsCoursePlanModules) { for (final module in cmsCoursePlanModules) {
// select locations of current module // select locations of current module
List<CmsCoursePlanModuleLocation>? moduleLocations; List<CmsCoursePlanTopicLocation>? moduleLocations;
if (cmsCoursePlanModuleLocations != null) { if (cmsCoursePlanModuleLocations != null) {
for (final location in cmsCoursePlanModuleLocations) { for (final location in cmsCoursePlanModuleLocations) {
if (location.coursePlanModules.contains(module.id)) { if (location.coursePlanTopics.contains(module.id)) {
moduleLocations ??= []; moduleLocations ??= [];
moduleLocations.add(location); moduleLocations.add(location);
} }
@ -174,7 +174,7 @@ class CoursePlanModel {
List<CmsCoursePlanActivity>? moduleActivities; List<CmsCoursePlanActivity>? moduleActivities;
if (cmsCoursePlanActivities != null) { if (cmsCoursePlanActivities != null) {
for (final activity in cmsCoursePlanActivities) { for (final activity in cmsCoursePlanActivities) {
if (activity.coursePlanModules.contains(module.id)) { if (activity.coursePlanTopics.contains(module.id)) {
moduleActivities ??= []; moduleActivities ??= [];
moduleActivities.add(activity); moduleActivities.add(activity);
} }

@ -1,5 +1,3 @@
import 'package:get_storage/get_storage.dart';
import 'package:fluffychat/pangea/common/config/environment.dart'; import 'package:fluffychat/pangea/common/config/environment.dart';
import 'package:fluffychat/pangea/course_plans/course_plan_model.dart'; import 'package:fluffychat/pangea/course_plans/course_plan_model.dart';
import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart'; import 'package:fluffychat/pangea/learning_settings/enums/language_level_type_enum.dart';
@ -8,10 +6,11 @@ import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_p
import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_activity.dart'; import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_activity.dart';
import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_activity_media.dart'; import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_activity_media.dart';
import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_media.dart'; import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_media.dart';
import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_module.dart'; import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_topic.dart';
import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_module_location.dart'; import 'package:fluffychat/pangea/payload_client/models/course_plan/cms_course_plan_topic_location.dart';
import 'package:fluffychat/pangea/payload_client/payload_client.dart'; import 'package:fluffychat/pangea/payload_client/payload_client.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import 'package:get_storage/get_storage.dart';
class CourseFilter { class CourseFilter {
final LanguageModel? targetLanguage; final LanguageModel? targetLanguage;
@ -170,7 +169,7 @@ class CoursePlansRepo {
} }
final result = await payload.find( final result = await payload.find(
"course-plans", CmsCoursePlan.slug,
CmsCoursePlan.fromJson, CmsCoursePlan.fromJson,
page: 1, page: 1,
limit: 10, limit: 10,
@ -197,14 +196,14 @@ class CoursePlansRepo {
CmsCoursePlan cmsCoursePlan, CmsCoursePlan cmsCoursePlan,
) async { ) async {
final medias = await _getMedia(cmsCoursePlan); final medias = await _getMedia(cmsCoursePlan);
final modules = await _getModules(cmsCoursePlan); final topics = await _getTopics(cmsCoursePlan);
final locations = await _getModuleLocations(modules ?? []); final locations = await _getTopicLocations(topics ?? []);
final activities = await _getModuleActivities(modules ?? []); final activities = await _getTopicActivities(topics ?? []);
final activityMedias = await _getActivityMedia(activities ?? []); final activityMedias = await _getActivityMedia(activities ?? []);
return CoursePlanModel.fromCmsDocs( return CoursePlanModel.fromCmsDocs(
cmsCoursePlan, cmsCoursePlan,
medias, medias,
modules, topics,
locations, locations,
activities, activities,
activityMedias, activityMedias,
@ -222,7 +221,7 @@ class CoursePlansRepo {
}; };
final limit = docs.length; final limit = docs.length;
final cmsCoursePlanMediaResult = await payload.find( final cmsCoursePlanMediaResult = await payload.find(
"course-plan-media", CmsCoursePlanMedia.slug,
CmsCoursePlanMedia.fromJson, CmsCoursePlanMedia.fromJson,
where: where, where: where,
limit: limit, limit: limit,
@ -232,34 +231,34 @@ class CoursePlansRepo {
return cmsCoursePlanMediaResult.docs; return cmsCoursePlanMediaResult.docs;
} }
static Future<List<CmsCoursePlanModule>?> _getModules( static Future<List<CmsCoursePlanTopic>?> _getTopics(
CmsCoursePlan cmsCoursePlan, CmsCoursePlan cmsCoursePlan,
) async { ) async {
final docs = cmsCoursePlan.coursePlanModules?.docs; final docs = cmsCoursePlan.coursePlanTopics?.docs;
if (docs == null || docs.isEmpty) return null; if (docs == null || docs.isEmpty) return null;
final where = { final where = {
"id": {"in": docs.join(",")}, "id": {"in": docs.join(",")},
}; };
final limit = docs.length; final limit = docs.length;
final cmsCourseModulesResult = await payload.find( final cmsCourseTopicsResult = await payload.find(
"course-plan-modules", CmsCoursePlanTopic.slug,
CmsCoursePlanModule.fromJson, CmsCoursePlanTopic.fromJson,
where: where, where: where,
limit: limit, limit: limit,
page: 1, page: 1,
sort: "createdAt", sort: "createdAt",
); );
return cmsCourseModulesResult.docs; return cmsCourseTopicsResult.docs;
} }
static Future<List<CmsCoursePlanModuleLocation>?> _getModuleLocations( static Future<List<CmsCoursePlanTopicLocation>?> _getTopicLocations(
List<CmsCoursePlanModule> modules, List<CmsCoursePlanTopic> topics,
) async { ) async {
final List<String> locations = []; final List<String> locations = [];
for (final module in modules) { for (final top in topics) {
if (module.coursePlanModuleLocations?.docs != null) { if (top.coursePlanTopicLocations?.docs != null) {
locations.addAll(module.coursePlanModuleLocations!.docs!); locations.addAll(top.coursePlanTopicLocations!.docs!);
} }
} }
if (locations.isEmpty) return null; if (locations.isEmpty) return null;
@ -268,24 +267,24 @@ class CoursePlansRepo {
"id": {"in": locations.join(",")}, "id": {"in": locations.join(",")},
}; };
final limit = locations.length; final limit = locations.length;
final cmsCoursePlanModuleLocationsResult = await payload.find( final cmsCoursePlanTopicLocationsResult = await payload.find(
"course-plan-module-locations", CmsCoursePlanTopicLocation.slug,
CmsCoursePlanModuleLocation.fromJson, CmsCoursePlanTopicLocation.fromJson,
where: where, where: where,
limit: limit, limit: limit,
page: 1, page: 1,
sort: "createdAt", sort: "createdAt",
); );
return cmsCoursePlanModuleLocationsResult.docs; return cmsCoursePlanTopicLocationsResult.docs;
} }
static Future<List<CmsCoursePlanActivity>?> _getModuleActivities( static Future<List<CmsCoursePlanActivity>?> _getTopicActivities(
List<CmsCoursePlanModule> module, List<CmsCoursePlanTopic> topics,
) async { ) async {
final List<String> activities = []; final List<String> activities = [];
for (final mod in module) { for (final top in topics) {
if (mod.coursePlanActivities?.docs != null) { if (top.coursePlanActivities?.docs != null) {
activities.addAll(mod.coursePlanActivities!.docs!); activities.addAll(top.coursePlanActivities!.docs!);
} }
} }
if (activities.isEmpty) return null; if (activities.isEmpty) return null;
@ -295,7 +294,7 @@ class CoursePlansRepo {
}; };
final limit = activities.length; final limit = activities.length;
final cmsCoursePlanActivitiesResult = await payload.find( final cmsCoursePlanActivitiesResult = await payload.find(
"course-plan-activities", CmsCoursePlanActivity.slug,
CmsCoursePlanActivity.fromJson, CmsCoursePlanActivity.fromJson,
where: where, where: where,
limit: limit, limit: limit,
@ -321,7 +320,7 @@ class CoursePlansRepo {
}; };
final limit = mediaIds.length; final limit = mediaIds.length;
final cmsCoursePlanActivityMediasResult = await payload.find( final cmsCoursePlanActivityMediasResult = await payload.find(
"course-plan-activity-medias", CmsCoursePlanActivityMedia.slug,
CmsCoursePlanActivityMedia.fromJson, CmsCoursePlanActivityMedia.fromJson,
where: where, where: where,
limit: limit, limit: limit,

@ -3,6 +3,7 @@ import 'package:fluffychat/pangea/payload_client/polymorphic_relationship.dart';
/// Represents a course plan from the CMS API /// Represents a course plan from the CMS API
class CmsCoursePlan { class CmsCoursePlan {
static const String slug = "course-plans";
final String id; final String id;
final String title; final String title;
final String description; final String description;
@ -10,7 +11,7 @@ class CmsCoursePlan {
final String l1; // Language of instruction final String l1; // Language of instruction
final String l2; // Target language final String l2; // Target language
final JoinField? coursePlanMedia; final JoinField? coursePlanMedia;
final JoinField? coursePlanModules; final JoinField? coursePlanTopics;
final PolymorphicRelationship? createdBy; final PolymorphicRelationship? createdBy;
final PolymorphicRelationship? updatedBy; final PolymorphicRelationship? updatedBy;
final String updatedAt; final String updatedAt;
@ -24,7 +25,7 @@ class CmsCoursePlan {
required this.l1, required this.l1,
required this.l2, required this.l2,
this.coursePlanMedia, this.coursePlanMedia,
this.coursePlanModules, this.coursePlanTopics,
this.createdBy, this.createdBy,
this.updatedBy, this.updatedBy,
required this.updatedAt, required this.updatedAt,
@ -40,7 +41,7 @@ class CmsCoursePlan {
l1: json['l1'], l1: json['l1'],
l2: json['l2'], l2: json['l2'],
coursePlanMedia: JoinField.fromJson(json['coursePlanMedia']), coursePlanMedia: JoinField.fromJson(json['coursePlanMedia']),
coursePlanModules: JoinField.fromJson(json['coursePlanModules']), coursePlanTopics: JoinField.fromJson(json['coursePlanTopics']),
createdBy: PolymorphicRelationship.fromJson(json['createdBy']), createdBy: PolymorphicRelationship.fromJson(json['createdBy']),
updatedBy: PolymorphicRelationship.fromJson(json['updatedBy']), updatedBy: PolymorphicRelationship.fromJson(json['updatedBy']),
updatedAt: json['updatedAt'], updatedAt: json['updatedAt'],
@ -57,7 +58,7 @@ class CmsCoursePlan {
'l1': l1, 'l1': l1,
'l2': l2, 'l2': l2,
'coursePlanMedia': coursePlanMedia?.toJson(), 'coursePlanMedia': coursePlanMedia?.toJson(),
'coursePlanModules': coursePlanModules?.toJson(), 'coursePlanTopics': coursePlanTopics?.toJson(),
'createdBy': createdBy?.toJson(), 'createdBy': createdBy?.toJson(),
'updatedBy': updatedBy?.toJson(), 'updatedBy': updatedBy?.toJson(),
'updatedAt': updatedAt, 'updatedAt': updatedAt,

@ -66,6 +66,8 @@ class CmsCoursePlanVocab {
/// Represents a course plan activity from the CMS API /// Represents a course plan activity from the CMS API
class CmsCoursePlanActivity { class CmsCoursePlanActivity {
static const String slug = "course-plan-activities";
final String id; final String id;
final String title; final String title;
final String description; final String description;
@ -77,7 +79,7 @@ class CmsCoursePlanActivity {
final List<CmsCoursePlanActivityRole> roles; final List<CmsCoursePlanActivityRole> roles;
final List<CmsCoursePlanVocab> vocabs; final List<CmsCoursePlanVocab> vocabs;
final JoinField? coursePlanActivityMedia; final JoinField? coursePlanActivityMedia;
final List<String> coursePlanModules; final List<String> coursePlanTopics;
final PolymorphicRelationship? createdBy; final PolymorphicRelationship? createdBy;
final PolymorphicRelationship? updatedBy; final PolymorphicRelationship? updatedBy;
final String updatedAt; final String updatedAt;
@ -95,7 +97,7 @@ class CmsCoursePlanActivity {
required this.roles, required this.roles,
required this.vocabs, required this.vocabs,
required this.coursePlanActivityMedia, required this.coursePlanActivityMedia,
required this.coursePlanModules, required this.coursePlanTopics,
this.createdBy, this.createdBy,
this.updatedBy, this.updatedBy,
required this.updatedAt, required this.updatedAt,
@ -129,7 +131,7 @@ class CmsCoursePlanActivity {
.toList(), .toList(),
coursePlanActivityMedia: coursePlanActivityMedia:
JoinField.fromJson(json['coursePlanActivityMedia']), JoinField.fromJson(json['coursePlanActivityMedia']),
coursePlanModules: List<String>.from(json['coursePlanModules']), coursePlanTopics: List<String>.from(json['coursePlanTopics']),
createdBy: json['createdBy'] != null createdBy: json['createdBy'] != null
? PolymorphicRelationship.fromJson(json['createdBy']) ? PolymorphicRelationship.fromJson(json['createdBy'])
: null, : null,
@ -154,7 +156,7 @@ class CmsCoursePlanActivity {
'roles': roles.map((role) => role.toJson()).toList(), 'roles': roles.map((role) => role.toJson()).toList(),
'vocabs': vocabs.map((vocab) => vocab.toJson()).toList(), 'vocabs': vocabs.map((vocab) => vocab.toJson()).toList(),
'coursePlanActivityMedia': coursePlanActivityMedia?.toJson(), 'coursePlanActivityMedia': coursePlanActivityMedia?.toJson(),
'coursePlanModules': coursePlanModules, 'coursePlanTopics': coursePlanTopics,
'createdBy': createdBy?.toJson(), 'createdBy': createdBy?.toJson(),
'updatedBy': updatedBy?.toJson(), 'updatedBy': updatedBy?.toJson(),
'updatedAt': updatedAt, 'updatedAt': updatedAt,

@ -2,6 +2,8 @@ import 'package:fluffychat/pangea/payload_client/polymorphic_relationship.dart';
/// Represents course plan activity media from the CMS API /// Represents course plan activity media from the CMS API
class CmsCoursePlanActivityMedia { class CmsCoursePlanActivityMedia {
static const String slug = "course-plan-activity-medias";
final String id; final String id;
final String? alt; final String? alt;
final List<String> coursePlanActivities; final List<String> coursePlanActivities;

@ -2,6 +2,7 @@ import 'package:fluffychat/pangea/payload_client/polymorphic_relationship.dart';
/// Represents course plan media from the CMS API /// Represents course plan media from the CMS API
class CmsCoursePlanMedia { class CmsCoursePlanMedia {
static const String slug = "course-plan-media";
final String id; final String id;
final String? alt; final String? alt;
final List<String> coursePlans; final List<String> coursePlans;

@ -1,25 +1,26 @@
import 'package:fluffychat/pangea/payload_client/join_field.dart'; import 'package:fluffychat/pangea/payload_client/join_field.dart';
import 'package:fluffychat/pangea/payload_client/polymorphic_relationship.dart'; import 'package:fluffychat/pangea/payload_client/polymorphic_relationship.dart';
/// Represents a course plan module from the CMS API /// Represents a course plan topic from the CMS API
class CmsCoursePlanModule { class CmsCoursePlanTopic {
static const String slug = "course-plan-topics";
final String id; final String id;
final String title; final String title;
final String description; final String description;
final JoinField? coursePlanActivities; final JoinField? coursePlanActivities;
final JoinField? coursePlanModuleLocations; final JoinField? coursePlanTopicLocations;
final List<String> coursePlans; final List<String> coursePlans;
final PolymorphicRelationship? createdBy; final PolymorphicRelationship? createdBy;
final PolymorphicRelationship? updatedBy; final PolymorphicRelationship? updatedBy;
final String updatedAt; final String updatedAt;
final String createdAt; final String createdAt;
CmsCoursePlanModule({ CmsCoursePlanTopic({
required this.id, required this.id,
required this.title, required this.title,
required this.description, required this.description,
required this.coursePlanActivities, required this.coursePlanActivities,
required this.coursePlanModuleLocations, required this.coursePlanTopicLocations,
required this.coursePlans, required this.coursePlans,
this.createdBy, this.createdBy,
this.updatedBy, this.updatedBy,
@ -27,16 +28,16 @@ class CmsCoursePlanModule {
required this.createdAt, required this.createdAt,
}); });
factory CmsCoursePlanModule.fromJson(Map<String, dynamic> json) { factory CmsCoursePlanTopic.fromJson(Map<String, dynamic> json) {
return CmsCoursePlanModule( return CmsCoursePlanTopic(
id: json['id'] as String, id: json['id'] as String,
title: json['title'] as String, title: json['title'] as String,
description: json['description'] as String, description: json['description'] as String,
coursePlanActivities: JoinField.fromJson( coursePlanActivities: JoinField.fromJson(
json['coursePlanActivities'], json['coursePlanActivities'],
), ),
coursePlanModuleLocations: JoinField.fromJson( coursePlanTopicLocations: JoinField.fromJson(
json['coursePlanModuleLocations'], json['coursePlanTopicLocations'],
), ),
coursePlans: List<String>.from(json['coursePlans']), coursePlans: List<String>.from(json['coursePlans']),
createdBy: json['createdBy'] != null createdBy: json['createdBy'] != null
@ -56,7 +57,7 @@ class CmsCoursePlanModule {
'title': title, 'title': title,
'description': description, 'description': description,
'coursePlanActivities': coursePlanActivities?.toJson(), 'coursePlanActivities': coursePlanActivities?.toJson(),
'coursePlanModuleLocations': coursePlanModuleLocations?.toJson(), 'coursePlanTopicLocations': coursePlanTopicLocations?.toJson(),
'coursePlans': coursePlans, 'coursePlans': coursePlans,
'createdBy': createdBy?.toJson(), 'createdBy': createdBy?.toJson(),
'updatedBy': updatedBy?.toJson(), 'updatedBy': updatedBy?.toJson(),

@ -1,36 +1,37 @@
import 'package:fluffychat/pangea/payload_client/polymorphic_relationship.dart'; import 'package:fluffychat/pangea/payload_client/polymorphic_relationship.dart';
/// Represents a course plan module location from the CMS API /// Represents a course plan topic location from the CMS API
class CmsCoursePlanModuleLocation { class CmsCoursePlanTopicLocation {
static const String slug = "course-plan-topic-locations";
final String id; final String id;
final String name; final String name;
// [longitude, latitude] - minItems: 2, maxItems: 2 // [longitude, latitude] - minItems: 2, maxItems: 2
final List<double>? coordinates; final List<double>? coordinates;
final List<String> coursePlanModules; final List<String> coursePlanTopics;
final PolymorphicRelationship? createdBy; final PolymorphicRelationship? createdBy;
final PolymorphicRelationship? updatedBy; final PolymorphicRelationship? updatedBy;
final String updatedAt; final String updatedAt;
final String createdAt; final String createdAt;
CmsCoursePlanModuleLocation({ CmsCoursePlanTopicLocation({
required this.id, required this.id,
required this.name, required this.name,
this.coordinates, this.coordinates,
required this.coursePlanModules, required this.coursePlanTopics,
this.createdBy, this.createdBy,
this.updatedBy, this.updatedBy,
required this.updatedAt, required this.updatedAt,
required this.createdAt, required this.createdAt,
}); });
factory CmsCoursePlanModuleLocation.fromJson(Map<String, dynamic> json) { factory CmsCoursePlanTopicLocation.fromJson(Map<String, dynamic> json) {
return CmsCoursePlanModuleLocation( return CmsCoursePlanTopicLocation(
id: json['id'] as String, id: json['id'] as String,
name: json['name'] as String, name: json['name'] as String,
coordinates: (json['coordinates'] as List<dynamic>?) coordinates: (json['coordinates'] as List<dynamic>?)
?.map((coord) => (coord as num).toDouble()) ?.map((coord) => (coord as num).toDouble())
.toList(), .toList(),
coursePlanModules: List<String>.from(json['coursePlanModules']), coursePlanTopics: List<String>.from(json['coursePlanTopics']),
createdBy: json['createdBy'] != null createdBy: json['createdBy'] != null
? PolymorphicRelationship.fromJson(json['createdBy']) ? PolymorphicRelationship.fromJson(json['createdBy'])
: null, : null,
@ -47,7 +48,7 @@ class CmsCoursePlanModuleLocation {
'id': id, 'id': id,
'name': name, 'name': name,
'coordinates': coordinates, 'coordinates': coordinates,
'coursePlanModules': coursePlanModules, 'coursePlanTopics': coursePlanTopics,
'createdBy': createdBy?.toJson(), 'createdBy': createdBy?.toJson(),
'updatedBy': updatedBy?.toJson(), 'updatedBy': updatedBy?.toJson(),
'updatedAt': updatedAt, 'updatedAt': updatedAt,
Loading…
Cancel
Save