Test Failed
Push — main ( c67d83...e58605 )
by Paul
13:36 queued 06:19
created

ImportManager::prepare()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 1
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
nc 1
nop 0
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
        $this->prepare(); // create a temporary table for importing
33
        $reader = Reader::createFromPath($this->tempFilePath());
34
        $reader->setHeaderOffset(0);
35
        $records = Statement::create()
36
            ->offset(max(0, $offset))
37
            ->limit(max(1, $limit))
38
            ->process($reader);
39
        $result = glsr(ImportResultDefaults::class)->defaults();
40
        foreach ($records as $values) {
41
            $request = new Request($values);
42
            $command = new CreateReview($request);
43
            if ($review = $this->importedReview($command->request)) {
44
                $result['attachments'] += glsr()->filterInt('import/review/attachments', 0, $request, $review, false);
45
                $result['skipped']++;
46
                continue;
47
            }
48
            if ($review = glsr(ReviewManager::class)->create($command)) {
49
                $result['attachments'] += glsr()->filterInt('import/review/attachments', 0, $request, $review, true);
50
                $result['imported']++;
51
                continue;
52
            }
53
            $result['skipped']++;
54
        }
55
        wp_defer_term_counting(false);
56
        wp_suspend_cache_invalidation(false);
57
        unset($reader, $records);
58
        return glsr(ImportResultDefaults::class)->restrict($result);
59
    }
60
61
    public function importAttachments(int $limit = 1, int $offset = 0): array
62
    {
63
        if (!defined('WP_IMPORTING')) {
64
            define('WP_IMPORTING', true);
65
        }
66
        set_time_limit(0);
67
        wp_raise_memory_limit('image');
68
        wp_suspend_cache_invalidation(true);
69
        $limit = max(1, $limit);
70
        $offset = max(0, $offset);
71
        $result = glsr()->filterArray('import/reviews/attachments', [], $limit, $offset);
72
        wp_suspend_cache_invalidation(false);
73
        return glsr(ImportResultDefaults::class)->restrict($result);
74
75
    }
76
77
    public function importedReview(Request $request): ?Review
78
    {
79
        $submittedHash = md5(maybe_serialize($request->toArray()));
80
        $sql = "
81
            SELECT p.ID
82
            FROM table|posts AS p
83
            INNER JOIN table|postmeta AS pm ON (pm.post_id = p.ID)
84
            WHERE 1=1
85
            AND p.post_type = %s
86
            AND pm.meta_key = '_submitted_hash'
87
            AND pm.meta_value = %s
88
        ";
89
        $sql = glsr(Query::class)->sql($sql, glsr()->post_type, $submittedHash);
90
        $reviewId = glsr(Database::class)->dbGetVar($sql);
91
        $reviewId = Cast::toInt($reviewId);
92
        $review = glsr_get_review($reviewId);
93
        if (!$review->isValid()) {
94
            return null;
95
        }
96
        return $review;
97
    }
98
99
    public function prepare(): void
100
    {
101
        glsr(TableTmp::class)->create(); // create a temporary table for importing
102
    }
103
104
    public function tempFilePath(): string
105
    {
106
        $uploads = wp_upload_dir();
107
        if (!file_exists($uploads['basedir'])) {
108
            $uploads = wp_upload_dir(null, true, true); // maybe the site has been moved, so refresh the cached uploads path
109
        }
110
        $path = trailingslashit($uploads['basedir']);
111
        $path = trailingslashit($path.glsr()->id);
112
        $path = trailingslashit($path.'temp');
113
        wp_mkdir_p($path);
114
        return $path.'import.csv';
115
    }
116
117
    public function unlinkTempFile(): bool
118
    {
119
        $path = $this->tempFilePath();
120
        if (!is_file($path)) {
121
            return false;
122
        }
123
        unlink($path); // delete the temporary import file
124
        return true;
125
    }
126
}
127