Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 133 additions & 0 deletions Api/Resource/CustomDeliverySlices.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
<?php

namespace CustomDelivery\Api\Resource;

use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use CustomDelivery\Model\Map\CustomDeliverySliceTableMap;
use Propel\Runtime\Map\TableMap;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Serializer\Annotation\Ignore;
use Thelia\Api\Bridge\Propel\State\PropelCollectionProvider;
use Thelia\Api\Bridge\Propel\State\PropelItemProvider;
use Thelia\Api\Resource\PropelResourceInterface;
use Thelia\Api\Resource\PropelResourceTrait;

#[ApiResource(
operations: [
new Get(
uriTemplate: '/admin/custom-delivery/slices/{id}',
name: 'api_custom_delivery_slices_get_id',
provider: PropelItemProvider::class
),
new GetCollection(
uriTemplate: '/admin/custom-delivery/slices',
name: 'api_custom_delivery_slices_get_collection',
provider: PropelCollectionProvider::class
),
],
normalizationContext: ['groups' => [self::GROUP_ADMIN_READ]],
)]
#[ApiResource(
operations: [
new Get(
uriTemplate: '/front/custom-delivery/slices/{id}',
name: 'api_custom_delivery_slices_get_id_front',
provider: PropelItemProvider::class
),
new GetCollection(
uriTemplate: '/front/custom-delivery/slices',
name: 'api_custom_delivery_slices_get_collection_front',
provider: PropelCollectionProvider::class
),
],
normalizationContext: ['groups' => [self::GROUP_FRONT_READ]],
)]
class CustomDeliverySlices implements PropelResourceInterface
{
use PropelResourceTrait;

public const GROUP_ADMIN_READ = 'admin:custom_delivery_slice:read';
public const GROUP_FRONT_READ = 'front:custom_delivery_slice:read';

#[Groups([self::GROUP_ADMIN_READ, self::GROUP_FRONT_READ])]
public ?int $id = null;

#[Groups([self::GROUP_ADMIN_READ, self::GROUP_FRONT_READ])]
public ?int $areaId = null;

#[Groups([self::GROUP_ADMIN_READ, self::GROUP_FRONT_READ])]
public ?float $weightMax = null;

#[Groups([self::GROUP_ADMIN_READ, self::GROUP_FRONT_READ])]
public ?float $priceMax = null;

#[Groups([self::GROUP_ADMIN_READ, self::GROUP_FRONT_READ])]
public ?float $price = null;

public function getId(): ?int
{
return $this->id;
}

public function setId(?int $id): self
{
$this->id = $id;
return $this;
}

public function getAreaId(): ?int
{
return $this->areaId;
}

public function setAreaId(?int $areaId): self
{
$this->areaId = $areaId;
return $this;
}

public function getWeightMax(): ?float
{
return $this->weightMax;
}

public function setWeightMax(?float $weightMax): self
{
$this->weightMax = $weightMax;
return $this;
}

public function getPriceMax(): ?float
{
return $this->priceMax;
}

public function setPriceMax(?float $priceMax): self
{
$this->priceMax = $priceMax;
return $this;
}

public function getPrice(): ?float
{
return $this->price;
}

public function setPrice(?float $price): self
{
$this->price = $price;
return $this;
}

/**
* @return TableMap|null
*/
#[Ignore]
public static function getPropelRelatedTableMap(): ?TableMap
{
return new CustomDeliverySliceTableMap();
}

}
206 changes: 46 additions & 160 deletions Controller/BackController.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,219 +14,105 @@
namespace CustomDelivery\Controller;

use CustomDelivery\CustomDelivery;
use CustomDelivery\Model\CustomDeliverySlice;
use CustomDelivery\Model\CustomDeliverySliceQuery;
use Propel\Runtime\Map\TableMap;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Thelia\Controller\Admin\BaseAdminController;
use Thelia\Core\HttpFoundation\Request;
use Thelia\Core\Security\AccessManager;
use Thelia\Core\Security\Resource\AdminResources;
use Thelia\Core\Template\ParserContext;
use Thelia\Core\Translation\Translator;
use Thelia\Model\ConfigQuery;
use Thelia\Tools\URL;
use CustomDelivery\Service\CustomDeliveryService;


/**
* Class BackController
* @package CustomDelivery\Controller
* @author Julien Chanséaume <julien@thelia.net>
*/

class BackController extends BaseAdminController
{
protected $currentRouter = 'router.customdelivery';
protected CustomDeliveryService $customDeliveryService;

protected $useFallbackTemplate = true;

/**
* Save slice
*
* @return \Symfony\Component\HttpFoundation\Response
*/
public function saveAction(Request $request)
public function __construct(CustomDeliveryService $customDeliveryService)
{
$response = $this->checkAuth([], ['customdelivery'], AccessManager::UPDATE);

if (null !== $response) {
return $response;
}
$this->customDeliveryService = $customDeliveryService;
}

#[Route('/admin/module/customdelivery/save', name: 'customdelivery.admin.update', methods: ['POST'])]
public function saveAction(Request $request): Response
{
$this->checkXmlHttpRequest();

$responseData = [
"success" => false,
"message" => '',
"slice" => null
$data = [
'id' => (int) $request->get('id', 0),
'area' => (int) $request->get('area', 0),
'priceMax' => $request->get('priceMax', 0),
'weightMax' => $request->get('weightMax', 0),
'price' => $request->get('price', 0),
];

$messages = [];
$response = null;
$config = CustomDelivery::getConfig();

try {
if (0 !== $id = (int)$request->get('id', 0)) {
$slice = CustomDeliverySliceQuery::create()->findPk($id);
} else {
$slice = new CustomDeliverySlice();
}

if (0 !== $areaId = (int)$request->get('area', 0)) {
$slice->setAreaId($areaId);
} else {
$messages[] = Translator::getInstance()->trans(
'The area is not valid',
[],
CustomDelivery::MESSAGE_DOMAIN
);
}

if ($config['method'] !== CustomDelivery::METHOD_WEIGHT) {
$priceMax = $this->getFloatVal($request->get('priceMax', 0));
if (0 < $priceMax) {
$slice->setPriceMax($priceMax);
} else {
$messages[] = Translator::getInstance()->trans(
'The price max value is not valid',
[],
CustomDelivery::MESSAGE_DOMAIN
);
}
}

if ($config['method'] !== CustomDelivery::METHOD_PRICE) {
$weightMax = $this->getFloatVal($request->get('weightMax', 0));
if (0 < $weightMax) {
$slice->setWeightMax($weightMax);
} else {
$messages[] = Translator::getInstance()->trans(
'The weight max value is not valid',
[],
CustomDelivery::MESSAGE_DOMAIN
);
}
}

$price = $this->getFloatVal($request->get('price', 0));
if (0 <= $price) {
$slice->setPrice($price);
} else {
$messages[] = Translator::getInstance()->trans(
'The price value is not valid',
[],
CustomDelivery::MESSAGE_DOMAIN
);
}

if (0 === count($messages)) {
$slice->save();
$messages[] = Translator::getInstance()->trans(
'Your slice has been saved',
[],
CustomDelivery::MESSAGE_DOMAIN
);

$responseData['success'] = true;
$responseData['slice'] = $slice->toArray(TableMap::TYPE_STUDLYPHPNAME);
}
} catch (\Exception $e) {
$message[] = $e->getMessage();
}
$result = $this->customDeliveryService->saveSlice(
$data
);

$responseData['message'] = $messages;
$responseData = [
'success' => $result['success'],
'message' => $result['messages'],
'slice' => $result['slice'] ? $result['slice']->toArray(TableMap::TYPE_STUDLYPHPNAME) : null,
];

return $this->jsonResponse(json_encode($responseData));
}

protected function getFloatVal($val, $default=-1)
#[Route('/admin/module/customdelivery/delete', name: 'customdelivery.admin.delete', methods: ['POST'])]
public function deleteAction(Request $request): Response
{
if (preg_match("#^([\d.,]+)$#", $val, $match)) {
return (float) str_replace(array('.', ','), array('', '.'), $match[0]);
$authResponse = $this->checkAuth([], ['customdelivery'], AccessManager::DELETE);
if ($authResponse !== null) {
return $authResponse;
}

return $default;
}

/**
* Save slice
*
* @return Response
*/
public function deleteAction(Request $request)
{
$response = $this->checkAuth([], ['customdelivery'], AccessManager::DELETE);
$this->checkXmlHttpRequest();

if (null !== $response) {
return $response;
}
$id = (int) $request->get('id', 0);

$this->checkXmlHttpRequest();
$result = $this->customDeliveryService->deleteSlice($id);

$responseData = [
"success" => false,
"message" => '',
"slice" => null
'success' => $result['success'],
'message' => $result['messages'],
'slice' => null,
];

$response = null;

try {
if (0 !== $id = (int)$request->get('id', 0)) {
$slice = CustomDeliverySliceQuery::create()->findPk($id);
$slice->delete();
$responseData['success'] = true;
} else {
$responseData['message'] = Translator::getInstance()->trans(
'The slice has not been deleted',
[],
CustomDelivery::MESSAGE_DOMAIN
);
}
} catch (\Exception $e) {
$responseData['message'] = $e->getMessage();
}

return $this->jsonResponse(json_encode($responseData));
}

/**
* Save module configuration
*
* @param ParserContext $parserContext
* @return \Symfony\Component\HttpFoundation\Response
*/
public function saveConfigurationAction()
#[Route('/admin/module/customdelivery/configuration', name: 'customdelivery.admin.configuration', methods: ['POST'])]
public function saveConfigurationAction(): Response
{
$response = $this->checkAuth([AdminResources::MODULE], ['customdelivery'], AccessManager::UPDATE);

if (null !== $response) {
return $response;
$authResponse = $this->checkAuth([AdminResources::MODULE], ['customdelivery'], AccessManager::UPDATE);
if ($authResponse !== null) {
return $authResponse;
}

$form = $this->createForm('customdelivery.configuration.form');
$message = "";

$response = null;

try {
$vform = $this->validateForm($form);
$data = $vform->getData();

ConfigQuery::write(
CustomDelivery::CONFIG_TRACKING_URL,
$data['url']
);
ConfigQuery::write(
CustomDelivery::CONFIG_PICKING_METHOD,
$data['method']
);
ConfigQuery::write(
CustomDelivery::CONFIG_TAX_RULE_ID,
$data['tax']
);
ConfigQuery::write(CustomDelivery::CONFIG_TRACKING_URL, $data['url']);
ConfigQuery::write(CustomDelivery::CONFIG_PICKING_METHOD, $data['method']);
ConfigQuery::write(CustomDelivery::CONFIG_TAX_RULE_ID, $data['tax']);
} catch (\Exception $e) {
$message = $e->getMessage();
}
if ($message) {

if ($message !== "") {
$form->setErrorMessage($message);
$this->getParserContext()
->addForm($form)
Expand Down
Loading