Passed
Pull Request — master (#70)
by Daniel
02:11
created

StaticCacheFullBuildTask   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 81
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 81
rs 10
c 0
b 0
f 0
wmc 11

2 Methods

Rating   Name   Duplication   Size   Complexity  
A log() 0 4 2
C run() 0 65 9
1
<?php
2
3
namespace SilverStripe\StaticPublishQueue\Task;
4
5
use SilverStripe\Control\Director;
6
use SilverStripe\Control\HTTPRequest;
7
use SilverStripe\Dev\BuildTask;
8
use SilverStripe\ORM\DataList;
9
use SilverStripe\ORM\FieldType\DBDatetime;
10
use SilverStripe\StaticPublishQueue\Job\StaticCacheFullBuildJob;
11
use Symbiote\QueuedJobs\DataObjects\QueuedJobDescriptor;
12
use Symbiote\QueuedJobs\Services\QueuedJob;
13
use Symbiote\QueuedJobs\Services\QueuedJobService;
14
15
class StaticCacheFullBuildTask extends BuildTask
16
{
17
18
    /**
19
     * Queue up a StaticCacheFullBuildJob
20
     * Check for startAfter param and do some sanity checking
21
     *
22
     * @param HTTPRequest $request
23
     * @return
24
     */
25
    public function run($request)
26
    {
27
        $job = new StaticCacheFullBuildJob();
28
        $signature = $job->getSignature();
29
30
        // see if we already have this job in a queue
31
        $filter = [
32
            'Signature' => $signature,
33
            'JobStatus' => [
34
                QueuedJob::STATUS_NEW,
35
                QueuedJob::STATUS_INIT,
36
            ]
37
        ];
38
39
        $existing = DataList::create(QueuedJobDescriptor::class)->filter($filter)->first();
0 ignored issues
show
Bug introduced by
Symbiote\QueuedJobs\Data...uedJobDescriptor::class of type string is incompatible with the type array expected by parameter $args of SilverStripe\View\ViewableData::create(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

39
        $existing = DataList::create(/** @scrutinizer ignore-type */ QueuedJobDescriptor::class)->filter($filter)->first();
Loading history...
40
41
        if ($existing && $existing->ID) {
42
            $this->log(sprintf(
43
                'There is already a %s in the queue, added %s %s',
44
                StaticCacheFullBuildJob::class,
45
                $existing->Created,
46
                $existing->StartAfter ? 'and set to start after ' . $existing->StartAfter : ''
47
            ));
48
            return false;
49
        }
50
51
        if ($request->getVar('startAfter')) {
52
            $now = DBDatetime::now();
53
            $today = $now->Date();
54
            $startTime = $request->getVar('startAfter');
55
56
            // move to tomorrow if the starttime has passed today
57
            if ($now->Time24() > $startTime) {
58
                $timestamp = strtotime($today . ' ' . $startTime . ' +1 day');
59
                $dayWord = 'tomorrow';
60
            } else {
61
                $timestamp = strtotime($today . ' ' . $startTime);
62
                $dayWord = 'today';
63
            }
64
            $startAfter = (new \DateTime())->setTimestamp($timestamp);
65
            $thisTimeTomorrow = (new \DateTime())->setTimestamp(strtotime($now . ' +1 day'))->getTimestamp();
66
67
            // sanity check that we are in the next 24 hours - prevents some weird stuff sneaking through
68
            if ($startAfter->getTimestamp() > $thisTimeTomorrow || $startAfter->getTimestamp() < $now->getTimestamp()) {
69
                $this->log('Invalid startAfter parameter passed. Please ensure the time format is HHmm e.g. 1300');
70
                return false;
71
            }
72
73
            $this->log(sprintf(
74
                '%s queued for %s %s.',
75
                StaticCacheFullBuildJob::class,
76
                $startAfter->format('H:m'),
77
                $dayWord
78
            ));
79
        } else {
80
            $startAfter = null;
81
            $this->log(StaticCacheFullBuildJob::class . ' added to the queue for immediate processing');
82
        }
83
84
        $job->setJobData(0, 0, false, new \stdClass(), [
85
            'Building static cache for full site'
86
        ]);
87
        QueuedJobService::singleton()->queueJob($job, $startAfter ? $startAfter->format('Y-m-d H:i:s') : null);
88
89
        return true;
90
    }
91
92
    protected function log($message)
93
    {
94
        $newLine = Director::is_cli() ? PHP_EOL : '<br>';
95
        echo $message . $newLine;
96
    }
97
}
98