diff --git a/Package/opigno/tincan/src/Score.php b/Package/opigno/tincan/src/Score.php index d804f612a..342619295 100644 --- a/Package/opigno/tincan/src/Score.php +++ b/Package/opigno/tincan/src/Score.php @@ -173,18 +173,16 @@ public function getMin() { * @return self */ public function setMax($value) { - //removing the code to avoid the exception with 0 score , it can be revesed if future - - // if (isset($this->raw) && $value < $this->raw) { - // throw new InvalidArgumentException( - // sprintf("Value must be greater than or equal to 'raw' (%s) [%s]", $this->raw, $value) - // ); - // } - // if (isset($this->min) && $value <= $this->min) { - // throw new InvalidArgumentException( - // sprintf("Value must be greater than 'min' (%s) [%s]", $this->min, $value) - // ); - // } + if (isset($this->raw) && $value < $this->raw) { + throw new InvalidArgumentException( + sprintf("Value must be greater than or equal to 'raw' (%s) [%s]", $this->raw, $value) + ); + } + if (isset($this->min) && $value <= $this->min) { + throw new InvalidArgumentException( + sprintf("Value must be greater than 'min' (%s) [%s]", $this->min, $value) + ); + } $this->max = (float) $value; return $this; } diff --git a/app/Http/Controllers/Api/V1/CurrikiGo/ExtractXAPIJSONController.php b/app/Http/Controllers/Api/V1/CurrikiGo/ExtractXAPIJSONController.php index 430cb471b..ef1d71c77 100644 --- a/app/Http/Controllers/Api/V1/CurrikiGo/ExtractXAPIJSONController.php +++ b/app/Http/Controllers/Api/V1/CurrikiGo/ExtractXAPIJSONController.php @@ -12,8 +12,6 @@ use App\CurrikiGo\LRS\InteractionFactory; use App\Repositories\GoogleClassroom\GoogleClassroomRepositoryInterface; use App\Repositories\IndependentActivity\IndependentActivityRepositoryInterface; -use Exception; -use Illuminate\Support\Facades\Log; /** * @group 16. XAPI Cron @@ -58,231 +56,227 @@ public function runJob( try { $service = new LearnerRecordStoreService(); foreach ($xapiStatements as $row) { - try { - $insertData = []; - $statement = $service->buildStatementfromJSON($row->data); - $actor = $statement->getActor(); - $target = $statement->getTarget(); + $insertData = []; + $statement = $service->buildStatementfromJSON($row->data); + $actor = $statement->getActor(); + $target = $statement->getTarget(); - $verb = $service->getVerbFromStatement($statement->getVerb()); - $context = $statement->getContext(); - $nameOfActivity = 'Unknown Quiz set'; - $defaultActivityName = true; + $verb = $service->getVerbFromStatement($statement->getVerb()); + $context = $statement->getContext(); + $nameOfActivity = 'Unknown Quiz set'; + $defaultActivityName = true; - // At the moment, we're only tackling targets of 'activity' type. - $definition = ($target->getObjectType() === 'Activity' ? $target->getDefinition() : ''); + // At the moment, we're only tackling targets of 'activity' type. + $definition = ($target->getObjectType() === 'Activity' ? $target->getDefinition() : ''); - // In some cases, we do not have a 'name' property for the object. - // So, we've added an additional check here. - // @todo - the LRS statements generated need to have this property - if ($target->getObjectType() === 'Activity' && !empty($definition) && !$definition->getName()->isEmpty()) { - $nameOfActivity = $definition->getName()->getNegotiatedLanguageString(); - $defaultActivityName = false; - } elseif ($target->getObjectType() === 'StatementRef') { - $nameOfActivity = $target->getId(); - } + // In some cases, we do not have a 'name' property for the object. + // So, we've added an additional check here. + // @todo - the LRS statements generated need to have this property + if ($target->getObjectType() === 'Activity' && !empty($definition) && !$definition->getName()->isEmpty()) { + $nameOfActivity = $definition->getName()->getNegotiatedLanguageString(); + $defaultActivityName = false; + } elseif ($target->getObjectType() === 'StatementRef') { + $nameOfActivity = $target->getId(); + } - $result = $statement->getResult(); + $result = $statement->getResult(); - if (!empty($actor->getAccount())) { - $insertData['actor_id'] = $actor->getAccount()->getName(); - $insertData['actor_homepage'] = $actor->getAccount()->getHomePage(); - } else { - // If will be mbox / name - $insertData['actor_id'] = $actor->getMbox(); - $insertData['actor_homepage'] = $actor->getName(); - } + if (!empty($actor->getAccount())) { + $insertData['actor_id'] = $actor->getAccount()->getName(); + $insertData['actor_homepage'] = $actor->getAccount()->getHomePage(); + } else { + // If will be mbox / name + $insertData['actor_id'] = $actor->getMbox(); + $insertData['actor_homepage'] = $actor->getName(); + } - $insertData['statement_id'] = $row->id; - $insertData['statement_uuid'] = $statement->getId(); + $insertData['statement_id'] = $row->id; + $insertData['statement_uuid'] = $statement->getId(); - $insertData['object_name'] = $nameOfActivity; - $insertData['datetime'] = $row->created_at; - $insertData['object_id'] = $target->getId(); - $insertData['verb'] = $verb; - if (!empty($context)) { - $contextActivities = $context->getContextActivities(); - $other = $contextActivities->getOther(); - $groupingInfo = $service->findGroupingInfo($other); - $platform = $context->getPlatform(); - } + $insertData['object_name'] = $nameOfActivity; + $insertData['datetime'] = $row->created_at; + $insertData['object_id'] = $target->getId(); + $insertData['verb'] = $verb; + if (!empty($context)) { + $contextActivities = $context->getContextActivities(); + $other = $contextActivities->getOther(); + $groupingInfo = $service->findGroupingInfo($other); + $platform = $context->getPlatform(); + } - // Skip if we don't have the activity. - if (empty($groupingInfo['activity']) || empty($groupingInfo['class']) || empty($context)) { - // It maybe an old format statement. Just save verb, object and actor, and move on. - $inserted = $lrsStatementsRepository->create($insertData); - \Log::info(date('Y-m-d h:i:s') . ' - Extract XAPI script failed for some statements'); - continue; - } + // Skip if we don't have the activity. + if (empty($groupingInfo['activity']) || empty($groupingInfo['class']) || empty($context)) { + // It maybe an old format statement. Just save verb, object and actor, and move on. + $inserted = $lrsStatementsRepository->create($insertData); + continue; + } - $activity = $activityRepository->find($groupingInfo['activity']); + $activity = $activityRepository->find($groupingInfo['activity']); - $activityId = null; - $activityName = null; - $projectId = null; - $projectName = null; - $playlistId = null; - $playlistTitle = null; + $activityId = null; + $activityName = null; + $projectId = null; + $projectName = null; + $playlistId = null; + $playlistTitle = null; - if ($activity) { - if ($activity->activity_type === config('constants.activity_type.activity')) { - $activityId = $activity->id; - $activityName = $activity->title; - $project = $activity->playlist->project; - $projectId = $project->id; - $projectName = $project->name; - $playlistId = $activity->playlist_id; - $playlistTitle = $activity->playlist->title; - } else { - $activityId = $activity->id; - $activityName = $activity->title; - $project = null; - $projectId = null; - $projectName = null; - $playlistId = null; - $playlistTitle = null; - } + if ($activity) { + if ($activity->activity_type === config('constants.activity_type.activity')) { + $activityId = $activity->id; + $activityName = $activity->title; + $project = $activity->playlist->project; + $projectId = $project->id; + $projectName = $project->name; + $playlistId = $activity->playlist_id; + $playlistTitle = $activity->playlist->title; + } else { + $activityId = $activity->id; + $activityName = $activity->title; + $project = NULL; + $projectId = NULL; + $projectName = NULL; + $playlistId = NULL; + $playlistTitle = NULL; } + } - $category = $contextActivities->getCategory(); - $categoryId = ''; - $h5pInteraction = ''; - if (!empty($category)) { - $categoryId = end($category)->getId(); - $h5pInteraction = explode("/", $categoryId); - $h5pInteraction = end($h5pInteraction); - } + $category = $contextActivities->getCategory(); + $categoryId = ''; + $h5pInteraction = ''; + if (!empty($category)) { + $categoryId = end($category)->getId(); + $h5pInteraction = explode("/", $categoryId); + $h5pInteraction = end($h5pInteraction); + } - $insertData['class_id'] = $groupingInfo['class']; - $insertData['project_id'] = $projectId; - $insertData['playlist_id'] = $playlistId; - $insertData['assignment_submitted'] = ($verb === LearnerRecordStoreService::SUBMITTED_VERB_NAME ? true : false); + $insertData['class_id'] = $groupingInfo['class']; + $insertData['project_id'] = $projectId; + $insertData['playlist_id'] = $playlistId; + $insertData['assignment_submitted'] = ($verb === LearnerRecordStoreService::SUBMITTED_VERB_NAME ? TRUE : FALSE); - $insertData['activity_category'] = $h5pInteraction; - $insertData['platform'] = $platform; - $insertData['project_name'] = $projectName; + $insertData['activity_category'] = $h5pInteraction; + $insertData['platform'] = $platform; + $insertData['project_name'] = $projectName; - $insertData['playlist_name'] = $playlistTitle; - $insertData['assignment_id'] = $activityId; - $insertData['assignment_name'] = $activityName; + $insertData['playlist_name'] = $playlistTitle; + $insertData['assignment_id'] = $activityId; + $insertData['assignment_name'] = $activityName; - //added submitted_id and attempt_id column for new summary page - $insertData['submission_id'] = $groupingInfo['submission']; - $insertData['attempt_id'] = $groupingInfo['attempt']; + //added submitted_id and attempt_id column for new summary page + $insertData['submission_id'] = $groupingInfo['submission']; + $insertData['attempt_id'] = $groupingInfo['attempt']; - //organization id of which this activity belongs to - if (isset($project->organization_id)) { - $insertData['activity_org_id'] = $project->organization_id; - } + //organization id of which this activity belongs to + if (isset($project->organization_id)) { + $insertData['activity_org_id'] = $project->organization_id; + } - // Extract information from object.definition.extensions - if ($target->getObjectType() === 'Activity' && !empty($definition)) { - $glassAltCourseId = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_GCLASS_ALTERNATE_COURSE_ID); - $glassEnrollmentCode = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_GCLASS_ENROLLMENT_CODE); - $courseName = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_COURSE_NAME); - if (empty($glassAltCourseId)) { - $courseName = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_LMS_COURSE_NAME); - $glassAltCourseId = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_LMS_DOMAIN_URL); - // CANVAS: Need to make this alt course id URL unique; appending class id to the domain URL - // Only if API domain is available, only then we save the 'alternate URL', else we keep it blank. - if (!empty($glassAltCourseId)) { - $glassAltCourseId .= '/' . $groupingInfo['class']; - } - $glassEnrollmentCode = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_LMS_COURSE_CODE); + // Extract information from object.definition.extensions + if ($target->getObjectType() === 'Activity' && !empty($definition)) { + $glassAltCourseId = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_GCLASS_ALTERNATE_COURSE_ID); + $glassEnrollmentCode = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_GCLASS_ENROLLMENT_CODE); + $courseName = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_COURSE_NAME); + if (empty($glassAltCourseId)) { + $courseName = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_LMS_COURSE_NAME); + $glassAltCourseId = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_LMS_DOMAIN_URL); + // CANVAS: Need to make this alt course id URL unique; appending class id to the domain URL + // Only if API domain is available, only then we save the 'alternate URL', else we keep it blank. + if (!empty($glassAltCourseId)) { + $glassAltCourseId .= '/' . $groupingInfo['class']; } - // Only fetching teacher_email_id of gclass_api_data column as in each respective case (LTI DL, Publishing from CS) email of publisher is already being stored - if ($glassAltCourseId) { - $publisherData = $googleClassroom->fetchPublisherData($glassAltCourseId); - if ($publisherData && $publisherData->publisher_user != null) { - $insertData['publisher_id'] = $publisherData['publisherUser']['id']; - $insertData['publisher_org_id'] = $publisherData['curriki_teacher_org']; - } + $glassEnrollmentCode = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_LMS_COURSE_CODE); + } + // Only fetching teacher_email_id of gclass_api_data column as in each respective case (LTI DL, Publishing from CS) email of publisher is already being stored + if ($glassAltCourseId) { + $publisherData = $googleClassroom->fetchPublisherData($glassAltCourseId); + if ($publisherData && $publisherData->publisher_user != null) { + $insertData['publisher_id'] = $publisherData['publisherUser']['id']; + $insertData['publisher_org_id'] = $publisherData['curriki_teacher_org']; } - $chapterName = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_H5P_CHAPTER_NAME); - $chapterIndex = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_H5P_CHAPTER_INDEX); - $referrer = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_REFERRER); - $insertData['glass_alternate_course_id'] = $glassAltCourseId; - $insertData['glass_enrollment_code'] = $glassEnrollmentCode; - $insertData['course_name'] = $courseName; - $insertData['chapter_name'] = (!empty($chapterName) ? $chapterName : 0); - $insertData['chapter_index'] = $chapterIndex; - $insertData['referrer'] = $referrer; + } + $chapterName = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_H5P_CHAPTER_NAME); + $chapterIndex = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_H5P_CHAPTER_INDEX); + $referrer = $service->getExtensionValueFromList($definition, LearnerRecordStoreService::EXTENSION_REFERRER); + $insertData['glass_alternate_course_id'] = $glassAltCourseId; + $insertData['glass_enrollment_code'] = $glassEnrollmentCode; + $insertData['course_name'] = $courseName; + $insertData['chapter_name'] = (!empty($chapterName) ? $chapterName : 0); + $insertData['chapter_index'] = $chapterIndex; + $insertData['referrer'] = $referrer; - // Saving publisherId and publisherOrg in shared links case - if ($referrer != null && !empty($project) && $project->users && count($project->users) > 0) { - $insertData['publisher_id'] = $project->users[0]->id; - $insertData['publisher_org_id'] = $project->organization_id; - } + // Saving publisherId and publisherOrg in shared links case + if ($referrer != null && !empty($project) && $project->users && count($project->users) > 0) { + $insertData['publisher_id'] = $project->users[0]->id; + $insertData['publisher_org_id'] = $project->organization_id; } + } - $interactionFactory = new InteractionFactory(); - $interaction = $interactionFactory->initInteraction($statement); - $interactionSummaryGlobal = ''; - if ($interaction) { - $interactionSummary = $interaction->summary(); - $interactionSummaryGlobal = $interactionSummary; - // Pull this from interaction... - $insertData['question'] = $interactionSummary['description']; - $insertData['duration'] = (!empty($interactionSummary['raw-duration']) ? $interactionSummary['raw-duration'] : null); - $insertData['options'] = (isset($interactionSummary['choices']) ? implode(", ", $interactionSummary['choices']) : null); - if (isset($interactionSummary['response']) && !empty($interactionSummary['response'])) { - $insertData['answer'] = (is_array($interactionSummary['response']) ? implode(", ", $interactionSummary['response']) : $interactionSummary['response']); - } - if ($interactionSummary['scorable'] || (isset($interactionSummary['score']) && $interactionSummary['score']['max'] > 0)) { - $insertData['score_scaled'] = $interactionSummary['score']['scaled']; - $insertData['score_min'] = $interactionSummary['score']['min']; - $insertData['score_max'] = $interactionSummary['score']['max']; - $insertData['score_raw'] = $interactionSummary['score']['raw']; - } + $interactionFactory = new InteractionFactory(); + $interaction = $interactionFactory->initInteraction($statement); + $interactionSummaryGlobal = ''; + if ($interaction) { + $interactionSummary = $interaction->summary(); + $interactionSummaryGlobal = $interactionSummary; + // Pull this from interaction... + $insertData['question'] = $interactionSummary['description']; + $insertData['duration'] = (!empty($interactionSummary['raw-duration']) ? $interactionSummary['raw-duration'] : null); + $insertData['options'] = (isset($interactionSummary['choices']) ? implode(", ", $interactionSummary['choices']) : null); + if (isset($interactionSummary['response']) && !empty($interactionSummary['response'])) { + $insertData['answer'] = (is_array($interactionSummary['response']) ? implode(", ", $interactionSummary['response']) : $interactionSummary['response']); + } + if ($interactionSummary['scorable'] || (isset($interactionSummary['score']) && $interactionSummary['score']['max'] > 0)) { + $insertData['score_scaled'] = $interactionSummary['score']['scaled']; + $insertData['score_min'] = $interactionSummary['score']['min']; + $insertData['score_max'] = $interactionSummary['score']['max']; + $insertData['score_raw'] = $interactionSummary['score']['raw']; } - // Overriding object name, when we have Questionnaire H5P, and object name is not available. - if ( - $defaultActivityName && - ($h5pInteraction && - in_array($insertData['verb'], ['completed', 'progressed']) && - preg_match('/^H5P.Questionnaire/', $h5pInteraction, $matches)) + } + // Overriding object name, when we have Questionnaire H5P, and object name is not available. + if ( + $defaultActivityName && + ($h5pInteraction && + in_array($insertData['verb'], ['completed', 'progressed']) && + preg_match('/^H5P.Questionnaire/', $h5pInteraction, $matches)) ) { $insertData['object_name'] = $matches[0]; } - // need to determine column layout interaction on 'completed'. - if (($h5pInteraction && - in_array($insertData['verb'], ['completed', 'progressed']) && - preg_match('/^H5P.Column/', $h5pInteraction))) { + // need to determine column layout interaction on 'completed'. + if (($h5pInteraction && + in_array($insertData['verb'], ['completed', 'progressed']) && + preg_match('/^H5P.Column/', $h5pInteraction)) + ) { $insertData['page'] = $insertData['object_name']; $insertData['page_completed'] = $insertData['verb'] === 'completed' ? true : false; } - $inserted = $lrsStatementsRepository->create($insertData); + $inserted = $lrsStatementsRepository->create($insertData); - if ($inserted) { - //Capturing the custom verb "summary-curriki" for submit event with full summary rdbms.. - if ($verb === 'summary-curriki' && !empty($interactionSummaryGlobal)) { - if (isset($interactionSummaryGlobal['response']) && !empty($interactionSummaryGlobal['response'])) { - $responseObject = (is_array(json_decode($interactionSummaryGlobal['response'], true)) ? json_decode($interactionSummaryGlobal['response'], true) : false); - if (!empty($responseObject)) { - foreach ($responseObject as $response) { - $insertSummary = []; - $insertSummary['statement_id'] = $insertData['statement_id']; - $insertSummary['statement_uuid'] = $insertData['statement_uuid']; - $insertSummary['actor_homepage'] = $insertData['actor_homepage']; - $insertSummary['class_id'] = $insertData['class_id']; - $insertSummary['assignment_name'] = $insertData['assignment_name']; - $insertSummary['actor_id'] = $insertData['actor_id']; - $insertSummary['page_name'] = $response['title']; - $insertSummary['is_page_accessed'] = $response['accessed']; - $insertSummary['is_event_interacted'] = $response['interacted']; - $insertSummary['interacted_count'] = $response['interacted_count']; - $insertSummary['total_interactions'] = $response['total_interactions']; - $insertSummary['score'] = $response['score']; - $lrsStatementsSummaryDataRepositoryInterface->create($insertSummary); + if ($inserted) { + //Capturing the custom verb "summary-curriki" for submit event with full summary rdbms.. + if ($verb === 'summary-curriki' && !empty($interactionSummaryGlobal)) { + if (isset($interactionSummaryGlobal['response']) && !empty($interactionSummaryGlobal['response'])) { + $responseObject = (is_array(json_decode($interactionSummaryGlobal['response'], true)) ? json_decode($interactionSummaryGlobal['response'], true) : false); + if (!empty($responseObject)) { + foreach ($responseObject as $response) { + $insertSummary = []; + $insertSummary['statement_id'] = $insertData['statement_id']; + $insertSummary['statement_uuid'] = $insertData['statement_uuid']; + $insertSummary['actor_homepage'] = $insertData['actor_homepage']; + $insertSummary['class_id'] = $insertData['class_id']; + $insertSummary['assignment_name'] = $insertData['assignment_name']; + $insertSummary['actor_id'] = $insertData['actor_id']; + $insertSummary['page_name'] = $response['title']; + $insertSummary['is_page_accessed'] = $response['accessed']; + $insertSummary['is_event_interacted'] = $response['interacted']; + $insertSummary['interacted_count'] = $response['interacted_count']; + $insertSummary['total_interactions'] = $response['total_interactions']; + $insertSummary['score'] = $response['score']; + $lrsStatementsSummaryDataRepositoryInterface->create($insertSummary); - \Log::info(date('Y-m-d h:i:s') . ' - RDBMS custom verb statement with statement id : ' . $insertData['statement_id'] . ' processed'); - } + \Log::info(date('Y-m-d h:i:s') . ' - RDBMS custom verb statement with statement id : ' . $insertData['statement_id'] . ' processed'); } } } } - } catch (Exception $e) { - Log::error('Summary page Cronjob crashed on row id ' . $row->id . ' - ' . $e->getMessage() . ' / Line = ' . $e->getLine()); } } \Log::info(date('Y-m-d h:i:s') . ' - Extract XAPI script ended'); diff --git a/app/Http/Controllers/Api/V1/CurrikiGo/LmsController.php b/app/Http/Controllers/Api/V1/CurrikiGo/LmsController.php index 7f2648c5f..806f847e0 100644 --- a/app/Http/Controllers/Api/V1/CurrikiGo/LmsController.php +++ b/app/Http/Controllers/Api/V1/CurrikiGo/LmsController.php @@ -246,13 +246,11 @@ public function teams(TeamsSearchRequest $request) */ public function independentActivities(IndependentActivityForDeeplink $request) { - $settings = LmsSetting::where('lti_client_id', $request->lti_client_id)->where('lms_login_id', 'ilike', $request->user_email); - $orgs = $settings->pluck('organization_id'); - $user = $settings->first(); - if ($orgs) { - return IndependentActivityResource::collection($this->independentActivityRepository->independentActivities($request, $user->user_id, $orgs)); + $orgs = LmsSetting::where('lti_client_id', $request->lti_client_id)->where('lms_login_id', 'ilike', $request->user_email)->pluck('organization_id'); + $user = User::where('email', strtolower($request->user_email))->first(); + if($user){ + return IndependentActivityResource::collection($this->independentActivityRepository->independentActivities($request, $user->id, $orgs)); } - return response([ 'data' => ['Could not find any independent activity. Please try again later.'], ], 400); diff --git a/app/Http/Controllers/Api/V1/H5pController.php b/app/Http/Controllers/Api/V1/H5pController.php index efab81f46..2f516488a 100644 --- a/app/Http/Controllers/Api/V1/H5pController.php +++ b/app/Http/Controllers/Api/V1/H5pController.php @@ -24,7 +24,6 @@ use App\Repositories\CurrikiGo\ContentUserDataGo\ContentUserDataGoRepositoryInterface; use App\CurrikiGo\Brightcove\Client; use App\CurrikiGo\Brightcove\Videos\UpdateVideoTags; -use App\Models\Organization; /** * @group 12. H5P @@ -100,14 +99,8 @@ public function create(Request $request) } $parameters = '{"params":{},"metadata":{}}'; + $display_options = $core->getDisplayOptionsForEdit(NULL); - if ($request->get('organizationId')) { - $organization = Organization::find($request->get('organizationId')); - if($organization) { - $display_options['export'] = $organization->h5p_reuse_option; - $display_options['embed'] = $organization->h5p_embed_option; - } - } $lib = $request->get('libraryName'); // view Get the file and settings to print from $settings = $h5p::get_editor($content = null, $lib); diff --git a/app/Http/Controllers/Api/V1/IndependentActivityController.php b/app/Http/Controllers/Api/V1/IndependentActivityController.php index c2df0532a..2bf60a4e5 100644 --- a/app/Http/Controllers/Api/V1/IndependentActivityController.php +++ b/app/Http/Controllers/Api/V1/IndependentActivityController.php @@ -653,10 +653,7 @@ public function h5p(IndependentActivity $independent_activity) $content['library']['majorVersion'] . '.' . $content['library']['minorVersion'] )); $user_data = $user->only(['id', 'name', 'email']); - if($independent_activity->organization_id) { - $settings['contents']['cid-' . $content['id']]['displayOptions']['export'] = $independent_activity->organization->h5p_reuse_option; - $settings['contents']['cid-' . $content['id']]['displayOptions']['embed'] = $independent_activity->organization->h5p_embed_option; - } + $h5p_data = ['settings' => $settings, 'user' => $user_data, 'embed_code' => $embed_code]; return response([ 'independent-activity' => new H5pIndependentActivityResource($independent_activity, $h5p_data) diff --git a/app/Http/Controllers/Api/V1/MicroSoftTeamController.php b/app/Http/Controllers/Api/V1/MicroSoftTeamController.php index bbebdf5b1..911b00989 100644 --- a/app/Http/Controllers/Api/V1/MicroSoftTeamController.php +++ b/app/Http/Controllers/Api/V1/MicroSoftTeamController.php @@ -131,13 +131,12 @@ public function getAccessToken(Request $request) */ public function getAccessTokenViaCode(GetTokenViaCode $request) { - $accessToken = $this->microsoftTeamRepository->getTokenViaCode($request); - - if ($accessToken && array_key_exists('access_token', $accessToken)) { - $request['token'] = $accessToken['access_token']; - $getSubmission = $this->microsoftTeamRepository->getSubmission($request); + $accessToken = $this->microsoftTeamRepository->getTokenViaCode($request); - if ($getSubmission && array_key_exists('status', $getSubmission)) { + if ($accessToken && array_key_exists('access_token', $accessToken)) { + $request['token'] = $accessToken['access_token']; + $getSubmission = $this->microsoftTeamRepository->getSubmission($request); + return response([ 'status_code' => 200, 'message' => 'Token fetched successfully.', @@ -146,17 +145,11 @@ public function getAccessTokenViaCode(GetTokenViaCode $request) 'refresh_token' => $accessToken['refresh_token'] ], 200); } - return response([ 'status_code' => 424, - 'errors' => $getSubmission['error'], - ], 500); - } - return response([ - 'status_code' => 424, - 'errors' => $accessToken['error'], - 'message' => $accessToken['error_description'] - ], 500); + 'errors' => $accessToken['error'], + 'message' => $accessToken['error_description'] + ], 500); } /** @@ -268,16 +261,16 @@ public function getUserPofile(GetUserProfileRequest $request) if ($accessToken && array_key_exists('access_token', $accessToken)) { $getProfile = $this->microsoftTeamRepository->getUserProfile($accessToken['access_token']); - return response([ - 'profile' => $getProfile, - ], 200); - } else { - return response([ - 'status_code' => 424, - 'errors' => $accessToken['error'], - 'message' => $accessToken['error_description'] - ], 500); + if ($getProfile && array_key_exists('displayName', $getProfile)) { + return response([ + 'profile' => $getProfile, + ], 200); + } } + + return response([ + 'profile' => 'Something went wrong with the login code or token, unable to fetch user profile', + ], 400); } /** diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php index af3a31c2d..92c68a405 100644 --- a/app/Http/Controllers/Auth/AuthController.php +++ b/app/Http/Controllers/Auth/AuthController.php @@ -898,7 +898,7 @@ public function ltiSsoLogin1p0(SsoLoginRequest $request) { $user = $this->userRepository->create([ 'first_name' => $result['first_name'], 'last_name' => $result['last_name'], - 'email' => strtolower($result['user_email']), + 'email' => $result['user_email'], 'password' => Hash::make($password), 'remember_token' => Str::random(64), 'email_verified_at' => now(), @@ -913,7 +913,7 @@ public function ltiSsoLogin1p0(SsoLoginRequest $request) { } $default_lms_setting = $default_lms_setting->toArray(); - $default_lms_setting['lms_login_id'] = strtolower($user['user_email']); + $default_lms_setting['lms_login_id'] = $user['user_email']; $user->lmssetting()->create($default_lms_setting); $user->ssoLogin()->create([ @@ -949,7 +949,7 @@ public function ltiSsoLogin1p0(SsoLoginRequest $request) { ], 404); } $default_lms_setting = $default_lms_setting->toArray(); - $default_lms_setting['lms_login_id'] = strtolower($user['user_email']); + $default_lms_setting['lms_login_id'] = $user['user_email']; $newly_created_setting = $user->lmssetting()->create($default_lms_setting); $organization = $this->organizationRepository->find($newly_created_setting->id); diff --git a/app/Http/Requests/V1/GetTokenViaCode.php b/app/Http/Requests/V1/GetTokenViaCode.php index 2cdaebcf2..24cd51363 100644 --- a/app/Http/Requests/V1/GetTokenViaCode.php +++ b/app/Http/Requests/V1/GetTokenViaCode.php @@ -28,7 +28,6 @@ public function rules() 'classId' => 'required', 'assignmentId' => 'required', 'submissionId' => 'required', - 'tenantId' => 'required', ]; } } diff --git a/app/Http/Requests/V1/SuborganizationSave.php b/app/Http/Requests/V1/SuborganizationSave.php index 2e8355829..731c75c6b 100644 --- a/app/Http/Requests/V1/SuborganizationSave.php +++ b/app/Http/Requests/V1/SuborganizationSave.php @@ -55,9 +55,7 @@ public function rules() 'secondary_font_family' => 'string|nullable|max:255', 'auto_approve' => 'boolean|nullable', 'activity_title_text' => 'string|nullable|max:255', - 'activity_title_placeholder' => 'string|nullable|max:255', - 'h5p_embed_option' => 'boolean|nullable', - 'h5p_reuse_option' => 'boolean|nullable' + 'activity_title_placeholder' => 'string|nullable|max:255' ]; } diff --git a/app/Http/Requests/V1/SuborganizationUpdate.php b/app/Http/Requests/V1/SuborganizationUpdate.php index 13254e6f1..d8742a3b6 100644 --- a/app/Http/Requests/V1/SuborganizationUpdate.php +++ b/app/Http/Requests/V1/SuborganizationUpdate.php @@ -63,9 +63,7 @@ public function rules() 'secondary_font_family' => 'string|nullable|max:255', 'auto_approve' => 'boolean|nullable', 'activity_title_text' => 'string|nullable|max:255', - 'activity_title_placeholder' => 'string|nullable|max:255', - 'h5p_embed_option' => 'boolean|nullable', - 'h5p_reuse_option' => 'boolean|nullable' + 'activity_title_placeholder' => 'string|nullable|max:255' ]; } diff --git a/app/Http/Resources/V1/OrganizationResource.php b/app/Http/Resources/V1/OrganizationResource.php index 351ca2bc3..91c1738ee 100644 --- a/app/Http/Resources/V1/OrganizationResource.php +++ b/app/Http/Resources/V1/OrganizationResource.php @@ -103,9 +103,7 @@ public function toArray($request) 'msteam_activity_visibility' => $this->msteam_activity_visibility, 'auto_approve' => $this->auto_approve, 'activity_title_text' => $this->activity_title_text, - 'activity_title_placeholder' => $this->activity_title_placeholder, - 'h5p_reuse_option' => $this->h5p_reuse_option, - 'h5p_embed_option' => $this->h5p_embed_option + 'activity_title_placeholder' => $this->activity_title_placeholder ]; } } diff --git a/app/Models/GoogleClassroom.php b/app/Models/GoogleClassroom.php index 6d23adeca..d72d728ac 100644 --- a/app/Models/GoogleClassroom.php +++ b/app/Models/GoogleClassroom.php @@ -52,11 +52,8 @@ public static function boot() self::creating(function(GoogleClassroom $gclassData) { $gclassData->curriki_teacher_email = strtolower($gclassData->curriki_teacher_email); - $gclassData->teacher_group_email = strtolower($gclassData->teacher_group_email); - $gclassData->course_group_email = strtolower($gclassData->course_group_email); }); } - /** * Get the user_id for the teacher */ diff --git a/app/Models/Organization.php b/app/Models/Organization.php index c46483935..821240f84 100644 --- a/app/Models/Organization.php +++ b/app/Models/Organization.php @@ -54,9 +54,7 @@ class Organization extends Model 'msteam_activity_visibility', 'auto_approve', 'activity_title_text', - 'activity_title_placeholder', - 'h5p_embed_option', - 'h5p_reuse_option' + 'activity_title_placeholder' ]; /** diff --git a/app/Repositories/ActivityItem/ActivityItemRepository.php b/app/Repositories/ActivityItem/ActivityItemRepository.php index 5c647109a..a5cac34d4 100644 --- a/app/Repositories/ActivityItem/ActivityItemRepository.php +++ b/app/Repositories/ActivityItem/ActivityItemRepository.php @@ -36,14 +36,13 @@ public function getAll($suborganization, $data) if (isset($data['skipPagination']) && $data['skipPagination'] === 'true') { return $query->where('organization_id', $suborganization->id) - ->where('is_active', true) - ->orderBy('order', 'ASC') - ->orderBy('title', 'ASC') - ->get(); + ->orderBy('order', 'ASC') + ->orderBy('title', 'ASC') + ->get(); } if (isset($data['filter']) && $data['filter'] !== '') { $query = $query->whereHas('activityType', function ($qry) use ($data) { - $qry->where('id', $data['filter']); + $qry->where('id',$data['filter']); }); } $perPage = isset($data['size']) ? $data['size'] : config('constants.default-pagination-per-page'); @@ -56,10 +55,9 @@ public function getAll($suborganization, $data) } return $query->where('organization_id', $suborganization->id) - ->where('is_active', true) - ->orderBy('order', 'ASC') - ->orderBy('title', 'ASC') - ->paginate($perPage)->withQueryString(); + ->orderBy('order', 'ASC') + ->orderBy('title', 'ASC') + ->paginate($perPage)->withQueryString(); } /** diff --git a/app/Repositories/MicrosoftTeam/MicrosoftTeamRepository.php b/app/Repositories/MicrosoftTeam/MicrosoftTeamRepository.php index c67feefbb..9bad5d59e 100644 --- a/app/Repositories/MicrosoftTeam/MicrosoftTeamRepository.php +++ b/app/Repositories/MicrosoftTeam/MicrosoftTeamRepository.php @@ -89,7 +89,7 @@ public function getToken($code) */ public function getTokenViaCode($request) { - $apiURL = $this->loginUrl . '/' . $request->tenantId . '/oauth2/v2.0/token'; + $postInput = [ 'grant_type' => 'authorization_code', 'client_id' => $this->clientId, @@ -103,7 +103,7 @@ public function getTokenViaCode($request) 'X-header' => 'value' ]; - $response = Http::asForm()->withOptions(["verify"=>false])->post($apiURL, $postInput); + $response = Http::asForm()->withOptions(["verify"=>false])->post($this->apiURL, $postInput); $statusCode = $response->status(); $responseBody = json_decode($response->getBody(), true); @@ -418,7 +418,7 @@ private function getUserDetails($token) */ public function getUserProfile($token) { - $apiURL = $this->landingUrl . '/me'; + $apiURL = $this->landingUrl . '/profile'; $headers = [ 'Content-length' => 0, 'Content-type' => 'application/json', diff --git a/app/Repositories/Organization/OrganizationRepository.php b/app/Repositories/Organization/OrganizationRepository.php index af08fc4b9..642e5519f 100644 --- a/app/Repositories/Organization/OrganizationRepository.php +++ b/app/Repositories/Organization/OrganizationRepository.php @@ -780,7 +780,7 @@ public function fetchOrganizationUsers($data, $organization) $organizationUsers = $organizationUsers->orderBy($data['order_by_column'], $orderByType); } - $organizationUsers = $organizationUsers->withCount([ + return $organizationUsers->withCount([ 'projects' => function ($query) use ($organization) { $query->where('organization_id', $organization->id); }, @@ -790,17 +790,14 @@ public function fetchOrganizationUsers($data, $organization) 'groups' => function ($query) use ($organization) { $query->where('organization_id', $organization->id); } - ]); - - if (isset($data['query']) && $data['query'] !== '') { - $organizationUsers = $organizationUsers->where(function ($query) use ($data) { + ]) + ->when($data['query'] ?? null, function ($query) use ($data) { $query->where('email', 'like', '%' . str_replace("_", "\_", strtolower($data['query'])) . '%'); $query->orWhere('first_name', 'iLike', '%' . $data['query'] . '%'); $query->orWhere('last_name', 'iLike', '%' . $data['query'] . '%'); - }); - } - - return $organizationUsers->paginate($perPage)->withQueryString(); + return $query; + }) + ->paginate($perPage)->withQueryString(); } /** diff --git a/app/Repositories/Project/ProjectRepository.php b/app/Repositories/Project/ProjectRepository.php index 089482395..1be8a6485 100644 --- a/app/Repositories/Project/ProjectRepository.php +++ b/app/Repositories/Project/ProjectRepository.php @@ -230,8 +230,7 @@ public function fetchByLtiClient($lti_client_id) */ public function fetchByLtiClientAndEmail($lti_client_id, $user_email, $searchTerm, $lms_organization_id) { - return $this->model->whereIn('organization_id', $lms_organization_id)->where('name', 'iLIKE', '%' . $searchTerm . '%') - ->where('team_id', null)->whereHas('users', function ($query_user) use ($lti_client_id, $user_email) { + return $this->model->whereIn('organization_id', $lms_organization_id)->where('name', 'iLIKE', '%' . $searchTerm . '%')->whereHas('users', function ($query_user) use ($lti_client_id, $user_email) { $query_user->whereHas('lmssetting', function ($query_lmssetting) use ($lti_client_id, $user_email) { $query_lmssetting->where('lti_client_id', $lti_client_id); $query_lmssetting->where('lms_login_id', 'ilike', $user_email); diff --git a/app/Services/LearnerRecordStoreService.php b/app/Services/LearnerRecordStoreService.php index 4bbe312db..24b9e7609 100644 --- a/app/Services/LearnerRecordStoreService.php +++ b/app/Services/LearnerRecordStoreService.php @@ -691,7 +691,7 @@ public function findGroupingInfo(array $other) ]; if (!empty($other)) { $attempt_pattern = "/\/activity\/(\d*)\/submission\/(.*)\/(\d*)/"; - $class_pattern = "/\/(gclass|lti)\/(.*)/"; + $class_pattern = "/\/(gclass|lti)\/(\d*)/"; $matches = []; $class_matches = []; // Other regexes saved for later. diff --git a/charts/curriki/templates/api-ing.yaml b/charts/curriki/templates/api-ing.yaml index cea68a2f4..b0200c585 100644 --- a/charts/curriki/templates/api-ing.yaml +++ b/charts/curriki/templates/api-ing.yaml @@ -9,10 +9,10 @@ metadata: spec: tls: - hosts: - - stage.currikistudio.org + - {{.Values.host}} secretName: letsencrypt rules: - - host: stage.currikistudio.org + - host: {{.Values.host}} http: paths: - pathType: Prefix diff --git a/charts/curriki/templates/api.yaml b/charts/curriki/templates/api.yaml index 25b930361..67a5f8974 100644 --- a/charts/curriki/templates/api.yaml +++ b/charts/curriki/templates/api.yaml @@ -18,30 +18,71 @@ spec: rollme: {{ randAlphaNum 5 | quote }} spec: containers: - - name: api + - name: nginx + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} image: {{ .Values.image.apirepo}} #quay.io/curriki/api:stage imagePullPolicy: Always + command: + - /bin/sh + - -c + - | + export nr_name=App && \ + sh /usr/local/bin/entrypoint.api.sh && \ + php /var/www/html/artisan storage:link && \ + nginx -g "daemon off;" ports: - - containerPort: 80 + - name: http + containerPort: 80 + protocol: TCP + securityContext: + privileged: true readinessProbe: - tcpSocket: - port: 80 - initialDelaySeconds: 5 + failureThreshold: 10 + initialDelaySeconds: 10 periodSeconds: 10 - livenessProbe: + successThreshold: 1 tcpSocket: - port: 80 - initialDelaySeconds: 15 + port: 9000 + livenessProbe: + initialDelaySeconds: 200 periodSeconds: 20 + tcpSocket: + port: 9000 + resources: + limits: + cpu: 100m + memory: 100Mi + requests: + cpu: 50m + memory: 50Mi volumeMounts: - name: api-env mountPath: /var/www/html/.env subPath: .env - name: nfs-volume mountPath: /var/www/html/storage - envFrom: - - secretRef: - name: api-env + - name: currikicert + mountPath: /etc/ssl/curriki.cert + subPath: curriki.cert + - name: currikikey + mountPath: /etc/ssl/curriki.key + subPath: curriki.key + - name: php-fpm + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: {{ .Values.image.apirepo}} #quay.io/curriki/api:stage + imagePullPolicy: Always + securityContext: + privileged: true + command: + - /bin/sh + - -c + - | + export nr_name=App && \ + sh /usr/local/bin/entrypoint.api.sh && \ + php /var/www/html/artisan storage:link && \ + php-fpm -c /etc/php/8.1/fpm/php.ini --fpm-config=/usr/local/etc/php-fpm.conf -F -O resources: limits: cpu: 600m @@ -49,12 +90,22 @@ spec: requests: cpu: 350m memory: 800Mi - command: - - /bin/sh - - -c - - | - php /var/www/html/artisan storage:link - apache2ctl -D FOREGROUND + volumeMounts: + - name: api-env + mountPath: /var/www/html/.env + subPath: .env + - name: nfs-volume + mountPath: /var/www/html/storage + - name: currikicert + mountPath: /etc/ssl/curriki.cert + subPath: curriki.cert + - name: currikikey + mountPath: /etc/ssl/curriki.key + subPath: curriki.key + envFrom: + - secretRef: + name: api-env + volumes: - name: api-env secret: @@ -64,9 +115,16 @@ spec: path: .env - name: nfs-volume nfs: - server: 139.144.231.192 - path: /mnt/storage + server: {{ .Values.nfsServer }} + path: {{ .Values.volumePath }} readOnly: no + - name: currikicert + configMap: + name: currikicert + - name: currikikey + configMap: + name: currikikey + --- @@ -79,6 +137,12 @@ spec: ports: - port: 80 targetPort: 80 + protocol: TCP + name: http + - port: 443 + targetPort: 80 + protocol: TCP + name: https selector: app: {{ .Release.Name }}-api @@ -170,8 +234,8 @@ spec: - name: nfs-volume nfs: - server: 139.144.231.192 - path: /mnt/storage + server: {{ .Values.nfsServer }} + path: {{ .Values.volumePath }} readOnly: no @@ -224,8 +288,8 @@ spec: path: .env - name: nfs-volume nfs: - server: 139.144.231.192 - path: /mnt/storage + server: {{ .Values.nfsServer }} + path: {{ .Values.volumePath }} readOnly: no backoffLimit: 4 @@ -277,6 +341,6 @@ spec: path: .env - name: nfs-volume nfs: - server: 139.144.231.192 - path: /mnt/storage + server: {{ .Values.nfsServer }} + path: {{ .Values.volumePath }} readOnly: no \ No newline at end of file diff --git a/charts/curriki/templates/client.yaml b/charts/curriki/templates/client.yaml index 04f95b3ee..b70608761 100644 --- a/charts/curriki/templates/client.yaml +++ b/charts/curriki/templates/client.yaml @@ -37,7 +37,6 @@ spec: - name: client-env-local mountPath: /usr/share/nginx/html/.env subPath: .env - volumeMounts: - name: client-env-script mountPath: /usr/share/nginx/html/runtime-env.js subPath: runtime-env.js @@ -69,21 +68,10 @@ kind: ConfigMap metadata: name: client-env data: - REACT_APP_PEXEL_API: "563492ad6f91700001000001155d7b75f5424ea694b81ce9f867dddf" - REACT_APP_API_URL: "https://stage.currikistudio.org/api/api" - REACT_APP_RESOURCE_URL: "https://stage.currikistudio.org/api" - REACT_APP_GOOGLE_CAPTCHA: "6LdImbgZAAAAAN4s1eEi53-ul7uJfLONrFuBcKS0" - REACT_APP_GAPI_CLIENT_ID: "898143939834-9ioui2i9ghgrmcgmgtg0h6rsf83d0t0c.apps.googleusercontent.com" - REACT_APP_HUBSPOT: "7874555" - REACT_APP_API_VERSION: "v1" - REACT_APP_H5P_KEY: "B6TFsmFD5TLZaWCAYZ91ly0D2We0xjLAtRmBJzQ" - REACT_APP_TSUGI_SERVER_URL: "https://stage-tsugi.currikistudio.org/mod/curriki/" - REACT_APP_SHARED_PROJECT_DEMO_USER: "demoaccount@gmail.com" - REACT_APP_SHARED_PROJECT_DEMO_PASS: "Qwerty123" - REACT_APP_SHARED_PROJECT_USERID: "1608" - REACT_MS_APP_ID: "5e0ea881-693a-4f0a-94a7-dcef7b5accd6" - REACT_MS_TENANT_ID: "75f881ff-c83b-44de-a964-f0f9ee64c60c" - REACT_DOMAIN_URL: "https://stage.currikistudio.org/" + {{- with .Values.clientEnvConfigMap }} + {{- toYaml . | nindent 2}} + {{- end}} + --- @@ -92,23 +80,8 @@ kind: ConfigMap metadata: name: client-env-local data: - .env: | - REACT_APP_PEXEL_API=563492ad6f91700001000001155d7b75f5424ea694b81ce9f867dddf - REACT_APP_API_URL=https://stage.currikistudio.org/api/api - REACT_APP_RESOURCE_URL=https://stage.currikistudio.org/api - REACT_APP_GOOGLE_CAPTCHA=6LdImbgZAAAAAN4s1eEi53-ul7uJfLONrFuBcKS0 - REACT_APP_GAPI_CLIENT_ID=898143939834-9ioui2i9ghgrmcgmgtg0h6rsf83d0t0c.apps.googleusercontent.com - REACT_APP_HUBSPOT=7874555 - REACT_APP_API_VERSION=v1 - REACT_APP_H5P_KEY=B6TFsmFD5TLZaWCAYZ91ly0D2We0xjLAtRmBJzQ - REACT_APP_TSUGI_SERVER_URL=https://stage-tsugi.currikistudio.org/mod/curriki/ - REACT_APP_SHARED_PROJECT_DEMO_USER=demoaccount@gmail.com - REACT_APP_SHARED_PROJECT_DEMO_PASS=Qwerty123 - REACT_APP_SHARED_PROJECT_USERID=1608 - REACT_MS_APP_ID=5e0ea881-693a-4f0a-94a7-dcef7b5accd6 - REACT_MS_TENANT_ID=75f881ff-c83b-44de-a964-f0f9ee64c60c - REACT_DOMAIN_URL=https://stage.currikistudio.org/ - + .env: {{- .Values.clientEnvLocalConfigMap | toYaml | indent 2 }} + --- apiVersion: v1 @@ -116,8 +89,7 @@ kind: ConfigMap metadata: name: client-env-script data: - runtime-env.js: | - window.__RUNTIME_CONFIG__ = {"REACT_APP_PEXEL_API":"563492ad6f91700001000001155d7b75f5424ea694b81ce9f867dddf","REACT_APP_API_URL":"https://stage.currikistudio.org/api/api","REACT_APP_RESOURCE_URL":"https://stage.currikistudio.org/api","REACT_APP_GOOGLE_CAPTCHA":"6LdImbgZAAAAAN4s1eEi53-ul7uJfLONrFuBcKS0","REACT_APP_GAPI_CLIENT_ID":"898143939834-9ioui2i9ghgrmcgmgtg0h6rsf83d0t0c.apps.googleusercontent.com","REACT_APP_HUBSPOT":"7874555","REACT_APP_API_VERSION":"v1","REACT_APP_H5P_KEY":"B6TFsmFD5TLZaWCAYZ91ly0D2We0xjLAtRmBJzQ","REACT_APP_TSUGI_SERVER_URL":"https://stage-tsugi.currikistudio.org/mod/curriki/","REACT_APP_SHARED_PROJECT_DEMO_USER":"demoaccount@gmail.com","REACT_APP_SHARED_PROJECT_DEMO_PASS":"Qwerty123","REACT_APP_SHARED_PROJECT_USERID":"1608","REACT_MS_APP_ID":"5e0ea881-693a-4f0a-94a7-dcef7b5accd6","REACT_MS_TENANT_ID":"75f881ff-c83b-44de-a964-f0f9ee64c60c","REACT_DOMAIN_URL":"https://stage.currikistudio.org/"}; + runtime-env.js: {{- .Values.clientRuntimeConfig | toYaml | indent 2 }} --- apiVersion: v1 diff --git a/charts/curriki/templates/ingress.yaml b/charts/curriki/templates/ingress.yaml index 96f4bacdc..b6df402d5 100644 --- a/charts/curriki/templates/ingress.yaml +++ b/charts/curriki/templates/ingress.yaml @@ -8,49 +8,11 @@ metadata: spec: tls: - hosts: - - stage.currikistudio.org - - stage-api.currikistudio.org - - stage-trax.currikistudio.org - - stage-tsugi.currikistudio.org + {{- with .Values.ingHosts }} + {{- toYaml . | nindent 6}} + {{- end}} secretName: letsencrypt rules: - - host: stage.currikistudio.org - http: - paths: - - pathType: Prefix - path: "/" - backend: - service: - name: client-svc - port: - number: 80 - - host: stage-api.currikistudio.org - http: - paths: - - pathType: Prefix - path: "/" - backend: - service: - name: api-svc - port: - number: 80 - - host: stage-trax.currikistudio.org - http: - paths: - - pathType: Prefix - path: "/" - backend: - service: - name: trax-svc - port: - number: 80 - - host: stage-tsugi.currikistudio.org - http: - paths: - - pathType: Prefix - path: "/" - backend: - service: - name: tsugi-svc - port: - number: 80 \ No newline at end of file + {{- with .Values.ingRules }} + {{- toYaml . | nindent 4}} + {{- end}} \ No newline at end of file diff --git a/charts/curriki/templates/trax.yaml b/charts/curriki/templates/trax.yaml index f519d0cfb..027356710 100644 --- a/charts/curriki/templates/trax.yaml +++ b/charts/curriki/templates/trax.yaml @@ -67,8 +67,8 @@ spec: path: .env - name: nfs-volume nfs: - server: 139.144.231.192 - path: /mnt/traxstorage + server: {{ .Values.nfsServer }} + path: {{ .Values.traxStorage }} readOnly: no diff --git a/charts/curriki/templates/tsugi.yaml b/charts/curriki/templates/tsugi.yaml index 1819f5be7..c675c104f 100644 --- a/charts/curriki/templates/tsugi.yaml +++ b/charts/curriki/templates/tsugi.yaml @@ -66,9 +66,8 @@ kind: ConfigMap metadata: name: tsugi-mod-config data: - config.php: | - UpdateH5PVideoLibraryFileSeeder::class, + '--force' => true + ]); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + + } +} diff --git a/jenkins/Jenkinsfile.api b/jenkins/Jenkinsfile.api index 2e2139fd9..9900b16e1 100644 --- a/jenkins/Jenkinsfile.api +++ b/jenkins/Jenkinsfile.api @@ -30,20 +30,16 @@ node("currikidev") { } } - stage('Deploy Helm') { - if(env.BRANCH_NAME == "staging") { - echo 'Copy' - sh 'curl https://raw.githubusercontent.com/helm/helm/v3.7.0/scripts/get-helm-3 | DESIRED_VERSION="v3.7.0" bash' - sh """ - #!/bin/bash - set -ex - echo "${kubeconfig}" >> kubeconfig + /*stage('Deploy Helm') { + echo 'Copy' + sh 'curl https://raw.githubusercontent.com/helm/helm/v3.7.0/scripts/get-helm-3 | DESIRED_VERSION="v3.7.0" bash' + sh """ + #!/bin/bash + set -ex + echo "${kubeconfig}" >> kubeconfig """ - sh 'helm upgrade --install curriki charts/curriki -f charts/staging.yaml --namespace staging --kubeconfig $(pwd config)/kubeconfig' - } else { - echo 'No Kubernetes deployment' - } - } + sh 'helm upgrade --install curriki charts/curriki --namespace staging --kubeconfig $(pwd config)/kubeconfig' + }*/ @@ -70,4 +66,4 @@ node("currikidev") { } ) -} \ No newline at end of file +}