Skip to content

Commit 8c89548

Browse files
authored
refactor: Rewrite updateFilteredPolicies method (#35)
1 parent be98eed commit 8c89548

File tree

1 file changed

+58
-47
lines changed

1 file changed

+58
-47
lines changed

src/Adapters/DatabaseAdapter.php

Lines changed: 58 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,26 @@ public function __construct(Rule $eloquent)
4747
$this->eloquent = $eloquent;
4848
}
4949

50+
/**
51+
* Filter the rule.
52+
*
53+
* @param array $rule
54+
* @return array
55+
*/
56+
public function filterRule(array $rule): array
57+
{
58+
$rule = array_values($rule);
59+
60+
$i = count($rule) - 1;
61+
for (; $i >= 0; $i--) {
62+
if ($rule[$i] != '' && !is_null($rule[$i])) {
63+
break;
64+
}
65+
}
66+
67+
return array_slice($rule, 0, $i + 1);
68+
}
69+
5070
/**
5171
* savePolicyLine function.
5272
*
@@ -177,28 +197,51 @@ public function removePolicies(string $sec, string $ptype, array $rules): void
177197
}
178198

179199
/**
180-
* RemoveFilteredPolicy removes policy rules that match the filter from the storage.
181-
* This is part of the Auto-Save feature.
182-
*
183-
* @param string $sec
184-
* @param string $ptype
185-
* @param int $fieldIndex
186-
* @param string ...$fieldValues
200+
* @param string $sec
201+
* @param string $ptype
202+
* @param int $fieldIndex
203+
* @param string|null ...$fieldValues
204+
* @return array
205+
* @throws Throwable
187206
*/
188-
public function removeFilteredPolicy(string $sec, string $ptype, int $fieldIndex, string ...$fieldValues): void
207+
public function _removeFilteredPolicy(string $sec, string $ptype, int $fieldIndex, ?string ...$fieldValues): array
189208
{
209+
$removedRules = [];
190210
$instance = $this->eloquent->where('ptype', $ptype);
191211

192212
foreach (range(0, 5) as $value) {
193213
if ($fieldIndex <= $value && $value < $fieldIndex + count($fieldValues)) {
194214
if ('' != $fieldValues[$value - $fieldIndex]) {
195-
$instance->where('v'.strval($value), $fieldValues[$value - $fieldIndex]);
215+
$instance->where('v' . strval($value), $fieldValues[$value - $fieldIndex]);
196216
}
197217
}
198218
}
199-
219+
220+
$oldP = $instance->get()->makeHidden(['created_at','updated_at', 'id', 'ptype'])->toArray();
221+
foreach ($oldP as &$item) {
222+
$item = $this->filterRule($item);
223+
$removedRules[] = $item;
224+
}
225+
200226
$instance->delete();
201227
Rule::fireModelEvent('deleted');
228+
229+
return $removedRules;
230+
}
231+
232+
/**
233+
* RemoveFilteredPolicy removes policy rules that match the filter from the storage.
234+
* This is part of the Auto-Save feature.
235+
*
236+
* @param string $sec
237+
* @param string $ptype
238+
* @param int $fieldIndex
239+
* @param string|null ...$fieldValues
240+
* @return void
241+
*/
242+
public function removeFilteredPolicy(string $sec, string $ptype, int $fieldIndex, ?string ...$fieldValues): void
243+
{
244+
$this->_removeFilteredPolicy($sec, $ptype, $fieldIndex, ...$fieldValues);
202245
}
203246

204247
/**
@@ -255,44 +298,12 @@ public function updatePolicies(string $sec, string $ptype, array $oldRules, arra
255298
*/
256299
public function updateFilteredPolicies(string $sec, string $ptype, array $newPolicies, int $fieldIndex, string ...$fieldValues): array
257300
{
258-
$where['ptype'] = $ptype;
259-
foreach ($fieldValues as $fieldValue) {
260-
if (!is_null($fieldValue) && $fieldValue !== '') {
261-
$where['v'. $fieldIndex++] = $fieldValue;
262-
}
263-
}
264-
265-
$newP = [];
266-
$oldP = [];
267-
foreach ($newPolicies as $newRule) {
268-
$col['ptype'] = $ptype;
269-
$col['created_at'] = new DateTime();
270-
$col['updated_at'] = $col['created_at'];
271-
foreach ($newRule as $key => $value) {
272-
$col['v' . strval($key)] = $value;
273-
}
274-
$newP[] = $col;
275-
}
276-
277-
DB::transaction(function () use ($newP, $where, &$oldP) {
278-
$oldRules = $this->eloquent->where($where);
279-
$oldP = $oldRules->get()->makeHidden(['created_at','updated_at', 'id'])->toArray();
280-
281-
foreach ($oldP as &$item) {
282-
$item = array_filter($item, function ($value) {
283-
return !is_null($value) && $value !== '';
284-
});
285-
unset($item['ptype']);
286-
}
287-
288-
$oldRules->delete();
289-
$this->eloquent->insert($newP);
301+
$oldRules = [];
302+
DB::transaction(function () use ($sec, $ptype, $fieldIndex, $fieldValues, $newPolicies, &$oldRules) {
303+
$oldRules = $this->_removeFilteredPolicy($sec, $ptype, $fieldIndex, ...$fieldValues);
304+
$this->addPolicies($sec, $ptype, $newPolicies);
290305
});
291-
292-
Rule::fireModelEvent('saved');
293-
294-
// return deleted rules
295-
return $oldP;
306+
return $oldRules;
296307
}
297308

298309
/**

0 commit comments

Comments
 (0)