Passed
Push — master ( 658575...3c4def )
by Jonathan
14:06
created

DeleteController::deleteRelation()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 10
c 0
b 0
f 0
nc 3
nop 1
dl 0
loc 18
rs 9.9332
1
<?php
2
3
namespace Uccello\Core\Http\Controllers\Core;
4
5
use Illuminate\Http\Request;
6
use Uccello\Core\Models\Domain;
7
use Uccello\Core\Models\Module;
8
use Uccello\Core\Models\Relatedlist;
9
use Uccello\Core\Events\BeforeDeleteEvent;
10
use Uccello\Core\Events\AfterDeleteEvent;
11
12
class DeleteController extends Controller
13
{
14
    protected $viewName = null;
15
16
    /**
17
     * Check user permissions
18
     */
19
    protected function checkPermissions()
20
    {
21
        $this->middleware('uccello.permissions:delete');
22
    }
23
24
    /**
25
     * @inheritDoc
26
     */
27
    public function process(?Domain $domain, Module $module, Request $request)
28
    {
29
        // Pre-process
30
        $this->preProcess($domain, $module, $request);
31
32
        // Get related list if defined
33
        $relatedListId = $request->get('relatedlist');
34
        if ($relatedListId) {
35
            $relatedList = Relatedlist::find($relatedListId);
36
        } else {
37
            $relatedList = null;
38
        }
39
40
        // Delete relation if it is a N-N relation
41
        if ($relatedList && $relatedList->type === 'n-n') {
0 ignored issues
show
Bug introduced by
The property type does not seem to exist on Uccello\Core\Models\Relatedlist. Are you sure there is no database migration missing?

Checks if undeclared accessed properties appear in database migrations and if the creating migration is correct.

Loading history...
42
            $this->deleteRelation($request);
43
            $message = 'notification.relation.deleted';
44
        }
45
        // Else delete record
46
        else {
47
            $this->deleteRecord($module, $request);
48
            $message = 'notification.record.deleted';
49
        }
50
51
        // Notification
52
        if (!empty($message)) {
53
            ucnotify(uctrans($message, $module), 'success');
54
        }
55
56
        // Redirect to the previous page
57
        $route = $this->getRedirectionRoute();
58
59
        return redirect($route);
60
    }
61
62
    /**
63
     * Retrieve the redirection route from request parameters.
64
     *
65
     * @return string
66
     */
67
    protected function getRedirectionRoute() : string
68
    {
69
        $request = $this->request;
70
        $domain = $this->domain;
71
        $module = $this->module;
72
73
        // Retrieve a related list by its id if it is defined
74
        if ($request->input('relatedlist')) {
75
            $relatedlist = Relatedlist::find($request->input('relatedlist'));
76
        }
77
78
        // Redirect to source record if a relation was deleted
79
        if (isset($relatedlist) && $request->input('src_id')) {
80
            $params = [ 'id' => $request->input('src_id') ];
81
82
            // Add tab id if defined to select it automaticaly
83
            if ($request->input('tab')) {
84
                $params[ 'tab' ] = $request->input('tab');
85
            }
86
            // Add related list id to select the related tab automaticaly
87
            else {
88
                $params[ 'relatedlist' ] = $relatedlist->id;
89
            }
90
91
            $route = ucroute('uccello.detail', $domain, $relatedlist->module, $params);
92
        }
93
        // Else redirect to list
94
        else {
95
            $route = ucroute('uccello.list', $domain, $module);
96
        }
97
98
        return $route;
99
    }
100
101
    /**
102
     * Delete record after retrieving from the request
103
     *
104
     * @param Module $module
105
     * @param Request $request
106
     * @return void
107
     */
108
    protected function deleteRecord(Module $module, Request $request)
109
    {
110
        $record = $this->getRecordFromRequest();
111
112
        // Delete record if exists
113
        if ($record) {
114
            event(new BeforeDeleteEvent($this->domain, $module, $request, $record, 'delete'));
115
116
            $record->delete();
117
118
            event(new AfterDeleteEvent($this->domain, $module, $request, $record, 'delete'));
119
        }
120
    }
121
122
    /**
123
     * Delete a relation for a N-N related list
124
     *
125
     * @return void
126
     */
127
    protected function deleteRelation(Request $request)
128
    {
129
        $relatedListId = $request->get('relatedlist');
130
        $recordId = $request->get('src_id');
131
        $relatedRecordId = $request->get('id');
132
133
        // Get related list
134
        $relatedList = Relatedlist::find($relatedListId);
135
        $relationName = $relatedList->relationName;
136
137
        if ($relatedList) {
138
            // Get record
139
            $modelClass = $relatedList->module->model_class;
0 ignored issues
show
Bug introduced by
The property model_class does not seem to exist on Uccello\Core\Models\Module. Are you sure there is no database migration missing?

Checks if undeclared accessed properties appear in database migrations and if the creating migration is correct.

Loading history...
140
            $record = $modelClass::find($recordId);
141
142
            // Delete relation
143
            if ($record) {
144
                $record->$relationName()->detach($relatedRecordId);
145
            }
146
        }
147
148
149
    }
150
}
151