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'); //создание задания