Я столкнулся с проблемой в панели администратора 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 г.