Issues (150)

src/Extension/OptionsTrait.php (2 issues)

1
<?php
2
3
namespace SoliDry\Extension;
4
5
use Illuminate\Http\Request;
6
use SoliDry\Exceptions\AttributesException;
7
use SoliDry\Helpers\ConfigHelper;
8
use SoliDry\Helpers\ConfigOptions;
9
use SoliDry\Helpers\Json;
10
use SoliDry\Helpers\MigrationsHelper;
11
use SoliDry\Helpers\SqlOptions;
12
use SoliDry\Types\ConfigInterface;
13
use SoliDry\Types\ErrorsInterface;
14
use SoliDry\Types\ModelsInterface;
15
use SoliDry\Types\ApiInterface;
16
17
/**
18
 * Trait OptionsTrait
19
 * @package SoliDry\Extension
20
 *
21
 * @property ConfigOptions configOptions
22
 */
23
trait OptionsTrait
24
{
25
    // default query params value
26
    /**
27
     * @var int
28
     */
29
    private int $defaultPage = ModelsInterface::DEFAULT_PAGE;
30
31
    /**
32
     * @var int
33
     */
34
    private int $defaultLimit = ModelsInterface::DEFAULT_LIMIT;
35
36
    /**
37
     * @var string
38
     */
39
    private string $defaultSort = '';
40
41
    /**
42
     * @var bool
43
     */
44
    private bool $isTree = false;
45
46
    /**
47
     * Sets SqlOptions params
48
     *
49
     * @param Request $request
50
     * @return SqlOptions
51
     * @throws \SoliDry\Exceptions\AttributesException
52
     */
53
    private function setSqlOptions(Request $request) : SqlOptions
54
    {
55
        $sqlOptions = new SqlOptions();
56
        $page = ($request->input(ModelsInterface::PARAM_PAGE) === null) ? $this->defaultPage :
57
            $request->input(ModelsInterface::PARAM_PAGE);
58
        $limit = ($request->input(ModelsInterface::PARAM_LIMIT) === null) ? $this->defaultLimit :
59
            $request->input(ModelsInterface::PARAM_LIMIT);
60
61
        if ($limit > ModelsInterface::MAX_LIMIT) {
62
            throw new AttributesException(ErrorsInterface::JSON_API_ERRORS[ErrorsInterface::HTTP_PARAM_LIMIT], ErrorsInterface::HTTP_PARAM_LIMIT);
63
        }
64
65
        $sort = ($request->input(ModelsInterface::PARAM_SORT) === null) ? $this->defaultSort :
66
            $request->input(ModelsInterface::PARAM_SORT);
67
68
        $data = ($request->input(ModelsInterface::PARAM_DATA) === NULL) ? ModelsInterface::DEFAULT_DATA
69
            : Json::decode(urldecode($request->input(ModelsInterface::PARAM_DATA)));
70
        $orderBy = ($request->input(ModelsInterface::PARAM_ORDER_BY) === null) ? [ApiInterface::RAML_ID => $sort]
71
            : Json::decode($request->input(ModelsInterface::PARAM_ORDER_BY));
72
        $filter = ($request->input(ModelsInterface::PARAM_FILTER) === null) ? [] : Json::decode($request->input(ModelsInterface::PARAM_FILTER));
73
74
        $sqlOptions->setFormRequest($this->formRequest);
75
        $sqlOptions->setLimit($limit);
76
        $sqlOptions->setPage($page);
77
        $sqlOptions->setData($data);
78
        $sqlOptions->setOrderBy($orderBy);
79
        $sqlOptions->setFilter($filter);
80
81
        return $sqlOptions;
82
    }
83
84
    /**
85
     * Sets options based on config.php settings
86
     * @param string $calledMethod
87
     */
88
    private function setConfigOptions(string $calledMethod) : void
89
    {
90
        $this->response->setMethod($calledMethod);
91
92
        $this->configOptions = new ConfigOptions();
93
        $this->configOptions->setCalledMethod($calledMethod);
94
        $this->configOptions->setJwtIsEnabled(ConfigHelper::getNestedParam(ConfigInterface::JWT, ConfigInterface::ENABLED));
95
        $this->configOptions->setJwtTable(ConfigHelper::getNestedParam(ConfigInterface::JWT, ModelsInterface::MIGRATION_TABLE));
96
        if ($this->configOptions->getJwtIsEnabled() === true && $this->configOptions->getJwtTable() === MigrationsHelper::getTableName($this->entity)) {// if jwt enabled=true and tables are equal
97
            $this->configOptions->setIsJwtAction(true);
98
        }
99
100
        $this->setOptionsOnNotDelete($calledMethod);
101
102
        // set those only for create/update
103
        $this->setOptionsOnCreateUpdate($calledMethod);
104
105
        // set those only for index
106
        if ($calledMethod === JSONApiInterface::URI_METHOD_INDEX || $calledMethod === JSONApiInterface::URI_METHOD_VIEW) {
107
            $this->customSql = new CustomSql($this->entity);
0 ignored issues
show
Bug Best Practice introduced by
The property customSql does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
108
            $this->setCacheOpts();
109
        }
110
    }
111
112
    /**
113
     *  Sets cache options: xFetch, cacheBeta, time to live etc
114
     */
115
    private function setCacheOpts() : void
116
    {
117
        $entityCache = ConfigHelper::getNestedParam(ConfigInterface::CACHE, strtolower($this->entity));
118
        if ($entityCache !== null) {
119
            $this->configOptions->setIsCached($entityCache[ConfigInterface::ENABLED]);
120
            if (empty($entityCache[ConfigInterface::CACHE_STAMPEDE_XFETCH]) === false) {
121
                $this->configOptions->setIsXFetch($entityCache[ConfigInterface::CACHE_STAMPEDE_XFETCH]);
122
            }
123
124
            if (empty($entityCache[ConfigInterface::CACHE_STAMPEDE_BETA]) === false) {
125
                $this->configOptions->setCacheBeta($entityCache[ConfigInterface::CACHE_STAMPEDE_BETA]);
126
            }
127
128
            if (empty($entityCache[ConfigInterface::CACHE_TTL]) === false) {
129
                $this->configOptions->setCacheTtl($entityCache[ConfigInterface::CACHE_TTL]);
130
            }
131
        }
132
    }
133
134
    /**
135
     * @param string $calledMethod
136
     */
137
    private function setOptionsOnNotDelete(string $calledMethod) : void
138
    {
139
        if ($calledMethod !== JSONApiInterface::URI_METHOD_DELETE) {
140
            $bitMaskParams = ConfigHelper::getNestedParam(ConfigInterface::BIT_MASK, MigrationsHelper::getTableName($this->entity));
141
            if ($bitMaskParams !== null) {
142
                $this->configOptions->setBitMask(true);
143
                $this->bitMask = new BitMask($bitMaskParams);
0 ignored issues
show
Bug Best Practice introduced by
The property bitMask does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
144
            }
145
        }
146
    }
147
148
    /**
149
     * @param string $calledMethod
150
     */
151
    private function setOptionsOnCreateUpdate(string $calledMethod) : void
152
    {
153
        if (in_array($calledMethod, [JSONApiInterface::URI_METHOD_CREATE, JSONApiInterface::URI_METHOD_UPDATE]) === true) {
154
            // state machine for concrete entity == table
155
            $stateMachine = ConfigHelper::getNestedParam(ConfigInterface::STATE_MACHINE, MigrationsHelper::getTableName($this->entity));
156
            if ($stateMachine !== null) {
157
                $this->configOptions->setStateMachine(true);
158
            }
159
160
            // spell check if enabled
161
            $spellCheck = ConfigHelper::getNestedParam(ConfigInterface::SPELL_CHECK, MigrationsHelper::getTableName($this->entity));
162
            if ($spellCheck !== null) {
163
                $this->configOptions->setSpellCheck(true);
164
            }
165
        }
166
    }
167
168
    /**
169
     *  Sets the default config based parameters
170
     */
171
    private function setDefaults() : void
172
    {
173
        $this->defaultPage = ConfigHelper::getQueryParam(ModelsInterface::PARAM_PAGE);
174
        $this->defaultLimit = ConfigHelper::getQueryParam(ModelsInterface::PARAM_LIMIT);
175
        $this->defaultSort = ConfigHelper::getQueryParam(ModelsInterface::PARAM_SORT);
176
        $this->isTree = ConfigHelper::getNestedParam(ConfigInterface::TREES, $this->entity, true);
177
    }
178
}