Почему отзывы пользователей в панели администратора имеют одинаковое содержание, но разные идентификаторы и даты?

Я столкнулся с проблемой в панели администратора Laravel, из-за которой отзывы пользователей дублируются с разными идентификаторами и датами. Один и тот же контент отзыва (заголовок, текст, имя автора) появляется несколько раз, но с разными идентификаторами и датами отправки.

Отзыв под названием "Отличное приложение!" от пользователя A появляется дважды с разными идентификаторами (123 и 456) и датами (1 июня и 15 июня).

Кто-нибудь сталкивался с этой проблемой или у кого есть предложения по ее решению? Как мне гарантировать, что каждый отзыв будет сохранен только один раз?

Буду очень признателен за любые идеи.

//Reviews fetched from the App Store using a scheduled task (up to 200 reviews/hour)
public function fetchReviews($token, $appId)
{
    $curl = curl_init();
    $headers = array(
        "Content-Type: application/json; charset=utf-8",
        "Authorization: Bearer " . $token
    );

    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://api.appstoreconnect.apple.com/v1/apps/$appId/customerReviews?include=response&sort=-createdDate&limit=200",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_TIMEOUT => 60
    ));

    $curlResponse = curl_exec($curl);
    $result = json_decode($curlResponse);
    $err = curl_error($curl);
    curl_close($curl);
}

//Store fetched reviews into the database
public function storeReviewsInDB($appId, $reviews)
{
    $customerReviews = $reviews->data ?? [];
    $app = DB::select('SELECT id, name FROM apps WHERE app_store_id = ?', [$appId]);
    $appId = $app[0]->id;

    $lastInsertedDate = DB::select(
        'SELECT review_submitted_at FROM reviews WHERE app_id = ? ORDER BY review_submitted_at DESC LIMIT 1',
        [$appId]
    );
    $lastDate = $lastInsertedDate[0]->review_submitted_at ?? null;

    $insertData = [];
    foreach ($customerReviews as $customerReview) {
        $reviewSubmittedAt = gmdate('Y-m-d H:i:s', strtotime($customerReview->attributes->createdDate));

        if (is_null($lastDate) || $reviewSubmittedAt > $lastDate) {
            $responseId = $customerReview->relationships->response->data->id ?? null;
            $insertData[] = [
                'app_id' => $appId,
                'review_id' => $customerReview->id,
                'author_name' => $customerReview->attributes->reviewerNickname,
                'title' => $customerReview->attributes->title,
                'body' => $customerReview->attributes->body,
                'rating' => $customerReview->attributes->rating,
                'country' => $customerReview->attributes->territory,
                'review_submitted_at' => $reviewSubmittedAt,
                'response_id' => $responseId
            ];
        }
    }

    if (!empty($insertData)) {
        DB::table('reviews')->insert($insertData);
    }
}
Ульян
Вопрос задан14 мая 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.