1
0
mirror of https://koodu.h-i.works/projects/thebadspace synced 2025-05-06 14:41:02 -05:00
thebadspace/src/Service/HandleLocations.php
Ro 245531faf6 Added support of fedifence CSV and pagination
Populated the DB with entries from a fedifence export provided by
@Oliphant (https://codeberg.org/oliphant/blocklists).

As such also updated the appropriate templates with pagination to be
able to peruse through the location directory.

Also added an edit link on the location template front end to make
finding and updating instance info easy.
2023-01-23 19:59:51 -08:00

298 lines
9.6 KiB
PHP

<?php
// src/Controller/ProductController.php
namespace App\Service;
use Doctrine\DBAL\DBALException;
use Doctrine\ORM\ORMException;
use PDOException;
use Exception;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Uid\Uuid;
use Doctrine\DBAL\Connection;
use App\Entity\Location;
use League\Csv\Reader;
//use App\Utils\StringTools;
/**
* Members
*
* Data class for interacting with Member data from the DB
*/
class HandleLocations
{
private $session;
private $entityManager;
private $conn;
private $limit = 9;
public function __construct(
Connection $connection,
EntityManagerInterface $entityManager,
RequestStack $requestStack
) {
$this->connection = $connection;
$this->entityManager = $entityManager;
$this->session = $requestStack->getSession();
}
public function searchLocations(string $terms)
{
$errorMessage = null;
$response = null;
//$utils = new StringTools();
//$term = $utils->removeCommonWords($terms);
$terms = str_replace(",", "", $terms);
$terms = str_replace(" ", "|", $terms);
try {
$search = $this->connection->fetchAllAssociative("SELECT * FROM searchlocations('$terms')");
} catch (PDOException $error) {
$errorMessage = $error->getMessage();
} catch (DBALException $error) {
$errorMessage = $error->getMessage();
} catch (ORMException $error) {
$errorMessage = $error->getMessage();
} catch (Exception $error) {
$errorMessage = $error->getMessage();
} catch (SyntaxErrorException $error) {
$errorMessage = $error->getMessage();
}
if ($errorMessage != null) {
$response = [
"status" => false,
"message" => $errorMessage,
];
} else {
$response = [
"status" => true,
"message" => "Good Reqeust",
"items" => $search,
"terms" => $terms,
];
}
return $response;
}
public function getActiveLocations()
{
$listings = $this->entityManager->getRepository(Location::class);
$locations = $listings->findBy(["active" => true]);
return $locations;
}
public function getLocationByUUID(string $uuid)
{
return $this->entityManager->getRepository(Location::class)->findBy(["uuid" => $uuid]);
}
public function getLocationsPage(int $page, string $active = "all")
{
$locations = $this->entityManager->getRepository(Location::class);
if ($active == "true" || $active == "false") {
$list = $locations->findBy(["active" => $active], ["id" => "ASC"]);
} else {
$list = $locations->findBy([], ["id" => "ASC"]);
}
$count = ceil(count($list) / $this->limit);
$totalCount = count($list);
$shelf = [];
$range = $page * $this->limit - $this->limit;
for ($i = 0; $i <= $this->limit; $i++) {
try {
array_push($shelf, $list[$i + $range]);
} catch (Exception $error) {
}
}
return [
"locations" => $shelf,
"total" => $count,
"totalLocations" => $totalCount,
];
}
/**
* Add new location to db
*
* @param Request $request object containing posted data
* @return JSON
*/
public function modifyLocation($request, $memberId, $action, $uuid = 0)
{
$errorMessage = null;
if ($action == "add") {
$location = new Location();
} else {
$location = $this->entityManager->getRepository(Location::class)->findOneBy(["uuid" => $uuid]);
}
//submitted values
$name = $request->request->get("loc_name");
$location->setName($name);
$url = $request->request->get("loc_url");
$location->setUrl($url);
$desc = $request->request->get("loc_desc");
$location->setDescription($desc);
$tags = $request->request->get("loc_tags");
$location->setTags($tags);
$rating = $request->request->get("rating");
$location->setRating($rating);
//get images
$files = $request->files->get("loc_examples");
if (!empty($files)) {
$examples = [];
for ($i = 0; $i < count($files); $i++) {
$path = $files[$i]->getClientOriginalName();
array_push($examples, ["image_index" => $i, "path" => urlencode($path)]);
}
$location->setImages($examples);
}
//set defaults
$location->setUpdatedAt(new \DateTimeImmutable());
if ($action == "add") {
$location->setUuid(Uuid::v4());
$location->setActive(false);
$location->setCreatedAt(new \DateTimeImmutable());
$location->setAddedBy($memberId);
$this->entityManager->persist($location);
} else {
$active = ($request->request->get("active") == "true" ? true : false);
$location->setActive($active);
}
try {
$this->entityManager->flush();
} catch (PDOException $error) {
$errorMessage = $error->getMessage();
} catch (DBALException $error) {
$errorMessage = $error->getMessage();
} catch (ORMException $error) {
$errorMessage = $error->getMessage();
} catch (Exception $error) {
$errorMessage = $error->getMessage();
} catch (SyntaxErrorException $e) {
$errorMessage = $error->getMessage();
}
// return result status
if ($errorMessage == null) {
$message = "";
if ($action == "add") {
$message = "New location added. Woohoo!";
} else {
$message = "Location Updated! Water break!";
}
return $response = [
"status" => true,
"message" => $message,
];
} else {
return $response = ["status" => false, "message" => $errorMessage];
}
}
/**
* Add new location to db
*
* @param Request $file object containing posted data
* @return Object
*/
public function addMultipleLocations($file, $memberId)
{
//read csv
$csv = Reader::createFromPath($file, "r");
$csv->setHeaderOffset(0);
$records = $csv->getRecords();
$recordCount = count($csv);
$duplicates = 0;
$errorMessage = null;
// Save image
//extract data row by row
//TODO: set name to lowercase for comparison
foreach ($records as $offset => $row) {
$name = $row["Name"];
$url = $row["Url"];
$images = $row["Images"];
$desc = $row["Description"];
$tags = $row["Tags"];
$ratings = $row["Rating"];
$imgs = explode(',', $images);
$examples = [];
//check to see if location already exists
$list = $this->entityManager->getRepository(Location::class);
$entry = $list->findOneBy(["name" => $name]);
if ($entry) {
++$duplicates;
} else {
$errorMessage = null;
$location = new Location();
$location->setName($name);
$location->setUrl($url);
$location->setDescription($desc);
$location->setTags($tags);
$location->setRating($ratings);
//grab images, move them to dir and set image array
foreach ($imgs as $key => $img) {
$imageName = uniqid() . ".jpg";
$path = "../public/assets/images/examples/" . $imageName;
array_push($examples, ["image_index" => $key, "path" => urlencode($imageName)]);
file_put_contents($path, file_get_contents(trim($img)));
}
$location->setImages($examples);
//set defaults
$location->setUuid(Uuid::v4());
$location->setActive(false);
$location->setCreatedAt(new \DateTimeImmutable());
$location->setUpdatedAt(new \DateTimeImmutable());
$location->setAddedBy($memberId);
$this->entityManager->persist($location);
}
}
try {
$this->entityManager->flush();
} catch (PDOException $error) {
$errorMessage = $error->getMessage();
} catch (DBALException $error) {
$errorMessage = $error->getMessage();
} catch (ORMException $error) {
$errorMessage = $error->getMessage();
} catch (Exception $error) {
$errorMessage = $error->getMessage();
} catch (SyntaxErrorException $e) {
$errorMessage = $error->getMessage();
}
if ($duplicates > 0) {
$message = $duplicates . " of " . $recordCount . " location entries were duplicates";
} else {
$message = "Locations Added. Nice Job!";
}
// return result status
if ($errorMessage == null) {
return $response = [
"status" => true,
"message" => $message,
];
} else {
return $response = ["status" => false, "message" => $errorMessage];
}
}
}