Skip to content
Snippets Groups Projects
GlobalDiscipline.php 6.49 KiB
Newer Older
<?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);
                $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) {
            
     * @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;
    }
}