thebadspace/app/Services/UpdateService.php
ro f96707f256 Added Source Repository Class
Created a class to handle source data and methodology, and to offload
actions from service classes to make them easier to manage
2024-02-19 13:30:00 -06:00

136 lines
5.1 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();
return count($response['checked']) . ' SOURCES UPDATED - ' .
count($response['notchecked']) . ' SOURCES NOT CHECKED';
}
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';
}
}