forked from projects/thebadspace
ro
2bcb887d19
Adding total actions count to location data has made it possible to simplify backend data queries, so the custom pagination was optimized and location repositories have been cleaned up. the front end controller has been cleaned up as well, which has resulted in the appropriate template being polished up as well.
218 lines
8.4 KiB
PHP
218 lines
8.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Location;
|
|
use Ramsey\Uuid\Uuid;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use App\Models\Source;
|
|
|
|
class LocationController extends Controller
|
|
{
|
|
public function addLocation(Request $request)
|
|
{
|
|
$fields = $request->validate([
|
|
'name' => ['required'],
|
|
'url' => ['required'],
|
|
'description' => ['required'],
|
|
'tags' => ['required'],
|
|
]);
|
|
|
|
if ($fields) {
|
|
$examples = [];
|
|
$files = $request->files->get("loc_examples");
|
|
if ($request->hasfile('loc_examples')) {
|
|
foreach ($request->file('loc_examples') as $file) {
|
|
$path = $file->store('reference');
|
|
array_push($examples, ["path" => $path]);
|
|
}
|
|
}
|
|
$request->merge(['active' => true]);
|
|
$request->merge(['uuid' => Uuid::uuid4()]);
|
|
$request->merge(['images' => json_encode($examples)]);
|
|
$request->merge(['added_by' => Auth::user()->id]);
|
|
//NOTE: Laravel gets funky if sequencing isn't explicitly set
|
|
$new = Location::create($request->all());
|
|
if ($new) {
|
|
return back()->with('message', 'New Location Added. Take a break!');
|
|
} else {
|
|
return back()->withErrors([
|
|
'error' => 'Uh oh. There was an inssue',
|
|
]);
|
|
}
|
|
} else {
|
|
return back()->withErrors([
|
|
'error' => 'All fields are required',
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function updateLocations()
|
|
{
|
|
$duplicates = 0;
|
|
$fresh = 0;
|
|
|
|
$unified = [];
|
|
$sources = Source::where("active", true)->get();
|
|
foreach ($sources as $source) {
|
|
//parsing for mastodon
|
|
if ($source->type == 'mastodon') {
|
|
$result = [];
|
|
if ($source->token == null) {
|
|
$result = \Mastodon::domain('https://' . $source->url)
|
|
->get('/instance/domain_blocks');
|
|
} else {
|
|
$result = \Mastodon::domain('https://' . $source->url)
|
|
->token($source->token)
|
|
->get('/instance/domain_blocks');
|
|
}
|
|
|
|
foreach ($result 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'];
|
|
} else {
|
|
++$unified[$index]['silence_count'];
|
|
}
|
|
} else {
|
|
$silence = 0;
|
|
$suspend = 0;
|
|
if ($item['severity'] == "suspend" || $item['severity'] == "defederate") {
|
|
++$suspend;
|
|
} else {
|
|
++$silence;
|
|
}
|
|
array_push($unified, [
|
|
'name' => $item['domain'],
|
|
'url' => $item['domain'],
|
|
'rating' => $item['severity'],
|
|
'comment' => $item['comment'],
|
|
'block_count' => $suspend,
|
|
'silence_count' => $silence,
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
//parsing for custom csv
|
|
if ($source->type == 'custom' && $source->format == 'csv') {
|
|
$denylist = array_map('str_getcsv', file($source->url));
|
|
foreach ($denylist as $item) {
|
|
$index = array_search($item[0], array_column($unified, 'url'));
|
|
if ($index) {
|
|
//if there is a match, update the count
|
|
if ($item[1] == "suspend" || $item['severity'] == "defederate") {
|
|
++$unified[$index]['block_count'];
|
|
} else {
|
|
++$unified[$index]['silence_count'];
|
|
}
|
|
} else {
|
|
$silence = 0;
|
|
$suspend = 0;
|
|
if ($item[1] == "suspend" || $item[1] == "defederate") {
|
|
++$suspend;
|
|
} else {
|
|
++$silence;
|
|
}
|
|
array_push($unified, [
|
|
'name' => $item[0],
|
|
'url' => $item[0],
|
|
'rating' => $item[1],
|
|
'comment' => $item[2],
|
|
'block_count' => $suspend,
|
|
'silence_count' => $silence,
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//TODO: maintenance script to set locations to inactive if they haven't been updated
|
|
// over 90 days
|
|
|
|
//$diff=date_diff($location->updated_at, new DateTime());
|
|
//$days = $diff->format("%R%a days")
|
|
|
|
//$interval = $location->updated_at->diff(new DateTime());
|
|
//$days = $interval->format("%a");
|
|
|
|
//get all locations and sort which are present in unified or not
|
|
/*
|
|
$sorted = [];
|
|
$listed = 0;
|
|
$notlisted = 0;
|
|
foreach (Location::all() as $location) {
|
|
if (array_search($location->url, array_column($unified, 'url'))) {
|
|
++$listed;
|
|
// locations present in unfied, so updated
|
|
array_push($sorted, [
|
|
'location' => $location,
|
|
'listed' => true
|
|
]);
|
|
} else {
|
|
++$notlisted;
|
|
//locations not present
|
|
array_push($sorted, [
|
|
'location' => $location,
|
|
'listed' => false
|
|
]);
|
|
}
|
|
};
|
|
*/
|
|
|
|
//once the unified list is created, update current entries or create fresh ones
|
|
|
|
foreach ($unified as $item) {
|
|
$location = Location::where("url", $item['url'])->first();
|
|
if ($location) {
|
|
++$duplicates;
|
|
//update block count for existing item
|
|
|
|
$location->block_count = $item['block_count'];
|
|
$location->silence_count = $item['silence_count'];
|
|
|
|
$location->actions_count = $item['block_count'] + $item['silence_count'];
|
|
|
|
if (($item['block_count'] + $item['silence_count']) < 2) {
|
|
$location->active = false;
|
|
}
|
|
|
|
//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'],
|
|
'silence_count' => $item['silence_count'],
|
|
'actions_cont' => $item['block_count'] + $item['silence_count']
|
|
]);
|
|
}
|
|
}
|
|
//TODO: Send update post to TBS social account
|
|
return back()->with('message', $duplicates . ' UPDATED - ' . $fresh . ' CREATED');
|
|
}
|
|
}
|