Passed
Push — master ( b8999c...a2f941 )
by Curtis
09:12 queued 03:15
created

DataImportTable::query()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 11
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 16
rs 9.9
1
<?php
2
3
namespace App\Tables\Builders\enso\DataImport;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Illuminate\Support\Facades\DB;
7
use LaravelEnso\Tables\Contracts\Table;
8
use App\Models\enso\dataimport\DataImport;
9
use App\Models\enso\dataimport\RejectedImport;
10
class DataImportTable implements Table
11
{
12
    protected const TemplatePath = __DIR__.'/../../../Templates/enso/dataimport/dataImports.json';
13
14
    public function query(): Builder
15
    {
16
        return DataImport::selectRaw("
0 ignored issues
show
Bug Best Practice introduced by
The expression return App\Models\enso\d...ion(...) { /* ... */ }) could return the type Illuminate\Database\Query\Builder which is incompatible with the type-hinted return Illuminate\Database\Eloquent\Builder. Consider adding an additional type-check to rule them out.
Loading history...
17
            data_imports.id, data_imports.type, data_imports.status, files.original_name as name,
18
            data_imports.successful, data_imports.failed, data_imports.created_at,
19
            TIME(data_imports.created_at) as time, people.name as createdBy,
20
            rejected_imports.id as rejectedId, {$this->rawDuration()} as duration
21
        ")->join('files', fn ($join) => $join
22
            ->on('files.attachable_id', 'data_imports.id')
23
            ->where('files.attachable_type', DataImport::morphMapKey()))
24
            ->join('users', 'files.created_by', '=', 'users.id')
25
            ->join('people', 'users.person_id', '=', 'people.id')
26
            ->leftJoin('rejected_imports', 'data_imports.id', '=', 'rejected_imports.data_import_id')
27
            ->leftJoin('files as rejected_files', fn ($join) => $join
28
                ->on('rejected_files.attachable_id', 'rejected_imports.id')
29
                ->where('rejected_files.attachable_type', RejectedImport::morphMapKey()));
30
    }
31
32
    public function templatePath(): string
33
    {
34
        return static::TemplatePath;
35
    }
36
37
    private function rawDuration(): string
38
    {
39
        switch (DB::getDriverName()) {
40
            case 'sqlite':
41
                return $this->sqliteDuration();
42
            case 'mysql':
43
                return $this->mysqlDuration();
44
            default:
45
                return 'N/A';
46
        }
47
    }
48
49
    private function sqliteDuration()
50
    {
51
        $days = 'julianday(data_imports.updated_at) - julianday(data_imports.created_at)';
52
        $seconds = "({$days}) * 86400.0";
53
54
        return "time({$seconds}, 'unixepoch')";
55
    }
56
57
    private function mysqlDuration()
58
    {
59
        $seconds = 'timestampdiff(second, data_imports.created_at, data_imports.updated_at)';
60
61
        return "sec_to_time({$seconds})";
62
    }
63
}
64