json(["status" => false, "message" => "Rows not found"]) ->setStatusCode(404, "Rows not found"); } /* * Пустой массив для хранения списка чемпионатов */ $championshipsList = []; /* * Перебираем список всех найденых чемпионатов */ foreach ($championships as $championship) { /* * Упаковываем чемпионаты */ $championshipsList[] = [ "id" => $championship->id, //Идентификатор чемпионата "title" => $championship->title, //Название чемпионата "from" => $championship->from_date, //День старта чемпионата "to" => $championship->to_date, //День окончания чемпионата "month" => $championship->month()->first()->title, //Месяц "year" => $championship->year, //Год "group" => $championship->group, //Возрастная группа "status" => $championship->status, //Стутус данного чемпионата //Эксперт (организатор) чемпиоаната "expert" => [ "id" => $championship->expert()->first()->id, "name" => $championship->expert()->first()->name, "position" => $championship->expert()->first()->position ], "competence" => $championship->competence()->first()->title, //Название компетенции "location" => $championship->location ]; } /* * Возвращаем */ return response() ->json($championshipsList) ->setStatusCode(200, "Championships List"); } public function allByToken(Request $request) { /* * Загружаем пользователя, который выполняет действие */ $expert = UserController::getUserByToken($request->bearerToken()); /* * Если пользователь не имеет статус 1 (главный эксперт), возвращаем ошибку 403 */ if ($expert->position !== 1) return response()->json(["status" => false, "message" => "Permission denied"])->setStatusCode(403, 'Permission denied'); /* * Делаем выборку чемпионатов */ $championships = Championship::where('competence', $request->competence) ->where('year', $request->year) ->where('expert', $expert->id) ->get(); /* * Если чемпионаты не найдены, то ответ - 404 */ if (count($championships) === 0) { return response() ->json(["status" => false, "message" => "Rows not found"]) ->setStatusCode(404, "Rows not found"); } /* * Пустой массив для хранения списка чемпионатов */ $championshipsList = []; /* * Перебираем список всех найденых чемпионатов */ foreach ($championships as $championship) { /* * Упаковываем чемпионаты */ $championshipsList[] = [ "id" => $championship->id, //Идентификатор чемпионата "title" => $championship->title, //Название чемпионата "from" => $championship->from_date, //День старта чемпионата "to" => $championship->to_date, //День окончания чемпионата "month" => $championship->month()->first()->title, //Месяц "year" => $championship->year, //Год "group" => $championship->group, //Возрастная группа "status" => $championship->status, //Стутус данного чемпионата //Эксперт (организатор) чемпиоаната "expert" => [ "id" => $championship->expert()->first()->id, "name" => $championship->expert()->first()->name, "position" => $championship->expert()->first()->position ], "competence" => $championship->competence()->first()->title, //Название компетенции "location" => $championship->location ]; } /* * Возвращаем */ return response() ->json($championshipsList) ->setStatusCode(200, "Championships List"); } /** * Метод для получения информации о чемпионате * @param $id * @return \Illuminate\Http\JsonResponse */ public function one($id) { $this->champ_id = $id; /* * Ищем чемпионат по ID */ $championship = Championship::find($this->champ_id); /* * Проверяем наличие чемпионата. Если его нет, возвращаем ошибку 404 */ if (!$championship) return response() ->json(["status" => false, "message" => "Championship not found"]) ->setStatusCode(404, "Championship not found"); $championshipRes = [ "id" => $championship->id, //Идентификатор чемпионата "title" => $championship->title, //Название чемпионата "from" => $championship->from_date, //День старта чемпионата "to" => $championship->to_date, //День окончания чемпионата "month" => $championship->month()->first()->title, //Месяц "month_id" => $championship->month()->first()->id, //Месяц ID "year" => $championship->year, //Год "group" => $championship->group, //Возрастная группа "status" => $championship->status, //Стутус данного чемпионата "city" => $championship->city, //Стутус данного чемпионата "location" => $championship->location, //Место проведения чемпионата "competence" => $championship->competence()->first()->title, //Название компетенции "experts" => $championship->experts, "members" => $this->getResults(), "modules" => $championship->modules ]; return response() ->json($championshipRes); } /** * Метод для получения результатов по идентификатору чемпионата * @return array */ private function getResults() { $i = 0; /* * Список участников с результатами */ $membersResults = []; $members = Member::where('championship', $this->champ_id)->get(); /* * Загрузка всех модулей чемпионата */ $modules = Module::where('championship', $this->champ_id)->get(); /* * Перебираем всех участников и подсчитываем * баллы */ foreach ($members as $member) { /* * Массив для хранения результатов * каждого модуля для участника */ $modulesResults = []; /* * Переменная для подсчета общего кол-ва * очков участника */ $allScore = 0; /* * Перебираем все модули */ foreach ($modules as $module) { /* * Загружаем все критерии модуля */ $criteria = Result::where('module_id', $module->id) ->where('member_id', $member->id) ->get(); /* * Перемнная для хранения очков набранных * в данном модуле */ $modulePoints = 0; /* * Перебираем критерии и складываем баллы */ foreach ($criteria as $criterion) { /* * Складываем баллы в переменную $modulePoints */ $modulePoints = $modulePoints + $criterion->points * 1; } /* * Складываем баллы в переменную с общим кол-вом * очков за все модули */ $allScore = $allScore + $modulePoints; /* * Добавляем результаты и название модуля в массив $modulesResults */ $modulesResults[] = [ "title" => $module->title, "points" => round($modulePoints, 2) ]; } /* * Добавляем пользователя в массив с результати * участников */ $membersResults['member_' . $i] = [ "member_id" => $member->id, "name" => $member->name, "university" => $member->university, "modules" => $modulesResults, "all_score" => round($allScore, 2) ]; $i = $i + 1; } /* * Сортируем массив по ключу all_score (от лучшего результата к худшему) */ $membersResults = collect($membersResults) ->sortBy('all_score') ->reverse() ->toArray(); /* * Возвращаем массив с результатами */ return $membersResults; } /** * Создание нового чемпионата * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function create(Request $request) { /* * Загружаем пользователя, который выполняет действие */ $expert = UserController::getUserByToken($request->bearerToken()); /* * Если пользователь не имеет статус 1 (главный эксперт), возвращаем ошибку 403 */ if ($expert->position !== 1) return response()->json(["status" => false, "message" => "Permission denied"])->setStatusCode(403, 'Permission denied'); /* * Валидация полей */ $nowYear = date('Y'); //Текущая дата $validator = Validator::make( $request->all(), [ "title" => ['required'], "date_before" => ['required', 'numeric', 'max:31'], "date_after" => ['required', 'numeric', 'max:31'], "month" => ['required', 'numeric', 'max:12'], "year" => ['required', 'numeric', "max:$nowYear"], "location" => ['required'], "city" => ['required', 'numeric', 'max:3'], "competence" => ['required', 'numeric', 'max:200'], "age_group" => ['required', 'numeric', 'max:3'] ] ); /* * Проверяем результаты валидации */ if ($validator->fails()) return response()->json(["status" => false, "errors" => $validator->messages()])->setStatusCode(400, "Error fields"); /* * Создаем экземпляр чемпионата и добавляем в базу данных */ $champ = new Championship(); $champ->fill([ "title" => $request->title, "from_date" => $request->date_before, "to_date" => $request->date_after, "month" => $request->month, "year" => $request->year, "city" => $request->city, "group" => $request->age_group, "expert" => $expert->id, "competence" => $request->competence, "location" => $request->location, "status" => 1 ]); $champ->save(); /* * Успешный ответ */ return response()->json(['status' => true, "message" => "Championship successfully registered"], 201); } public function update(Request $request, $id) { /* * Загружаем пользователя, который выполняет действие */ $expert = UserController::getUserByToken($request->bearerToken()); /* * Если пользователь не имеет статус 1 (главный эксперт), возвращаем ошибку 403 */ if ($expert->position !== 1) return response()->json(["status" => false, "message" => "Permission denied"])->setStatusCode(403, 'Permission denied'); $champ = Championship::find($id); if (!$champ) return response()->json(["status" => false, "message" => "Championship not found"])->setStatusCode(404, 'Permission denied'); if ($expert->position !== $champ->expert) return response()->json(["status" => false, "message" => "Permission denied"])->setStatusCode(403, 'Permission denied'); /* * Валидация полей */ $nowYear = date('Y'); //Текущий год $validator = Validator::make( $request->all(), [ "title" => ['required'], "date_before" => ['required', 'numeric', 'max:31'], "date_after" => ['required', 'numeric', 'max:31'], "month" => ['required', 'numeric', 'max:12'], "year" => ['required', 'numeric', "max:$nowYear"], "location" => ['required'], "city" => ['required', 'numeric', 'max:3'], "age_group" => ['required', 'numeric', 'max:3'], "status" => ['required', 'numeric', 'max:3'] ] ); /* * Проверяем результаты валидации */ if ($validator->fails()) return response()->json(["status" => false, "errors" => $validator->messages()])->setStatusCode(400, "Error fields"); $champ->title = $request->title; $champ->from_date = $request->date_before; $champ->to_date = $request->date_after; $champ->month = $request->month; $champ->year = $request->year; $champ->group = $request->age_group; $champ->status = $request->status; $champ->location = $request->location; $champ->city = $request->city; $champ->save(); return response()->json(['status' => true, "message" => "Championship successfully updated"], 202); } public function addMember(Request $request, $id) { /* * Загружаем пользователя, который выполняет действие */ $expert = UserController::getUserByToken($request->bearerToken()); /* * Если пользователь не имеет статус 1 (главный эксперт), возвращаем ошибку 403 */ if ($expert->position !== 1) return response()->json(["status" => false, "message" => "Permission denied"])->setStatusCode(403, 'Permission denied'); $champ = Championship::find($id); if (!$champ) return response()->json(["status" => false, "message" => "Championship not found"])->setStatusCode(404, 'Championship not found'); if ($expert->position !== $champ->expert) return response()->json(["status" => false, "message" => "Permission denied"])->setStatusCode(403, 'Permission denied'); $validator = Validator::make( $request->all(), [ "name" => ['required'], "university" => ['required'], ] ); /* * Проверяем результаты валидации */ if ($validator->fails()) return response()->json(["status" => false, "errors" => $validator->messages()])->setStatusCode(400, "Error fields"); $member = new Member(); $member->name = $request->name; $member->university = $request->university; $member->championship = $id; $member->save(); return response()->json(['status' => true, "message" => "Member is added"], 201); } public function removeMember(Request $request, $champ_id, $member_id) { /* * Загружаем пользователя, который выполняет действие */ $expert = UserController::getUserByToken($request->bearerToken()); /* * Если пользователь не имеет статус 1 (главный эксперт), возвращаем ошибку 403 */ if ($expert->position !== 1) return response() ->json(["status" => false, "message" => "Permission denied"]) ->setStatusCode(403, 'Permission denied'); $champ = Championship::find($champ_id); if (!$champ) return response() ->json(["status" => false, "message" => "Championship not found"]) ->setStatusCode(404, 'Championship not found'); if ($expert->position !== $champ->expert) return response() ->json(["status" => false, "message" => "Permission denied"]) ->setStatusCode(403, 'Permission denied'); $member = Member::find($member_id); if (!$member) return response() ->json(["status" => false, "message" => "Member not found"]) ->setStatusCode(404, 'Member not found'); if ($member->championship != $champ->id) return response() ->json(["status" => false, "message" => "Member not found"]) ->setStatusCode(404, 'Member not found'); $member->delete(); return response() ->json(["status" => false, "message" => "Member is deleted"]) ->setStatusCode(200, 'Member is deleted'); } public function updateMember(Request $request, $champ_id, $member_id) { /* * Загружаем пользователя, который выполняет действие */ $expert = UserController::getUserByToken($request->bearerToken()); /* * Если пользователь не имеет статус 1 (главный эксперт), возвращаем ошибку 403 */ if ($expert->position !== 1) return response() ->json(["status" => false, "message" => "Permission denied"]) ->setStatusCode(403, 'Permission denied'); $champ = Championship::find($champ_id); if (!$champ) return response() ->json(["status" => false, "message" => "Championship not found"]) ->setStatusCode(404, 'Championship not found'); if ($expert->position !== $champ->expert) return response() ->json(["status" => false, "message" => "Permission denied"]) ->setStatusCode(403, 'Permission denied'); $member = Member::find($member_id); if (!$member) return response() ->json(["status" => false, "message" => "Member not found"]) ->setStatusCode(404, 'Member not found'); if ($member->championship != $champ->id) return response() ->json(["status" => false, "message" => "Member not found"]) ->setStatusCode(404, 'Member not found'); $validator = Validator::make( $request->all(), [ "name" => ['required'], "university" => ['required'], ] ); /* * Проверяем результаты валидации */ if ($validator->fails()) return response()->json(["status" => false, "errors" => $validator->messages()])->setStatusCode(400, "Error fields"); $member->name = $request->name; $member->university = $request->university; $member->save(); return response() ->json(["status" => false, "message" => "Member is updated"]) ->setStatusCode(202, 'Member is updated'); } }