<?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(strtoupper($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: $disciplineData->type = Model_Discipline::CREDIT; //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_global($semesterID, strval($disciplineData->globalExternalID)); } if (isset($discipline)) { Model_Discipline::update_global(strval($disciplineData->globalExternalID), $disciplineData->name); } 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(); $discipline->bindGlobal($disciplineData->name, $semesterID, strval($disciplineData->globalExternalID)); } 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($groupData->faculty); $disciplineID = null; try { $disciplineData = $this->normalizeDisciplinesData($groupData, $facultyID); $disciplineID = $this->processDiscipline($disciplineData, $semesterID, $facultyID); } catch (Exception $e) { Log::instance()->add(Log::WARNING, '{0} {1}: {2}', array( '{0}' => 'SYNC_GLOBAL_DISCIPLINES', '{1}' => $e->getMessage(), '{2}' => json_encode($groupData), )); } if ($disciplineID) { $disc = Model_Discipline::load($disciplineID); $disc->unbindAll(); foreach ($groupData->students as &$studentData) { try { $recordBook = Model_RecordBook::withExternalID($studentData->id); if (isset($recordBook)) { Model_RecordBook::bindInternal($recordBook, $disciplineID); } else { Log::instance()->add(Log::WARNING, '{0} {1}: {2}', array( '{0}' => 'SYNC_GLOBAL_DISCIPLINES', '{1}' => 'Can\'t find record book ', '{2}' => json_encode($recordBook), )); } } catch (Exception $e) { Log::instance()->add(Log::WARNING, '{0} {1}: {2}', array( '{0}' => 'SYNC_GLOBAL_DISCIPLINES', '{1}' => $e->getMessage(), '{2}' => json_encode($groupData), )); } } } return $disciplineID; } /** * @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; } }