Passed
Push — master ( 8c9d15...53e72a )
by Thomas
07:13
created

GradeController::checkAccessForCourse()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 2
nc 2
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace App\Http\Controllers;
4
5
use App\Models\Course;
6
use App\Models\Enrollment;
7
use App\Models\Grade;
8
use App\Models\GradeType;
9
use Illuminate\Http\Request;
10
use Illuminate\Support\Facades\Gate;
11
12
class GradeController extends Controller
13
{
14
    /**
15
     * Show the form to edit grades for a course.
16
     *
17
     * Todo refactor to prevent the number of queries to depend upon the number of records
18
     */
19
    public function edit(Course $course)
20
    {
21
        $this->checkAccessForCourse($course);
22
23
        return view('grades.edit', [
24
            'enrollments' => $course->enrollments,
25
            'course_grade_types' => $course->grade_types,
26
            'grades' => $course->grades,
27
            'course' => $course,
28
            'all_grade_types' => GradeType::all()->except($course->grade_types->pluck('id')->toArray()),
29
        ]);
30
    }
31
32
    /**
33
     * Update the specified resource in storage.
34
     */
35
    public function store(Request $request)
36
    {
37
        $enrollment = Enrollment::findOrFail($request->input('enrollment_id'));
38
        $this->checkAccessForCourse($enrollment->course);
39
        $grade = Grade::firstOrNew([
40
            'grade_type_id' => $request->input('grade_type_id'),
41
            'enrollment_id' => $request->input('enrollment_id'),
42
        ]);
43
        $grade->grade = $request->input('value');
44
        $grade->save();
45
    }
46
47
    public function add_grade_type_to_course(Request $request)
48
    {
49
        $course = Course::findOrFail($request->input('course_id'));
50
51
        $this->checkAccessForCourse($course);
52
53
        $grade_type = GradeType::findOrFail($request->input('grade_type_id'));
54
55
        if (! $course->grade_types->contains($grade_type->id)) {
56
            $course->grade_types()->attach($grade_type->id);
57
        }
58
59
        return redirect()->back();
60
    }
61
62
    public function remove_grade_type_from_course(Course $course, GradeType $gradetype)
63
    {
64
        $this->checkAccessForCourse($course);
65
66
        $course->grade_types()->detach($gradetype->id);
67
        $course->grades()->where('grade_type_id', $gradetype->id)->delete();
68
    }
69
70
    public function getEnrollmentTotal(Request $request)
71
    {
72
        $enrollment = Enrollment::findOrFail($request->input('enrollment_id'));
73
        $this->checkAccessForCourse($enrollment->course);
74
        return $enrollment->grades->sum('grade');
75
    }
76
77
    /**
78
     * @param \App\Models\Course $course
79
     */
80
    protected function checkAccessForCourse(Course $course): void
81
    {
82
        if (Gate::forUser(backpack_user())->denies('edit-course-grades', $course)) {
83
            abort(403);
84
        }
85
    }
86
}
87