Skip to content
2 changes: 1 addition & 1 deletion .github/workflows/pr-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
strategy:
matrix:
operating-system: [ubuntu-latest]
php-versions: ['8.0','8.2','8.3']
php-versions: ['8.0','8.2','8.3', '8.4']
steps:
- uses: actions/checkout@v3

Expand Down
4 changes: 3 additions & 1 deletion rector.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
SimplifyEmptyCheckOnEmptyArrayRector::class,
])
->withSets([
SetList::PHP_80,
SetList::PHP_82,
SetList::PHP_83,
SetList::PHP_84,
SetList::DEAD_CODE,
SetList::CODE_QUALITY,
SetList::CODING_STYLE,
Expand Down
2 changes: 2 additions & 0 deletions src/Client/SugarApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use Sugarcrm\REST\Endpoint\MLPackage;
use Sugarcrm\REST\Endpoint\ModuleLoader;
use Sugarcrm\REST\Endpoint\Ping;
use Sugarcrm\REST\Endpoint\Rest;
use Sugarcrm\REST\Endpoint\Smart;
use Sugarcrm\REST\Endpoint\SugarBean;
use Sugarcrm\REST\Endpoint\ModuleFilter;
Expand Down Expand Up @@ -48,6 +49,7 @@
* @method ModuleLoader moduleLoader() -
* @method MLPackage mlp(string $id = null)
* @method Integrate integrate(string $module = '', string $id = '')
* @method Rest rest(string $endpoint = '')
*/
class SugarApi extends AbstractClient implements PlatformAwareInterface
{
Expand Down
8 changes: 8 additions & 0 deletions src/Endpoint/Abstracts/AbstractSmartSugarEndpoint.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@

namespace Sugarcrm\REST\Endpoint\Abstracts;

use GuzzleHttp\Psr7\Request;
use MRussell\REST\Endpoint\Data\ValidatedEndpointData;
use MRussell\REST\Endpoint\SmartEndpoint;
use MRussell\REST\Traits\PsrLoggerTrait;
use Sugarcrm\REST\Endpoint\SugarEndpointInterface;
use Sugarcrm\REST\Endpoint\Traits\CompileRequestTrait;
use Sugarcrm\REST\Endpoint\Traits\CustomHeadersTrait;

/**
* Provide a smarter interface for Endpoints, to better manage passed in data
Expand All @@ -20,6 +22,12 @@ abstract class AbstractSmartSugarEndpoint extends SmartEndpoint implements Sugar
{
use CompileRequestTrait;
use PsrLoggerTrait;
use CustomHeadersTrait;

protected string $_dataInterface = ValidatedEndpointData::class;

protected function configureRequest(Request $request, $data): Request
{
return parent::configureRequest($this->addCustomHeadersToRequest($request), $data);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@

namespace Sugarcrm\REST\Endpoint\Abstracts;

use GuzzleHttp\Psr7\Request;
use Sugarcrm\REST\Endpoint\SugarBean;
use MRussell\REST\Endpoint\Abstracts\AbstractModelEndpoint;
use Sugarcrm\REST\Endpoint\Traits\CustomHeadersTrait;
use Sugarcrm\REST\Endpoint\Traits\FieldsDataTrait;
use Sugarcrm\REST\Endpoint\Traits\ModuleAwareTrait;

Expand All @@ -22,6 +24,7 @@ abstract class AbstractSugarBeanCollectionEndpoint extends AbstractSugarCollecti
{
use FieldsDataTrait;
use ModuleAwareTrait;
use CustomHeadersTrait;

public const SUGAR_ORDERBY_DATA_PROPERTY = 'order_by';

Expand Down Expand Up @@ -97,6 +100,11 @@ protected function configurePayload(): mixed
return $this->configureFieldsDataProps($data);
}

protected function configureRequest(Request $request, $data): Request
{
return parent::configureRequest($this->addCustomHeadersToRequest($request), $data);
}

/**
* Add module to url options
* @inheritdoc
Expand Down
4 changes: 3 additions & 1 deletion src/Endpoint/Abstracts/AbstractSugarBeanEndpoint.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use Sugarcrm\REST\Endpoint\Integrate;
use Sugarcrm\REST\Endpoint\SugarEndpointInterface;
use Sugarcrm\REST\Endpoint\Traits\CompileRequestTrait;
use Sugarcrm\REST\Endpoint\Traits\CustomHeadersTrait;
use Sugarcrm\REST\Endpoint\Traits\FieldsDataTrait;
use Sugarcrm\REST\Endpoint\Traits\IntegrateSyncKeyTrait;
use Sugarcrm\REST\Endpoint\Traits\ModuleAwareTrait;
Expand Down Expand Up @@ -53,6 +54,7 @@ abstract class AbstractSugarBeanEndpoint extends ModelEndpoint implements SugarE
use FieldsDataTrait;
use FileUploadsTrait;
use IntegrateSyncKeyTrait;
use CustomHeadersTrait;

public const MODEL_ACTION_VAR = 'action';

Expand Down Expand Up @@ -173,7 +175,7 @@ protected function configureRequest(Request $request, $data): Request
$data = $this->configureFieldsDataProps($data);
}

return parent::configureRequest($request, $data);
return parent::configureRequest($this->addCustomHeadersToRequest($request), $data);
}

/**
Expand Down
8 changes: 8 additions & 0 deletions src/Endpoint/Abstracts/AbstractSugarCollectionEndpoint.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@

namespace Sugarcrm\REST\Endpoint\Abstracts;

use GuzzleHttp\Psr7\Request;
use MRussell\REST\Exception\Endpoint\InvalidRequest;
use GuzzleHttp\Psr7\Response;
use MRussell\REST\Endpoint\Data\AbstractEndpointData;
use MRussell\REST\Endpoint\CollectionEndpoint;
use MRussell\REST\Traits\PsrLoggerTrait;
use Sugarcrm\REST\Endpoint\SugarEndpointInterface;
use Sugarcrm\REST\Endpoint\Traits\CompileRequestTrait;
use Sugarcrm\REST\Endpoint\Traits\CustomHeadersTrait;

/**
* Provides access to a multi-bean collection retrieved from Sugar 7 REST Api
Expand All @@ -23,6 +25,7 @@ abstract class AbstractSugarCollectionEndpoint extends CollectionEndpoint implem
{
use CompileRequestTrait;
use PsrLoggerTrait;
use CustomHeadersTrait;

public const SUGAR_OFFSET_PROPERTY = 'offset';

Expand Down Expand Up @@ -82,6 +85,11 @@ protected function configurePayload(): mixed
return $data;
}

protected function configureRequest(Request $request, $data): Request
{
return parent::configureRequest($this->addCustomHeadersToRequest($request), $data);
}

/**
* Get the configured offset
*/
Expand Down
8 changes: 8 additions & 0 deletions src/Endpoint/Abstracts/AbstractSugarEndpoint.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@

namespace Sugarcrm\REST\Endpoint\Abstracts;

use GuzzleHttp\Psr7\Request;
use MRussell\REST\Endpoint\Endpoint;
use MRussell\REST\Traits\PsrLoggerTrait;
use Sugarcrm\REST\Endpoint\SugarEndpointInterface;
use Sugarcrm\REST\Endpoint\Traits\CompileRequestTrait;
use Sugarcrm\REST\Endpoint\Traits\CustomHeadersTrait;

/**
* Base Sugar API Endpoint for the simplest of REST functionality
Expand All @@ -19,4 +21,10 @@ abstract class AbstractSugarEndpoint extends Endpoint implements SugarEndpointIn
{
use CompileRequestTrait;
use PsrLoggerTrait;
use CustomHeadersTrait;

protected function configureRequest(Request $request, $data): Request
{
return parent::configureRequest($this->addCustomHeadersToRequest($request), $data);
}
}
27 changes: 27 additions & 0 deletions src/Endpoint/Data/Filters/AbstractPredefinedFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Sugarcrm\REST\Endpoint\Data\Filters;

use Sugarcrm\REST\Endpoint\Data\Filters\Operator\AbstractOperator;

abstract class AbstractPredefinedFilter extends AbstractOperator
{
public function __construct(array $arguments = [])
{
if (!empty($arguments) && count($arguments) < 2) {
$arguments = [
$this->getOperator(),
$arguments[0] ?? '',
];
}

parent::__construct($arguments);
}

public function compile(): array
{
return [
$this->getOperator() => $this->getValue(),
];
}
}
8 changes: 8 additions & 0 deletions src/Endpoint/Data/Filters/Creator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Sugarcrm\REST\Endpoint\Data\Filters;

class Creator extends AbstractPredefinedFilter
{
public const OPERATOR = '$creator';
}
86 changes: 50 additions & 36 deletions src/Endpoint/Data/Filters/Expression/AbstractExpression.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@

namespace Sugarcrm\REST\Endpoint\Data\Filters\Expression;

use Sugarcrm\REST\Endpoint\Data\Filters\Creator;
use Sugarcrm\REST\Endpoint\Data\Filters\Favorite;
use Sugarcrm\REST\Endpoint\Data\Filters\Following;
use Sugarcrm\REST\Endpoint\Data\Filters\Operator\Equals;
use Sugarcrm\REST\Endpoint\Data\Filters\Operator\InRadiusFromCoords;
use Sugarcrm\REST\Endpoint\Data\Filters\Operator\InRadiusFromZip;
use Sugarcrm\REST\Endpoint\Data\Filters\Operator\NotEquals;
use Sugarcrm\REST\Endpoint\Data\Filters\Operator\Starts;
use Sugarcrm\REST\Endpoint\Data\Filters\Operator\Ends;
Expand All @@ -22,48 +27,52 @@
use Sugarcrm\REST\Endpoint\Data\Filters\Operator\Between;
use Sugarcrm\REST\Endpoint\Data\Filters\Operator\DateBetween;
use Sugarcrm\REST\Endpoint\Data\Filters\FilterInterface;
use Sugarcrm\REST\Endpoint\Data\Filters\Owner;
use Sugarcrm\REST\Endpoint\Data\Filters\Tracker;
use Sugarcrm\REST\Exception\Filter\UnknownFilterOperator;

/**
* The default expression implementation provides an API for acess to all Sugar filter operators
* @package Sugarcrm\REST\Endpoint\Data\Filters\Expression
* @method AndExpression and()
* @method OrExpression or()
* @method DateExpression date($field)
* @method $this equals($field,$value)
* @method $this notEquals($field,$value)
* @method $this starts($field,$value)
* @method $this ends($field,$value)
* @method $this contains($field,$value)
* @method $this in($field,array $value)
* @method $this notIn($field,array $value)
* @method $this isNull($field)
* @method $this notNull($field)
* @method $this lt($field,$value)
* @method $this lessThan($field,$value)
* @method $this lte($field,$value)
* @method $this lessThanOrEqualTo($field,$value)
* @method $this lessThanOrEquals($field,$value)
* @method $this greaterThan($field,$value)
* @method $this gte($field,$value)
* @method $this greaterThanOrEqualTo($field,$value)
* @method $this greaterThanOrEquals($field,$value)
* @method $this between($field,$value)
* @method $this dateBetween($field,$value)
* @method DateExpression date(string $field)
* @method DistanceExpression distance(string $field)
* @method static equals(string $field, mixed $value)
* @method static notEquals(string $field, mixed $value)
* @method static starts(string $field,mixed $value)
* @method static ends(string $field, mixed $value)
* @method static contains(string $field, mixed $value)
* @method static in(string $field, array $value)
* @method static notIn(string $field, array $value)
* @method static isNull(string $field)
* @method static notNull(string $field)
* @method static lt(string $field,int|float $value)
* @method static lessThan(string $field, int|float $value)
* @method static lte(string $field, int|float $value)
* @method static lessThanOrEqualTo(string $field, int|float $value)
* @method static lessThanOrEquals(string $field, int|float $value)
* @method static greaterThan(string $field, int|float $value)
* @method static gte(string $field, int|float $value)
* @method static greaterThanOrEqualTo(string $field, int|float $value)
* @method static greaterThanOrEquals(string $field, int|float$value)
* @method static between(string $field, array $value)
* @method static dateBetween(string $field,array $value)
* @method static inRadiusFromCoords(string $field, array $coords, int|float $radius, string $unitType = 'km')
* @method static inRadiusFromZip(string $field, string $zip, int|float $radius, string $country, string $unitType = 'km')
* @method static favorite()
* @method static following()
* @method static owner()
* @method static creator()
* @method static tracker(string $interval)
*/
abstract class AbstractExpression implements FilterInterface, ExpressionInterface
{
/**
* @var array
*/
protected $filters = [];
protected array $filters = [];

private ?\Sugarcrm\REST\Endpoint\Data\Filters\Expression\AbstractExpression $parentExpression = null;
private AbstractExpression $parentExpression;

/**
* @var array
*/
protected $operators = [
protected array $operators = [
'equals' => Equals::class,
'notEquals' => NotEquals::class,
'starts' => Starts::class,
Expand All @@ -85,15 +94,20 @@ abstract class AbstractExpression implements FilterInterface, ExpressionInterfac
'greaterThanOrEquals' => GreaterThanOrEqual::class,
'between' => Between::class,
'dateBetween' => DateBetween::class,
'inRadiusFromCoords' => InRadiusFromCoords::class,
'inRadiusFromZip' => InRadiusFromZip::class,
'favorite' => Favorite::class,
'following' => Following::class,
'owner' => Owner::class,
'tracker' => Tracker::class,
'creator' => Creator::class,
];

/**
* @var array
*/
protected $expressions = [
protected array $expressions = [
'and' => AndExpression::class,
'or' => OrExpression::class,
'date' => DateExpression::class,
'distance' => DistanceExpression::class,
];

/**
Expand Down Expand Up @@ -126,7 +140,7 @@ public function __call($name, $arguments)
* Sets Parent Expression to allow for nested tree structure
* @return $this
*/
public function setParentExpression(AbstractExpression $Expression)
public function setParentExpression(AbstractExpression $Expression): static
{
$this->parentExpression = $Expression;
return $this;
Expand Down Expand Up @@ -156,7 +170,7 @@ public function compile(): array
/**
* @inheritDoc
*/
public function clear()
public function clear(): static
{
$this->filters = [];
return $this;
Expand Down
Loading