Test Failed
Push — develop ( 444e5e...4db3e8 )
by Paul
07:08
created

ImportManager::records()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 7
c 0
b 0
f 0
dl 0
loc 9
rs 10
cc 1
nc 1
nop 2
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Database;
4
5
use GeminiLabs\League\Csv\Reader;
6
use GeminiLabs\League\Csv\Statement;
7
use GeminiLabs\League\Csv\TabularDataReader;
8
use GeminiLabs\SiteReviews\Commands\CreateReview;
9
use GeminiLabs\SiteReviews\Database;
10
use GeminiLabs\SiteReviews\Database\Tables\TableTmp;
11
use GeminiLabs\SiteReviews\Defaults\ImportResultDefaults;
12
use GeminiLabs\SiteReviews\Helpers\Cast;
13
use GeminiLabs\SiteReviews\Request;
14
use GeminiLabs\SiteReviews\Review;
15
16
class ImportManager
17
{
18
    public function flush(): void
19
    {
20
        glsr(TableTmp::class)->drop();
21
    }
22
23
    public function import(int $limit = 1, int $offset = 0): array
24
    {
25
        if (!defined('WP_IMPORTING')) {
26
            define('WP_IMPORTING', true);
27
        }
28
        set_time_limit(0);
29
        wp_raise_memory_limit('admin');
30
        wp_defer_term_counting(true);
31
        wp_suspend_cache_invalidation(true);
32
        $records = $this->records($limit, $offset);
33
        $result = glsr(ImportResultDefaults::class)->defaults();
34
        foreach ($records as $values) {
35
            $request = new Request($values);
36
            $command = new CreateReview($request);
37
            if ($review = $this->importedReview($command->request)) {
38
                $result['attachments'] += glsr()->filterInt('import/review/attachments', 0, $request, $review, false);
39
                $result['skipped']++;
40
                continue;
41
            }
42
            if ($review = glsr(ReviewManager::class)->create($command)) {
43
                $result['attachments'] += glsr()->filterInt('import/review/attachments', 0, $request, $review, true);
44
                $result['imported']++;
45
                continue;
46
            }
47
            $result['skipped']++;
48
        }
49
        wp_defer_term_counting(false);
50
        wp_suspend_cache_invalidation(false);
51
        unset($reader, $records);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $reader seems to be never defined.
Loading history...
52
        return glsr(ImportResultDefaults::class)->restrict($result);
53
    }
54
55
    public function importAttachments(int $limit = 1, int $offset = 0): array
56
    {
57
        if (!defined('WP_IMPORTING')) {
58
            define('WP_IMPORTING', true);
59
        }
60
        set_time_limit(0);
61
        wp_raise_memory_limit('image');
62
        wp_suspend_cache_invalidation(true);
63
        $limit = max(1, $limit);
64
        $offset = max(0, $offset);
65
        $result = glsr()->filterArray('import/reviews/attachments', [], $limit, $offset);
66
        wp_suspend_cache_invalidation(false);
67
        return glsr(ImportResultDefaults::class)->restrict($result);
68
    }
69
70
    public function importedReview(Request $request): ?Review
71
    {
72
        $submittedHash = md5(maybe_serialize($request->toArray()));
73
        $sql = "
74
            SELECT p.ID
75
            FROM table|posts AS p
76
            INNER JOIN table|postmeta AS pm ON (pm.post_id = p.ID)
77
            WHERE 1=1
78
            AND p.post_type = %s
79
            AND pm.meta_key = '_submitted_hash'
80
            AND pm.meta_value = %s
81
        ";
82
        $sql = glsr(Query::class)->sql($sql, glsr()->post_type, $submittedHash);
83
        $reviewId = glsr(Database::class)->dbGetVar($sql);
84
        $reviewId = Cast::toInt($reviewId);
85
        $review = glsr_get_review($reviewId);
86
        if (!$review->isValid()) {
87
            return null;
88
        }
89
        return $review;
90
    }
91
92
    public function prepare(): void
93
    {
94
        glsr(TableTmp::class)->create(); // create a temporary table for importing
95
    }
96
97
    public function records(int $limit = 1, int $offset = 0): TabularDataReader
98
    {
99
        $this->prepare();
100
        $reader = Reader::createFromPath($this->tempFilePath());
101
        $reader->setHeaderOffset(0);
102
        return Statement::create()
103
            ->offset(max(0, $offset))
104
            ->limit(max(1, $limit))
105
            ->process($reader);
106
    }
107
108
    public function tempFilePath(): string
109
    {
110
        $uploads = wp_upload_dir();
111
        if (!file_exists($uploads['basedir'])) {
112
            $uploads = wp_upload_dir(null, true, true); // maybe the site has been moved, so refresh the cached uploads path
113
        }
114
        $path = trailingslashit($uploads['basedir']);
115
        $path = trailingslashit($path.glsr()->id);
116
        $path = trailingslashit($path.'temp');
117
        wp_mkdir_p($path);
118
        return $path.'import.csv';
119
    }
120
121
    public function unlinkTempFile(): bool
122
    {
123
        $path = $this->tempFilePath();
124
        if (!is_file($path)) {
125
            return false;
126
        }
127
        unlink($path); // delete the temporary import file
128
        return true;
129
    }
130
}
131