Merge branch 'master' of ssh://git.thisfro.ch:222/thisfro/pflaenz.li
This commit is contained in:
commit
34088972f8
12 changed files with 419 additions and 393 deletions
|
@ -17,6 +17,7 @@
|
||||||
"symfony/asset": "5.2.*",
|
"symfony/asset": "5.2.*",
|
||||||
"symfony/console": "5.2.*",
|
"symfony/console": "5.2.*",
|
||||||
"symfony/dotenv": "5.2.*",
|
"symfony/dotenv": "5.2.*",
|
||||||
|
"symfony/filesystem": "5.2.*",
|
||||||
"symfony/flex": "^1.3.1",
|
"symfony/flex": "^1.3.1",
|
||||||
"symfony/form": "5.2.*",
|
"symfony/form": "5.2.*",
|
||||||
"symfony/framework-bundle": "5.2.*",
|
"symfony/framework-bundle": "5.2.*",
|
||||||
|
|
592
composer.lock
generated
592
composer.lock
generated
File diff suppressed because it is too large
Load diff
33
migrations/Version20210715135559.php
Normal file
33
migrations/Version20210715135559.php
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace DoctrineMigrations;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-generated Migration: Please modify to your needs!
|
||||||
|
*/
|
||||||
|
final class Version20210715135559 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up(Schema $schema): void
|
||||||
|
{
|
||||||
|
// this up() migration is auto-generated, please modify it to your needs
|
||||||
|
$this->addSql('ALTER TABLE offering ADD coordinates TEXT DEFAULT NULL');
|
||||||
|
$this->addSql('COMMENT ON COLUMN offering.coordinates IS \'(DC2Type:array)\'');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(Schema $schema): void
|
||||||
|
{
|
||||||
|
// this down() migration is auto-generated, please modify it to your needs
|
||||||
|
$this->addSql('CREATE SCHEMA public');
|
||||||
|
$this->addSql('ALTER TABLE offering DROP coordinates');
|
||||||
|
}
|
||||||
|
}
|
35
migrations/Version20210715142350.php
Normal file
35
migrations/Version20210715142350.php
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace DoctrineMigrations;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-generated Migration: Please modify to your needs!
|
||||||
|
*/
|
||||||
|
final class Version20210715142350 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up(Schema $schema): void
|
||||||
|
{
|
||||||
|
// this up() migration is auto-generated, please modify it to your needs
|
||||||
|
$this->addSql('ALTER TABLE offering ADD coordinate JSON DEFAULT NULL');
|
||||||
|
$this->addSql('ALTER TABLE offering DROP coordinates');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(Schema $schema): void
|
||||||
|
{
|
||||||
|
// this down() migration is auto-generated, please modify it to your needs
|
||||||
|
$this->addSql('CREATE SCHEMA public');
|
||||||
|
$this->addSql('ALTER TABLE offering ADD coordinates TEXT DEFAULT NULL');
|
||||||
|
$this->addSql('ALTER TABLE offering DROP coordinate');
|
||||||
|
$this->addSql('COMMENT ON COLUMN offering.coordinates IS \'(DC2Type:array)\'');
|
||||||
|
}
|
||||||
|
}
|
36
migrations/Version20210715142732.php
Normal file
36
migrations/Version20210715142732.php
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace DoctrineMigrations;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-generated Migration: Please modify to your needs!
|
||||||
|
*/
|
||||||
|
final class Version20210715142732 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up(Schema $schema): void
|
||||||
|
{
|
||||||
|
// this up() migration is auto-generated, please modify it to your needs
|
||||||
|
$this->addSql('ALTER TABLE offering ALTER coordinate TYPE TEXT');
|
||||||
|
$this->addSql('ALTER TABLE offering ALTER coordinate DROP DEFAULT');
|
||||||
|
$this->addSql('COMMENT ON COLUMN offering.coordinate IS \'(DC2Type:object)\'');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(Schema $schema): void
|
||||||
|
{
|
||||||
|
// this down() migration is auto-generated, please modify it to your needs
|
||||||
|
$this->addSql('CREATE SCHEMA public');
|
||||||
|
$this->addSql('ALTER TABLE offering ALTER coordinate TYPE JSON');
|
||||||
|
$this->addSql('ALTER TABLE offering ALTER coordinate DROP DEFAULT');
|
||||||
|
$this->addSql('COMMENT ON COLUMN offering.coordinate IS NULL');
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,8 +10,11 @@ use App\Repository\WishRepository;
|
||||||
|
|
||||||
use App\Service\PlzToCoordinate;
|
use App\Service\PlzToCoordinate;
|
||||||
use App\Service\DistanceCalculator;
|
use App\Service\DistanceCalculator;
|
||||||
|
use App\Service\OfferPhotoHelper;
|
||||||
|
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Location\Coordinate;
|
||||||
|
use Location\Formatter\Coordinate\GeoJSON;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
@ -37,7 +40,7 @@ class OfferController extends AbstractController
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/new', name: 'new_offer')]
|
#[Route('/new', name: 'new_offer')]
|
||||||
public function newOffer(Request $request, string $photoDir): Response
|
public function newOffer(Request $request, string $photoDir, OfferPhotoHelper $offerPhotoHelper, PlzToCoordinate $plzconverter): Response
|
||||||
{
|
{
|
||||||
$offer = new Offering();
|
$offer = new Offering();
|
||||||
$form = $this->createForm(OfferingFormType::class, $offer);
|
$form = $this->createForm(OfferingFormType::class, $offer);
|
||||||
|
@ -49,16 +52,13 @@ class OfferController extends AbstractController
|
||||||
$offer->setByUser($user);
|
$offer->setByUser($user);
|
||||||
$offer->setCreatedAt(new \DateTime());
|
$offer->setCreatedAt(new \DateTime());
|
||||||
|
|
||||||
if ($photo = $form['photo']->getData()) {
|
if ($offerPlz = $form['zipCode']->getData()) {
|
||||||
$filename = uniqid().'.'.$photo->guessExtension();
|
$coordinate = $plzconverter->convertPlzToCoordinate($offerPlz);
|
||||||
try {
|
$offer->setCoordinate($coordinate->format(new GeoJSON()));
|
||||||
$photo->move($photoDir, $filename);
|
|
||||||
} catch (FileException $e) {
|
|
||||||
// unable to upload the photo, give up
|
|
||||||
$this->addFlash("error", "There was an error uploading the photo: ".$e);
|
|
||||||
return $this->redirectToRoute('new_offer');
|
|
||||||
}
|
}
|
||||||
$offer->setPhotoFilename($filename);
|
|
||||||
|
if ($photo = $form['photo']->getData()) {
|
||||||
|
$offerPhotoHelper->uploadOfferPhoto($photoDir, $photo, $offer);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->entityManager->persist($offer);
|
$this->entityManager->persist($offer);
|
||||||
|
@ -75,9 +75,9 @@ class OfferController extends AbstractController
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/offer/{id}', name: 'show_offer')]
|
#[Route('/offer/{id}', name: 'show_offer')]
|
||||||
public function show_offer(Offering $offer, WishRepository $wishRepository, PlzToCoordinate $plzconverter, DistanceCalculator $distanceCalculator): Response
|
public function showOffer(Offering $offer, WishRepository $wishRepository, PlzToCoordinate $plzconverter, DistanceCalculator $distanceCalculator): Response
|
||||||
{
|
{
|
||||||
$distance = 0;
|
$distance = null;
|
||||||
$user = $this->getUser();
|
$user = $this->getUser();
|
||||||
$offerPlz = $offer->getZipCode();
|
$offerPlz = $offer->getZipCode();
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ class OfferController extends AbstractController
|
||||||
|
|
||||||
if (isset($userPlz))
|
if (isset($userPlz))
|
||||||
{
|
{
|
||||||
$distance = $distanceCalculator->calculateDistance($plzconverter->getCoordinates($offerPlz), $plzconverter->getCoordinates($userPlz));
|
$distance = $distanceCalculator->calculateDistance($plzconverter->convertPlzToCoordinate($offerPlz), $plzconverter->convertPlzToCoordinate($userPlz));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->render('app/offer.html.twig', [
|
return $this->render('app/offer.html.twig', [
|
||||||
|
@ -100,7 +100,7 @@ class OfferController extends AbstractController
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/offer/edit/{id}', name: 'edit_offer')]
|
#[Route('/offer/edit/{id}', name: 'edit_offer')]
|
||||||
public function editOffer(Offering $offer, OfferingRepository $offerRepository, Request $request, string $photoDir): Response
|
public function editOffer(Offering $offer, OfferingRepository $offerRepository, Request $request, string $photoDir, OfferPhotoHelper $offerPhotoHelper): Response
|
||||||
{
|
{
|
||||||
$form = $this->createForm(OfferingFormType::class, $offer);
|
$form = $this->createForm(OfferingFormType::class, $offer);
|
||||||
$user = $this->getUser();
|
$user = $this->getUser();
|
||||||
|
@ -113,15 +113,9 @@ class OfferController extends AbstractController
|
||||||
$offer->setCreatedAt(new \DateTime());
|
$offer->setCreatedAt(new \DateTime());
|
||||||
|
|
||||||
if ($photo = $form['photo']->getData()) {
|
if ($photo = $form['photo']->getData()) {
|
||||||
$filename = uniqid(random_bytes(6)).'.'.$photo->guessExtension();
|
$oldFilename = $offer->getPhotoFilename();
|
||||||
try {
|
$offerPhotoHelper->uploadOfferPhoto($photoDir, $photo, $offer);
|
||||||
$photo->move($photoDir, $filename);
|
$offerPhotoHelper->deleteOfferPhoto($photoDir, $oldFilename);
|
||||||
} catch (FileException $e) {
|
|
||||||
// unable to upload the photo, give up
|
|
||||||
$this->addFlash("error", "There was an error uploading the photo: ".$e);
|
|
||||||
return $this->redirectToRoute('new_offer');
|
|
||||||
}
|
|
||||||
$offer->setPhotoFilename($filename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->entityManager->persist($offer);
|
$this->entityManager->persist($offer);
|
||||||
|
@ -139,16 +133,13 @@ class OfferController extends AbstractController
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route('/offer/delete/{id}', name: 'delete_offer')]
|
#[Route('/offer/delete/{id}', name: 'delete_offer')]
|
||||||
public function deleteOffer(Offering $offer, string $photoDir): Response
|
public function deleteOffer(Offering $offer, string $photoDir, OfferPhotoHelper $offerPhotoHelper): Response
|
||||||
{
|
{
|
||||||
$user = $this->getUser();
|
$user = $this->getUser();
|
||||||
|
|
||||||
if ($offer->getByUser() === $user)
|
if ($offer->getByUser() === $user)
|
||||||
{
|
{
|
||||||
if ($offer->getPhotoFilename())
|
$offerPhotoHelper->deleteOfferPhoto($photoDir, $offer->getPhotoFilename());
|
||||||
{
|
|
||||||
unlink($photoDir . '/' . $offer->getPhotoFilename());
|
|
||||||
}
|
|
||||||
$this->entityManager->remove($offer);
|
$this->entityManager->remove($offer);
|
||||||
$this->entityManager->flush();
|
$this->entityManager->flush();
|
||||||
$this->addFlash(
|
$this->addFlash(
|
||||||
|
|
|
@ -49,7 +49,7 @@ class RegistrationController extends AbstractController
|
||||||
// generate a signed url and email it to the user
|
// generate a signed url and email it to the user
|
||||||
$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
|
$this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
|
||||||
(new TemplatedEmail())
|
(new TemplatedEmail())
|
||||||
->from(new Address('no-reply@thisfro.ch', 'plantex no-reply'))
|
->from(new Address('no-reply@pflaenz.li', 'Pflänzli no-reply'))
|
||||||
->to($user->getEmail())
|
->to($user->getEmail())
|
||||||
->subject('Please Confirm your Email')
|
->subject('Please Confirm your Email')
|
||||||
->htmlTemplate('registration/confirmation_email.html.twig')
|
->htmlTemplate('registration/confirmation_email.html.twig')
|
||||||
|
|
|
@ -152,7 +152,7 @@ class ResetPasswordController extends AbstractController
|
||||||
}
|
}
|
||||||
|
|
||||||
$email = (new TemplatedEmail())
|
$email = (new TemplatedEmail())
|
||||||
->from(new Address('no-reply@thisfro.ch', 'plantex no-reply'))
|
->from(new Address('no-reply@pflaenz.li', 'Pflänzli no-reply'))
|
||||||
->to($user->getEmail())
|
->to($user->getEmail())
|
||||||
->subject('Your password reset request')
|
->subject('Your password reset request')
|
||||||
->htmlTemplate('reset_password/email.html.twig')
|
->htmlTemplate('reset_password/email.html.twig')
|
||||||
|
|
|
@ -12,6 +12,7 @@ use Symfony\Bridge\Twig\Mime\TemplatedEmail;
|
||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\Mailer\MailerInterface;
|
use Symfony\Component\Mailer\MailerInterface;
|
||||||
|
use Symfony\Component\Mime\Address;
|
||||||
use Symfony\Component\Mime\Email;
|
use Symfony\Component\Mime\Email;
|
||||||
use Symfony\Component\Routing\Annotation\Route;
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
|
||||||
|
@ -26,7 +27,7 @@ class TradeController extends AbstractController
|
||||||
if($user != $offer->getByUser())
|
if($user != $offer->getByUser())
|
||||||
{
|
{
|
||||||
$email = (new TemplatedEmail())
|
$email = (new TemplatedEmail())
|
||||||
->from('no-reply@thisfro.ch')
|
->from(new Address('no-reply@pflaenz.li', 'Pflänzli no-reply'))
|
||||||
->to($offer->getByUser()->getEmail())
|
->to($offer->getByUser()->getEmail())
|
||||||
->replyTo($user->getEmail())
|
->replyTo($user->getEmail())
|
||||||
->subject($user->getUsername() . ' wants to trade with you!')
|
->subject($user->getUsername() . ' wants to trade with you!')
|
||||||
|
|
|
@ -51,6 +51,11 @@ class Offering
|
||||||
*/
|
*/
|
||||||
private $description;
|
private $description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="object", nullable=true)
|
||||||
|
*/
|
||||||
|
private $coordinate;
|
||||||
|
|
||||||
public function getId(): ?int
|
public function getId(): ?int
|
||||||
{
|
{
|
||||||
return $this->id;
|
return $this->id;
|
||||||
|
@ -132,4 +137,16 @@ class Offering
|
||||||
{
|
{
|
||||||
return (string) $this-getTitle();
|
return (string) $this-getTitle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getCoordinate()
|
||||||
|
{
|
||||||
|
return $this->coordinate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setCoordinate($coordinate): self
|
||||||
|
{
|
||||||
|
$this->coordinate = $coordinate;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
42
src/Service/OfferPhotoHelper.php
Normal file
42
src/Service/OfferPhotoHelper.php
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Service;
|
||||||
|
|
||||||
|
use App\Entity\Offering;
|
||||||
|
|
||||||
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
|
||||||
|
use Symfony\Component\Filesystem\Filesystem;
|
||||||
|
use Symfony\Component\HttpFoundation\File\UploadedFile;
|
||||||
|
|
||||||
|
class OfferPhotoHelper
|
||||||
|
{
|
||||||
|
private $logger;
|
||||||
|
|
||||||
|
public function __construct(LoggerInterface $logger)
|
||||||
|
{
|
||||||
|
$this->filesystem = new Filesystem();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function uploadOfferPhoto(string $photoDir, UploadedFile $photo, Offering $offer)
|
||||||
|
{
|
||||||
|
$filename = uniqid().'.'.$photo->guessExtension();
|
||||||
|
try {
|
||||||
|
$photo->move($photoDir, $filename);
|
||||||
|
} catch (FileException $e) {
|
||||||
|
// unable to upload the photo, give up
|
||||||
|
$this->addFlash("error", "There was an error uploading the photo: ".$e);
|
||||||
|
return $this->redirectToRoute('new_offer');
|
||||||
|
}
|
||||||
|
$offer->setPhotoFilename($filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function deleteOfferPhoto(string $photoDir, string $filename)
|
||||||
|
{
|
||||||
|
$file = $photoDir . '/' . $filename;
|
||||||
|
if($this->filesystem->exists($file)) {
|
||||||
|
$this->filesystem->remove($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,7 @@ use Location\Coordinate;
|
||||||
|
|
||||||
class PlzToCoordinate
|
class PlzToCoordinate
|
||||||
{
|
{
|
||||||
public function getCoordinates(int $plz)
|
public function convertPlzToCoordinate(int $plz)
|
||||||
{
|
{
|
||||||
$content = file_get_contents("https://swisspost.opendatasoft.com/api/records/1.0/search/?dataset=plz_verzeichnis_v2&q=postleitzahl%3D" . $plz);
|
$content = file_get_contents("https://swisspost.opendatasoft.com/api/records/1.0/search/?dataset=plz_verzeichnis_v2&q=postleitzahl%3D" . $plz);
|
||||||
$result = json_decode($content);
|
$result = json_decode($content);
|
||||||
|
|
Reference in a new issue