From 45bec16c7fd1c20a2d546d4d7a253eede93344b5 Mon Sep 17 00:00:00 2001 From: nikden13 Date: Fri, 4 Dec 2020 11:09:57 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5,=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5,=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5,=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Filters/QueryFilter.php | 34 ++++++++ app/Filters/TimetableFilter.php | 40 ++++++++++ app/Http/Controllers/TimetableController.php | 78 +++++++++++++++++++ app/Http/Requests/TimetableRequest.php | 33 ++++++++ app/Models/Timetable.php | 31 ++++++++ ...0_12_03_171929_create_timetables_table.php | 48 ++++++++++++ routes/api.php | 2 + 7 files changed, 266 insertions(+) create mode 100644 app/Filters/QueryFilter.php create mode 100644 app/Filters/TimetableFilter.php create mode 100644 app/Http/Controllers/TimetableController.php create mode 100644 app/Http/Requests/TimetableRequest.php create mode 100644 app/Models/Timetable.php create mode 100644 database/migrations/2020_12_03_171929_create_timetables_table.php diff --git a/app/Filters/QueryFilter.php b/app/Filters/QueryFilter.php new file mode 100644 index 0000000..76d1f50 --- /dev/null +++ b/app/Filters/QueryFilter.php @@ -0,0 +1,34 @@ +builder = $builder; + $this->request = $request; + } + + public function apply() + { + foreach ($this->filters() as $filter => $value) { + if (method_exists($this, $filter)) { + if (!$value) { + continue; + } + $this->$filter($value); + } + } + return $this->builder; + } + + protected function filters() + { + return $this->request->all(); + } +} diff --git a/app/Filters/TimetableFilter.php b/app/Filters/TimetableFilter.php new file mode 100644 index 0000000..4688fc6 --- /dev/null +++ b/app/Filters/TimetableFilter.php @@ -0,0 +1,40 @@ +builder = $this->builder->where('class_id', $value); + } + + protected function teacher($value) + { + $this->builder = $this->builder->where('teacher_id', $value); + } + + protected function subject($value) + { + $this->builder = $this->builder->where('type_event', $value); + } + + protected function classroom($value) + { + $this->builder = $this->builder->where('classroom', $value); + } + + protected function date($value) + { + $start_date = str_replace('/', '-', $value); + $end_date = Carbon::parse($start_date) + ->addDays(5) + ->format('Y-m-d'); + $this->builder = $this->builder->whereBetween('date', [$start_date, $end_date]); + } + +} diff --git a/app/Http/Controllers/TimetableController.php b/app/Http/Controllers/TimetableController.php new file mode 100644 index 0000000..322c0f8 --- /dev/null +++ b/app/Http/Controllers/TimetableController.php @@ -0,0 +1,78 @@ +validate([ + 'date' => 'date_format:Y/m/d', + ]); + $builder = Timetable::all()->sortBy('timeStart'); + $timetables = (new TimetableFilter($builder, $request))->apply()->values(); + $answer = []; + for ($i = 0; $i < 6; $i++) { + $date = Carbon::parse($request->input('date')) + ->addDays($i) + ->format('Y-m-d'); + array_push($answer, [$date => $timetables->where('date', $date)->values()]); + } + return response()->json($answer, 200); + } + + //Получение расписания + public function show(Timetable $timetable) + { + return response()->json($timetable, 200); + } + + //создание расписания + public function store(TimetableRequest $request) + { + foreach($request->input('timetables') as $timetable) { + SchoolClass::findOrFail($timetable['class_id']); + Teacher::findOrFail($timetable['teacher_id']); + Subject::findOrFail($timetable['subject_id']); + Timetable::create($timetable); + } + + return response()->json(['message' => 'Timetable was created'], 201); + } + + //обновление расписания + public function update(Timetable $timetable, Request $request) + { + $request->validate([ + 'class_id' => 'required|integer|gt:0', + 'teacher_id' => 'required|integer|gt:0', + 'subject_id' => 'required|integer|gt:0', + 'date' => 'required|date_format:Y/m/d|', + 'time_start' => 'required|date_format:H:i', + 'time_end' => 'required|date_format:H:i|after:time_start', + ]); + SchoolClass::findOrFail($request->input('class_id')); + Teacher::findOrFail($request->input('teacher_id')); + Subject::findOrFail($request->input('subject_id')); + $timetable->update($request->all()); + return response()->json(['message' => 'Timetable was updated'], 200); + } + + //удаление расписания + public function destroy(Timetable $timetable) + { + $timetable->delete(); + return response()->json('', 204); + } +} diff --git a/app/Http/Requests/TimetableRequest.php b/app/Http/Requests/TimetableRequest.php new file mode 100644 index 0000000..51481c8 --- /dev/null +++ b/app/Http/Requests/TimetableRequest.php @@ -0,0 +1,33 @@ + 'required|array', + 'timetables.*.class_id' => 'required|integer|gt:0', + 'timetables.*.teacher_id' => 'required|integer|gt:0', + 'timetables.*.subject_id' => 'required|integer|gt:0', + 'timetables.*.date' => 'required|date_format:Y/m/d|', + 'timetables.*.time_start' => 'required|date_format:H:i', + //'timetables.*.time_end' => 'required|date_format:H:i|after:time_start', + /*'week' => 'required|array', + 'week.*.day' => 'required|array', + 'week.*.day.*.class_id' => 'required|integer|gt:0', + 'week.*.day.*.teacher_id' => 'required|integer|gt:0', + 'week.*.day.*.subject_id' => 'required|integer|gt:0', + 'week.*.day.*.date' => 'required|date_format:Y/m/d|', + 'week.*.day.*.time_start' => 'required|date_format:H:i', + 'week.*.day.*.time_end' => 'required|date_format:H:i|after:time_start',*/ + ]; + } +} diff --git a/app/Models/Timetable.php b/app/Models/Timetable.php new file mode 100644 index 0000000..e4d13ef --- /dev/null +++ b/app/Models/Timetable.php @@ -0,0 +1,31 @@ +belongsTo(Teacher::class); + } + + public function schoolClass() + { + return $this->belongsTo(SchoolClass::class,'class_id'); + } + + public function subject() + { + return $this->belongsTo(Subject::class); + } + +} diff --git a/database/migrations/2020_12_03_171929_create_timetables_table.php b/database/migrations/2020_12_03_171929_create_timetables_table.php new file mode 100644 index 0000000..451f9eb --- /dev/null +++ b/database/migrations/2020_12_03_171929_create_timetables_table.php @@ -0,0 +1,48 @@ +id(); + $table->unsignedInteger('class_id'); + $table->unsignedInteger('teacher_id'); + $table->unsignedInteger('subject_id'); + $table->date('date'); + $table->time('time_start'); + $table->time('time_end'); + $table->string('classroom'); + $table->timestamps(); + + $table->foreign('class_id') + ->references('id')->on('school_classes') + ->onDelete('cascade'); + $table->foreign('teacher_id') + ->references('id')->on('teachers') + ->onDelete('set null'); + $table->foreign('subject_id') + ->references('id')->on('subjects') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('timetables'); + } +} diff --git a/routes/api.php b/routes/api.php index 55e6193..0acefde 100644 --- a/routes/api.php +++ b/routes/api.php @@ -24,6 +24,8 @@ Route::post('classes/{class}/teacher', 'SchoolClassController@addClassroomTeache Route::apiResource('themes', 'ThemeController'); +Route::apiResource('timetables', 'TimetableController'); + Route::get('banktasks', 'BankTaskController@index'); //получение списка всех заданий Route::group(['prefix' => 'banktask'], function () { Route::post('', 'BankTaskController@store'); //создание задания