Passed
Push — dev5 ( 1140b1...da16e0 )
by Ron
09:38
created

TechTipsController::createTip()   B

Complexity

Conditions 5
Paths 8

Size

Total Lines 58

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 30
CRAP Score 5

Importance

Changes 0
Metric Value
dl 0
loc 58
ccs 30
cts 30
cp 1
rs 8.6052
c 0
b 0
f 0
cc 5
nc 8
nop 1
crap 5

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace App\Http\Controllers\TechTips;
4
5
use App\User;
6
use App\Files;
7
use App\TechTips;
8
use App\TechTipFavs;
9
use App\TechTipFiles;
10
use App\TechTipTypes;
11
use App\TechTipSystems;
12
use Illuminate\Http\File;
13
use App\SystemCategories;
14
use Illuminate\Http\Request;
15
use App\Notifications\NewTechTip;
16
use Illuminate\Http\UploadedFile;
17
use Illuminate\Support\Facades\Log;
18
use App\Http\Controllers\Controller;
19
use Illuminate\Support\Facades\Auth;
20
use Illuminate\Support\Facades\Route;
21
use Illuminate\Support\Facades\Storage;
22
use App\Http\Resources\TechTipsCollection;
23
use Illuminate\Support\Facades\Notification;
24
use App\Http\Resources\TechTipTypesCollection;
25
use App\Http\Resources\SystemCategoriesCollection;
26
use Pion\Laravel\ChunkUpload\Receiver\FileReceiver;
27
use Pion\Laravel\ChunkUpload\Handler\HandlerFactory;
28
use App\Http\Resources\SystemCategoriesCollection as CategoriesCollection;
29
30
class TechTipsController extends Controller
31
{
32 80
    public function __construct()
33
    {
34 80
        $this->middleware('auth');
35 80
    }
36
37
    //  Tech Tips landing page
38 2 View Code Duplication
    public function index()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
39
    {
40 2
        Log::debug('Route '.Route::currentRouteName().' visited by '.Auth::user()->full_name);
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
41
42 2
        $tipTypes = new TechTipTypesCollection(TechTipTypes::all());
43 2
        $sysList  = new CategoriesCollection(SystemCategories::with('SystemTypes')->with('SystemTypes.SystemDataFields.SystemDataFieldTypes')->get());
44 2
        return view('tips.index', [
45 2
            'tipTypes' => $tipTypes,
46 2
            'sysTypes' => $sysList,
47
        ]);
48
    }
49
50
    //  Search for an existing tip - If no paramaters, return all tips
51 8
    public function search(Request $request)
52
    {
53 8
        Log::debug('Route '.Route::currentRouteName().' visited by '.Auth::user()->full_name.'. Submitted Data - ', $request->toArray());
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
54
55
        //  See if there are any search paramaters entered
56 8
        if(!$request->search['searchText'] && !isset($request->search['articleType']) && !isset($request->search['systemType'])) {
57
            //  No search paramaters, send all tech tips
58 2
            $tips = new TechTipsCollection(
59 2
                TechTips::orderBy('created_at', 'DESC')
60 2
                    ->with('SystemTypes')
61 2
                    ->paginate($request->pagination['perPage'])
62
            );
63
        } else {
64 6
            $article = isset($request->search['articleType']) ? true : false;
65 6
            $system  = isset($request->search['systemType']) ? true : false;
66
            //  Search paramaters, filter results
67 6
            $tips = new TechTipsCollection(
68 6
                TechTips::orderBy('created_at', 'DESC')
69
                    //  Search by id or a phrase in the title or description
70
                    ->where(function($query) use ($request) {
71 6
                        $query->where('subject', 'like', '%'.$request->search['searchText'].'%')
72 6
                            ->orWhere('tip_id', 'like', '%'.$request->search['searchText'].'%')
73 6
                            ->orWhere('description', 'like', '%'.$request->search['searchText'].'%');
74 6
                    })
75
                    ->when($article, function($query) use ($request) {
76 2
                        $query->whereIn('tip_type_id', $request->search['articleType']);
77 6
                    })
78
                    ->when($system, function($query) use ($request) {
79
                        $query->whereHas('SystemTypes', function($query) use ($request) {
80 2
                            $query->whereIn('system_types.sys_id', $request->search['systemType']);
81 2
                        });
82 6
                    })
83 6
                    ->with('SystemTypes')
84 6
                    ->paginate($request->pagination['perPage'])
85
            );
86
        }
87
88 8
        return $tips;
89
    }
90
91
    //  Process an image that is attached to a tech tip
92 6
    public function processImage(Request $request)
93
    {
94 6
        Log::debug('Route '.Route::currentRouteName().' visited by '.Auth::user()->full_name.'. Submitted Data - ', $request->toArray());
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
95
96 6
        $this->authorize('hasAccess', 'Create Tech Tip');
97
98 4
        $request->validate([
0 ignored issues
show
Bug introduced by
The call to validate() misses a required argument $...$params.

This check looks for function calls that miss required arguments.

Loading history...
99 4
            'file' => 'mimes:jpeg,bmp,png,jpg,gif'
100
        ]);
101
102
        //  Generate a unique hash as the file name and store it in a publicly accessable folder
103 2
        $path = 'img/tip_img';
104 2
        $location = Storage::disk('public')->putFile($path, new File($request->file));
105
106
        //  Return the full url path to the image
107 2
        return response()->json(['location' => Storage::url($location)]);
0 ignored issues
show
Bug introduced by
The method json does only exist in Illuminate\Contracts\Routing\ResponseFactory, but not in Illuminate\Http\Response.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
108
    }
109
110
    //  Create a new Tech Tip form
111 4
    public function create()
112
    {
113 4
        Log::debug('Route '.Route::currentRouteName().' visited by '.Auth::user()->full_name);
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
114 4
        $this->authorize('hasAccess', 'Create Tech Tip');
115
116 2
        $typesArr   = new TechTipTypesCollection(TechTipTypes::all());
117 2
        $systemsArr = new SystemCategoriesCollection(SystemCategories::with('SystemTypes')->get());
118
119 2
        Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
0 ignored issues
show
Bug introduced by
Accessing user_id on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
120 2
        return view('tips.create', [
121 2
            'tipTypes' => $typesArr,
122 2
            'sysTypes' => $systemsArr,
123
        ]);
124
    }
125
126
    //  Submit the form to create a new tech tip
127 14
    public function store(Request $request)
128
    {
129 14
        Log::debug('Route '.Route::currentRouteName().' visited by '.Auth::user()->full_name.'. Submitted Data - ', $request->toArray());
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
130
131 14
        $this->authorize('hasAccess', 'Create Tech Tip');
132
133 12
        $request->validate([
0 ignored issues
show
Bug introduced by
The call to validate() misses a required argument $...$params.

This check looks for function calls that miss required arguments.

Loading history...
134 12
            'subject'   => 'required',
135
            'equipment' => 'required',
136
            'tipType'   => 'required',
137
            'tip'       => 'required',
138
        ]);
139
140 4
        $receiver = new FileReceiver('file', $request, HandlerFactory::classFromRequest($request));
141
142
        //  Verify if there is a file to be processed or not
143 4
        if($receiver->isUploaded() === false || $request->_completed)
144
        {
145 4
            Log::debug('about to create a tip');
146 4
            $tipID = $this->createTip($request);
147 4
            return response()->json(['tip_id' => $tipID]);
0 ignored issues
show
Bug introduced by
The method json does only exist in Illuminate\Contracts\Routing\ResponseFactory, but not in Illuminate\Http\Response.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
148
        }
149
150
        //  Recieve and process the file
151 2
        $save = $receiver->receive();
152
153
        //  See if the uploade has finished
154 2
        if($save->isFinished()) {
155 2
            $this->saveFile($save->getFile());
156
157 2
            return 'uploaded successfully';
158
        }
159
160
        //  Get the current progress
161
        $handler = $save->handler();
162
163
        Log::debug('File being uploaded.  Percentage done - '.$handler->getPercentageDone());
164
        return response()->json([
165
            'done'   => $handler->getPercentageDone(),
166
            'status' => true
167
        ]);
168
    }
169
170
    //  Save a file attached to the link
171 4
    private function saveFile(UploadedFile $file, $id = '_tmp')
172
    {
173 4
        $filePath = config('filesystems.paths.tips').DIRECTORY_SEPARATOR.$id;
174
175
        //  Clean the file and store it
176 4
        $fileName = Files::cleanFilename($filePath, $file->getClientOriginalName());
177 4
        $file->storeAs($filePath, $fileName);
178
179
        //  Place file in Files table of DB
180 4
        $newFile = Files::create([
0 ignored issues
show
Bug introduced by
The method create() does not exist on App\Files. Did you maybe mean created()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
181 4
            'file_name' => $fileName,
182 4
            'file_link' => $filePath.DIRECTORY_SEPARATOR
183
        ]);
184 4
        $fileID = $newFile->file_id;
185
186
        //  Save the file ID in the session array
187 4
        if($id === '_tmp')
188
        {
189 2
            $fileArr = session('newTipFile') != null ? session('newTipFile') : [];
190 2
            $fileArr[] = $fileID;
191 2
            session(['newTipFile' => $fileArr]);
192
        }
193
        else
194
        {
195 2
            TechTipFiles::create([
0 ignored issues
show
Bug introduced by
The method create() does not exist on App\TechTipFiles. Did you maybe mean created()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
196 2
                'tip_id' => $id,
197 2
                'file_id' => $fileID,
198
            ]);
199
        }
200
201
        //  Log stored file
202 4
        Log::info('File Stored', ['file_id' => $fileID, 'file_path' => $filePath.DIRECTORY_SEPARATOR.$fileName]);
203 4
        return $fileID;
204
    }
205
206
    //  Create the tech tip
207 4
    private function createTip($tipData)
208
    {
209
        //  Remove any forward slash (/) from the Subject Field
210 4
        $tipData->merge(['subject' => str_replace('/', '-', $tipData->subject)]);
211
212
        //  Enter the tip details and return the tip ID
213 4
        $tip = TechTips::create([
0 ignored issues
show
Bug introduced by
The method create() does not exist on App\TechTips. Did you maybe mean created()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
214 4
            'tip_type_id' => $tipData->tipType,
215 4
            'subject'     => $tipData->subject,
216 4
            'description' => $tipData->tip,
217 4
            'user_id'     => Auth::user()->user_id
0 ignored issues
show
Bug introduced by
Accessing user_id on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
218
        ]);
219 4
        $tipID = $tip->tip_id;
220
221 4
        foreach($tipData->equipment as $sys)
222
        {
223 4
            TechTipSystems::create([
0 ignored issues
show
Bug introduced by
The method create() does not exist on App\TechTipSystems. Did you maybe mean created()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
224 4
                'tip_id' => $tipID,
225 4
                'sys_id' => $sys['sys_id']
226
            ]);
227
        }
228
229
        //  If there were any files uploaded, move them to the proper folder
230 4
        if(session('newTipFile') != null)
231
        {
232 2
            $files = session('newTipFile');
233 2
            $path = config('filesystems.paths.tips').DIRECTORY_SEPARATOR.$tipID;
234 2
            foreach($files as $file)
235
            {
236 2
                $data = Files::find($file);
237
                //  Move the file to the proper folder
238 2
                Storage::move($data->file_link.$data->file_name, $path.DIRECTORY_SEPARATOR.$data->file_name);
239
                // Update the database
240 2
                $data->update([
241 2
                    'file_link' => $path.DIRECTORY_SEPARATOR
242
                ]);
243
244 2
                TechTipFiles::create([
0 ignored issues
show
Bug introduced by
The method create() does not exist on App\TechTipFiles. Did you maybe mean created()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
245 2
                    'tip_id' => $tipID,
246 2
                    'file_id' => $data->file_id
247
                ]);
248
            }
249
        }
250
251
        //  Send out the notifications
252 4
        if(!$tipData->supressEmail)
253
        {
254 4
            $details = TechTips::find($tipID);
255
            $users = User::whereHas('UserSettings', function($query) {
256 4
                $query->where('em_tech_tip', 1);
257 4
            })->get();
258
259 4
            Notification::send($users, new NewTechTip($details));
260
        }
261
262 4
        Log::info('New Tech Tip created by '.Auth::user()->full_name.'.  Tip Data - ', $tip->toArray());
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
263 4
        return $tipID;
264
    }
265
266
    //  Details controller - will move to the show controller with just the tech tip id
267 2
    public function details($id, $subject)
0 ignored issues
show
Unused Code introduced by
The parameter $subject is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
268
    {
269 2
        if(session()->has('newTipFile')) {
270
            session()->forget('newTipFile');
271
        }
272
273 2
        return $this->show($id);
274
    }
275
276
    //  Show the details about the tech tip
277 2
    public function show($id)
278
    {
279 2
        Log::debug('Route '.Route::currentRouteName().' visited by '.Auth::user()->full_name);
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
280
281 2
        $tipData = TechTips::where('tip_id', $id)->with('User')->with('SystemTypes')->first();
282
283 2
        if(!$tipData)
284
        {
285
            return view('tips.tipNotFound');
286
        }
287
288 2
        $isFav = TechTipFavs::where('user_id', Auth::user()->user_id)->where('tip_id', $id)->first();
0 ignored issues
show
Bug introduced by
Accessing user_id on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
289 2
        $files = TechTipFiles::where('tip_id', $id)->with('Files')->get();
290
291 2
        return view('tips.details', [
292 2
            'details' => $tipData,
293 2
            'isFav'   => empty($isFav) ? 'false' : 'true',
294 2
            'files'   => $files,
295
        ]);
296
    }
297
298
    //  Add or remove this tip as a favorite of the user
299 View Code Duplication
    public function toggleFav($action, $id)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
300
    {
301
        Log::debug('Route '.Route::currentRouteName().' visited by '.Auth::user()->full_name);
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
302
303
        switch($action) {
304
            case 'add':
305
                TechTipFavs::create([
0 ignored issues
show
Bug introduced by
The method create() does not exist on App\TechTipFavs. Did you maybe mean created()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
306
                    'user_id' => Auth::user()->user_id,
0 ignored issues
show
Bug introduced by
Accessing user_id on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
307
                    'tip_id' => $id
308
                ]);
309
                break;
310
            case 'remove':
311
                $tipFav = TechTipFavs::where('user_id', Auth::user()->user_id)->where('tip_id', $id)->first();
0 ignored issues
show
Bug introduced by
Accessing user_id on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
312
                $tipFav->delete();
313
                break;
314
        }
315
316
        Log::debug('Tech Tip Bookmark Updated.', [
317
            'user_id' => Auth::user()->user_id,
0 ignored issues
show
Bug introduced by
Accessing user_id on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
318
            'tip_id' => $id,
319
            'action'  => $action
320
        ]);
321
        return response()->json(['success' => true]);
0 ignored issues
show
Bug introduced by
The method json does only exist in Illuminate\Contracts\Routing\ResponseFactory, but not in Illuminate\Http\Response.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
322
    }
323
324
    //  Edit an existing tech tip
325 6
    public function edit($id)
326
    {
327 6
        Log::debug('Route '.Route::currentRouteName().' visited by '.Auth::user()->full_name);
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
328
329 6
        $this->authorize('hasAccess', 'Edit Tech Tip');
330 4
        $tipData = TechTips::where('tip_id', $id)->with('User')->with('SystemTypes')->with('TechTipTypes')->first();
331
332 4
        if(!$tipData) {
333 2
            return view('tips.tipNotFound');
334
        }
335
336 2
        $typesArr   = new TechTipTypesCollection(TechTipTypes::all());
337 2
        $systemsArr = new SystemCategoriesCollection(SystemCategories::with('SystemTypes')->get());
338 2
        $files = TechTipFiles::where('tip_id', $id)->with('Files')->get();
339
340 2
        return view('tips.editTip', [
341 2
            'tipTypes' => $typesArr,
342 2
            'sysTypes' => $systemsArr,
343 2
            'details' => $tipData,
344 2
            'files'   => $files,
345
        ]);
346
    }
347
348
    //  Store the edited Tech Tip
349 16
    public function update(Request $request, $id)
350
    {
351 16
        Log::debug('Route '.Route::currentRouteName().' visited by '.Auth::user()->full_name.'. Submitted Data - ', $request->toArray());
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
352
353 16
        $this->authorize('hasAccess', 'Edit Tech Tip');
354
355 14
        $request->validate([
0 ignored issues
show
Bug introduced by
The call to validate() misses a required argument $...$params.

This check looks for function calls that miss required arguments.

Loading history...
356 14
            'subject'   => 'required',
357
            'equipment' => 'required',
358
            'tipType'   => 'required',
359
            'tip'       => 'required',
360
        ]);
361
362 6
        $receiver = new FileReceiver('file', $request, HandlerFactory::classFromRequest($request));
363
364
        //  Verify if there is a file to be processed or not
365 6
        if($receiver->isUploaded() === false || $request->_completed) {
366 6
            $this->storeUpdatedTip($request, $id);
367 6
            Log::debug('Route '.Route::currentRouteName().' visited by User ID-'.Auth::user()->user_id);
0 ignored issues
show
Bug introduced by
Accessing user_id on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
368 6
            return response()->json(['tip_id' => $id]);
0 ignored issues
show
Bug introduced by
The method json does only exist in Illuminate\Contracts\Routing\ResponseFactory, but not in Illuminate\Http\Response.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
369
        }
370
371
        //  Recieve and process the file
372 2
        $save = $receiver->receive();
373
374
        //  See if the uploade has finished
375 2
        if($save->isFinished()) {
376 2
            $this->saveFile($save->getFile(), $id);
377
378 2
            return 'uploaded successfully';
379
        }
380
381
        //  Get the current progress
382
        $handler = $save->handler();
383
384
        Log::debug('File being uploaded.  Percentage done - '.$handler->getPercentageDone());
385
        return response()->json([
386
            'done'   => $handler->getPercentageDone(),
387
            'status' => true
388
        ]);
389
    }
390
391
    //  Store the updated tip
392 6
    public function storeUpdatedTip($tipData, $id)
393
    {
394 6
        $this->authorize('hasAccess', 'Edit Tech Tip');
395
396
        //  Remove any forward slash (/) from the Subject Field
397 6
        $tipData->merge(['subject' => str_replace('/', '-', $tipData->subject)]);
398
399
        //  Enter the tip details and return the tip ID
400 6
        TechTips::find($id)->update([
401 6
            'tip_type_id' => $tipData->tipType,
402 6
            'subject'     => $tipData->subject,
403 6
            'description' => $tipData->tip,
404
            // 'user_id'     => Auth::user()->user_id TODO - updated user who modified tip
405
        ]);
406
407
        //  Add any additional equipment types to the tip
408 6
        $tipEquip = TechTipSystems::where('tip_id', $id)->get();
409 6
        foreach($tipData->equipment as $equip)
410
        {
411 6
            $found = false;
412 6
            foreach($tipEquip as $key => $value)
413
            {
414 6
                if($equip['sys_id'] == $value->sys_id)
415
                {
416
                    $tipEquip->forget($key);
417
                    $found = true;
418
                    break;
419
                }
420
            }
421 6
            if(!$found)
422
            {
423 6
                TechTipSystems::create([
0 ignored issues
show
Bug introduced by
The method create() does not exist on App\TechTipSystems. Did you maybe mean created()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
424 6
                    'tip_id' => $id,
425 6
                    'sys_id' => $equip['sys_id'],
426
                ]);
427
            }
428
        }
429
430
        //  Remove the remainaing equipment types that have been removed
431 6
        foreach($tipEquip as $remaining)
432
        {
433 6
            TechTipSystems::find($remaining->tip_tag_id)->delete();
434
        }
435
436
        //  Remove any files that no longer apply
437 6
        foreach($tipData->deletedFileList as $file)
438
        {
439 2
            $file = TechTipFiles::find($file);
440 2
            $fileID = $file->file_id;
441 2
            $file->delete();
442
            //  Try to delete the file itself
443 2
            Files::deleteFile($fileID);
444
        }
445
446 6
        return true;
447
    }
448
449
    //  Soft delet the Tech Tip
450 4
    public function destroy($id)
451
    {
452 4
        Log::debug('Route '.Route::currentRouteName().' visited by '.Auth::user()->full_name);
0 ignored issues
show
Bug introduced by
Accessing full_name on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
453
454 4
        $this->authorize('hasAccess', 'Delete Tech Tip');
455
456
        //  Remove the Tip from any users favorites
457 2
        TechTipFavs::where('tip_id', $id)->delete();
458
459
        //  Disable the tip
460 2
        TechTips::find($id)->delete();
461 2
        Log::warning('User - '.Auth::user()->user_id.' deleted Tech Tip ID - '.$id);
0 ignored issues
show
Bug introduced by
Accessing user_id on the interface Illuminate\Contracts\Auth\Authenticatable suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
462 2
        return response()->json(['success' => true]);
0 ignored issues
show
Bug introduced by
The method json does only exist in Illuminate\Contracts\Routing\ResponseFactory, but not in Illuminate\Http\Response.

It seems like the method you are trying to call exists only in some of the possible types.

Let’s take a look at an example:

class A
{
    public function foo() { }
}

class B extends A
{
    public function bar() { }
}

/**
 * @param A|B $x
 */
function someFunction($x)
{
    $x->foo(); // This call is fine as the method exists in A and B.
    $x->bar(); // This method only exists in B and might cause an error.
}

Available Fixes

  1. Add an additional type-check:

    /**
     * @param A|B $x
     */
    function someFunction($x)
    {
        $x->foo();
    
        if ($x instanceof B) {
            $x->bar();
        }
    }
    
  2. Only allow a single type to be passed if the variable comes from a parameter:

    function someFunction(B $x) { /** ... */ }
    
Loading history...
463
    }
464
}
465