ForRo/app/Services/UpdateService.php
ro 43e0004ac5 Updated blocklist retrival process, template edits
The process for updating blocklists per source wasn't effecient, so it
has been rewritten to process each source individually before moving on,
relieving some processing load on the server and ensuring every source
comes back with data, even in the event it doesn't grab it the first
time.

also removed the recent list from the index page as the recently updated
list doesn't reflect what's been the last to get updated and changed the
theme color to match the current palette.
2024-09-12 19:20:13 -06:00

139 lines
5.2 KiB
PHP

<?php
namespace App\Services;
use App\Models\Location;
use App\Repositories\LocationRepository;
use App\Repositories\SourceRepository;
use Ramsey\Uuid\Uuid;
class UpdateService
{
protected $location;
protected $source;
public function __construct(
LocationRepository $locationRepository,
SourceRepository $sourceRepository
) {
$this->location = $locationRepository;
$this->source = $sourceRepository;
}
public function data()
{
$response = $this->source->updateSourceData();
if ($response['updated'] == 'true') {
return count($response['checked']) . ' SOURCES UPDATED';
} else {
return 'NO SOURCES PRESENT';
}
}
public function list()
{
$duplicates = 0;
$fresh = 0;
$unified = [];
$sources = $this->source->getActive();
foreach ($sources as $source) {
//$listData = json_decode();
foreach (json_decode($source->list_data) as $item) {
$index = array_search($item->domain, array_column($unified, 'url'));
if ($index) {
//if there is a match, update the count
if ($item->severity == "suspend" || $item->severity == "defederate") {
++$unified[$index]['block_count'];
array_push($unified[$index]['block_vote'], $source->url);
} else {
++$unified[$index]['silence_count'];
array_push($unified[$index]['silence_vote'], $source->url);
}
} else {
$silence = 0;
$suspend = 0;
$block_vote = [];
$silence_vote = [];
if ($item->severity == "suspend" || $item->severity == "defederate") {
++$suspend;
array_push($block_vote, $source->url);
} else {
++$silence;
array_push($silence_vote, $source->url);
}
array_push($unified, [
'name' => $item->domain,
'url' => $item->domain,
'rating' => $item->severity,
'comment' => $item->comment,
'block_count' => $suspend,
'silence_count' => $silence,
'block_vote' => $block_vote,
'silence_vote' => $silence_vote,
]);
}
}
}
foreach ($unified as $item) {
$location = $this->location->getLocation($item['url']);
if ($location) {
++$duplicates;
//update block count for existing item
$location->block_count = $item['block_count'];
$location->block_vote = [];
$location->block_vote = $item['block_vote'];
$location->silence_count = $item['silence_count'];
$location->silence_vote = [];
$location->silence_vote = $item['silence_vote'];
$location->actions_count = $item['block_count'] + $item['silence_count'];
if (($item['block_count'] + $item['silence_count']) < 2) {
$location->active = false;
} else {
$location->active = true;
}
//replace null with empty array
if ($location->images == null) {
$location->images = [];
};
$location->save();
} else {
// make new entries for instances not present
++$fresh;
$images = [];
$rating = ($item['rating'] == 'defederate') ? 'suspend' : $item['rating'];
$status = true;
if (($item['block_count'] + $item['silence_count']) < 2) {
$status = false;
}
$new = Location::create([
'uuid' => Uuid::uuid4(),
'name' => $item['url'],
'url' => $item['url'],
'description' => ($item['comment'] != null) ? $item['comment'] : "no description",
'active' => $status,
'rating' => $rating,
'added_by' => 1,
'tags' => 'poor moderation, hate speech',
'images' => json_encode($images),
'block_count' => $item['block_count'],
'block_vote' => $item['block_vote'],
'silence_count' => $item['silence_count'],
'silence_vote' => $item['silence_vote'],
'actions_cont' => $item['block_count'] + $item['silence_count']
]);
}
}
//TODO: Send update post to TBS social account
return $duplicates . ' LOCATIONS UPDATED | ' . $fresh . ' NEW LOCATIONS CREATED';
}
}