123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666 |
- <?php
- namespace App\Http\Controllers;
- use App\Age_group;
- use App\Championship;
- use App\Competence;
- use App\Criterion;
- use App\Http\Controllers\UserController;
- use App\Module;
- use App\Month;
- use App\Result;
- use App\User;
- use App\Member;
- use Validator;
- use Illuminate\Http\Request;
- class ChampionshipsController extends Controller
- {
- private $champ_id = NULL;
- /**
- * Метод для получения списка всех чемпионатов
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- */
- public function all(Request $request)
- {
- /*
- * Делаем выборку чемпионатов
- */
- $championships = Championship::all();
- /*
- * Если чемпионаты не найдены, то ответ - 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");
- }
- 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');
- }
- }
|