<?php class Controller_Api_V0_GlobalDiscipline extends Controller_Handler_Api { private function normalizeDisciplinesData($disciplineData, $facultyID) { foreach ($disciplineData->teachers as $teacherData) { if (empty($teacherData->id)) { Log::instance()->add(Log::WARNING, '{0} {1}: {2}', array( '{0}' => 'SYNC_GLOBAL_DISCIPLINES', '{1}' => 'Discipline with empty teacher\'s hash INILA', '{2}' => json_encode($disciplineData), )); } else { $ID = Model_Teacher::withINILA($teacherData->id); if ($ID != -1) { $disciplineData->teacherIDs[] = $ID; } } } if (empty($disciplineData->teacherIDs)) { throw new InvalidArgumentException('Discipline without teachers'); } switch ($disciplineData->type) { case 'Экзамен': $disciplineData->type = Model_Discipline::EXAM; break; case 'Зачет': $disciplineData->type = Model_Discipline::CREDIT; break; case 'Дифференцированный зачет': $disciplineData->type = Model_Discipline::GRADING_CREDIT; break; default: throw new InvalidArgumentException('Discipline has bad type'); } // TODO: найти предмет по имени или создать новый, получать будем не id а имя предмета if (!isset($disciplineData->subjectID) && isset($disciplineData->externalID)) { $disciplineData->subjectID = Model_Subject::withExternalID($disciplineData->externalID, $disciplineData->subject, NULL, $facultyID); } return $disciplineData; } private function processDiscipline($disciplineData, $semesterID, $facultyID) { // TODO: всегда можно будет найти только одну межф. дисциплину по этому предмету? if (isset($disciplineData->subjectID)) { $discipline = Model_Discipline::find_by_subject($semesterID, $disciplineData->subjectID, $disciplineData->type); } if (isset($discipline)) { // TODO: это здесь делать нужно? //if (isset($disciplineData->gradeID)) { // $discipline->changeGradeUnsafe($disciplineData->gradeID); //} } else { if (empty($disciplineData->teacherIDs)) { throw new InvalidArgumentException('Cannot create discipline without teachers'); } $discipline = Model_Discipline::make() ->author($disciplineData->teacherIDs[0]) ->subject($disciplineData->subjectID) ->semester($semesterID) ->type($disciplineData->type) ->faculty($facultyID) ->create(); } if (!empty($disciplineData->teacherIDs)) { foreach ($disciplineData->teacherIDs as $teacherID) { $teacher = Model_Teacher::with($teacherID); $discipline->bind($teacher); } } return (int)$discipline->ID; } private function processGroup($groupData, $year, $semesterID) { $facultyID = Model_Faculties::getIdByExternalID($data->faculty); $disciplineIDs = []; try { $disciplineData = $this->normalizeDisciplinesData($groupData, $facultyID); $disciplineID = $this->processDiscipline($disciplineData, $semesterID, $facultyID); $disciplineIDs[] = $disciplineID; } catch (Exception $e) { Log::instance()->add(Log::WARNING, '{0} {1}: {2}', array( '{0}' => 'SYNC_GLOBAL_DISCIPLINES', '{1}' => $e->getMessage(), '{2}' => json_encode($groupData), )); } foreach ($groupData->students as &$studentData) { } return $disciplineIDs; } /** * @api {put} api/v0/globalDiscipline Add new study plan(s) * @apiName Add new global discipline * @apiGroup Disciplines * @apiVersion 0.1.3 * @apiParam {String} token Api key * @apiDescription This method accepts json body * with list of disciplines to add or update. * each discipline includes list of teachers and students inside * @apiExample {curl} Example usage: * curl --header "Content-Type: application/json" \ * --request POST \ * --data '{ * "year": "2018", * "semester": "2", * "groups": [ * { * "faculty": "000001387", * "subject": "Иностранный язык", * "externalID": "000021910", * "type": "зачет", * "teachers": [ * { * "id": "F6930CAE2DC449852775EDC953649339430BA297", * }, * { * "id": "45D58A5A2C33C45D02FAAC3829E28A0E6DF19C0E", * } * ], * "students": [ * { * "id": "ММ-18-0105", * "planId": "00132035", * "subdivisionId": "000001387", * * }, * { * "id": "ММ-18-0207", * "planId": "00132035", * "subdivisionId": "000001387", * * } * ], * } * ] * } * ' \ * http://grade/~dev_rating/api/v0/GlobalDiscipline?token=uie892hf?sD39syh92af9s90sjbh3Dfd9de33s */ public function action_put_index() { $res = []; try { $data = json_decode($this->request->body()); $year = (int)$data->year; $semesterID = (int)Model_Semesters::find($year, (int)$data->semester)->ID; // $facultyID = Model_Faculties::getIdByExternalID($data->faculty); foreach ($data->groups as $groupData) { $res[] = $this->processGroup($groupData, $year, $semesterID); } } catch (Exception $e) { $this->badRequestError($e->getMessage()); } return $res; } }