diff --git a/app/Api/V1/Controllers/PiggyBankController.php b/app/Api/V1/Controllers/PiggyBankController.php index a79f0da7ae..2dd1f0f8a6 100644 --- a/app/Api/V1/Controllers/PiggyBankController.php +++ b/app/Api/V1/Controllers/PiggyBankController.php @@ -167,13 +167,12 @@ class PiggyBankController extends Controller */ public function update(PiggyBankRequest $request, PiggyBank $piggyBank): JsonResponse { - $data = $request->getAll(); - $budget = $this->repository->update($piggyBank, $data); - $manager = new Manager(); - $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; + $piggyBank = $this->repository->update($piggyBank, $request->getAll()); + $manager = new Manager(); + $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; $manager->setSerializer(new JsonApiSerializer($baseUrl)); - $resource = new Item($budget, new PiggyBankTransformer($this->parameters), 'piggy_banks'); + $resource = new Item($piggyBank, new PiggyBankTransformer($this->parameters), 'piggy_banks'); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); diff --git a/app/Api/V1/Controllers/RuleController.php b/app/Api/V1/Controllers/RuleController.php index 2ce2e9a8ee..cf1e818239 100644 --- a/app/Api/V1/Controllers/RuleController.php +++ b/app/Api/V1/Controllers/RuleController.php @@ -26,13 +26,11 @@ namespace FireflyIII\Api\V1\Controllers; use FireflyIII\Api\V1\Requests\RuleRequest; use FireflyIII\Models\Rule; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; -use FireflyIII\Transformers\PiggyBankTransformer; use FireflyIII\Transformers\RuleTransformer; use FireflyIII\User; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; -use Illuminate\Validation\Validator; use League\Fractal\Manager; use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Resource\Collection as FractalCollection; @@ -96,7 +94,7 @@ class RuleController extends Controller // get list of budgets. Count it and split it. $collection = $this->ruleRepository->getAll(); $count = $collection->count(); - $rules = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); + $rules = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize); // make paginator: $paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page')); @@ -115,7 +113,7 @@ class RuleController extends Controller * List single resource. * * @param Request $request - * @param Rule $rule + * @param Rule $rule * * @return JsonResponse */ @@ -144,20 +142,32 @@ class RuleController extends Controller */ public function store(RuleRequest $request): JsonResponse { - print_r($request->getAll()); - print_r($request->all()); - exit; + $rule = $this->ruleRepository->store($request->getAll()); + $manager = new Manager(); + $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; + $manager->setSerializer(new JsonApiSerializer($baseUrl)); + + $resource = new Item($rule, new RuleTransformer($this->parameters), 'rules'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); } /** - * @param Request $request - * @param string $object + * @param RuleRequest $request + * @param Rule $rule * * @return JsonResponse */ - public function update(Request $request, string $object): JsonResponse + public function update(RuleRequest $request, Rule $rule): JsonResponse { - // todo replace code and replace request object. + $rule = $this->ruleRepository->update($rule, $request->getAll()); + $manager = new Manager(); + $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; + $manager->setSerializer(new JsonApiSerializer($baseUrl)); + + $resource = new Item($rule, new RuleTransformer($this->parameters), 'rules'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); } } \ No newline at end of file diff --git a/app/Api/V1/Requests/RuleRequest.php b/app/Api/V1/Requests/RuleRequest.php index ebbc4bbd99..84f6afb52b 100644 --- a/app/Api/V1/Requests/RuleRequest.php +++ b/app/Api/V1/Requests/RuleRequest.php @@ -47,11 +47,12 @@ class RuleRequest extends Request { $data = [ 'title' => $this->string('title'), + 'description' => $this->string('description'), 'rule_group_id' => $this->integer('rule_group_id'), 'rule_group_title' => $this->string('rule_group_title'), 'trigger' => $this->string('trigger'), 'strict' => $this->boolean('strict'), - 'stop_processing' => $this->boolean('stop_processing'), + 'stop-processing' => $this->boolean('stop_processing'), 'active' => $this->boolean('active'), 'rule-triggers' => [], 'rule-actions' => [], @@ -59,11 +60,20 @@ class RuleRequest extends Request foreach ($this->get('rule-triggers') as $trigger) { $data['rule-triggers'][] = [ - 'name' => $trigger['name'], - 'value' => $trigger['value'], + 'name' => $trigger['name'], + 'value' => $trigger['value'], + 'stop-processing' => (int)($trigger['stop-processing'] ?? 0) === 1, + ]; + } + foreach ($this->get('rule-actions') as $action) { + $data['rule-actions'][] = [ + 'name' => $action['name'], + 'value' => $action['value'], + 'stop-processing' => (int)($action['stop-processing'] ?? 0) === 1, ]; } + return $data; } /** @@ -78,18 +88,20 @@ class RuleRequest extends Request $contextActions = implode(',', config('firefly.rule-actions-text')); $rules = [ - 'title' => 'required|between:1,100|uniqueObjectForUser:rules,title', - 'description' => 'between:1,5000|nullable', - 'rule_group_id' => 'required|belongsToUser:rule_groups|required_without:rule_group_title', - 'rule_group_title' => 'nullable|between:1,255|required_without:rule_group_id|belongsToUser:rule_groups,title', - 'trigger' => 'required|in:store-journal,update-journal', - 'rule-triggers.*.name' => 'required|in:' . implode(',', $validTriggers), - 'rule-triggers.*.value' => 'required|min:1|ruleTriggerValue', // - 'rule-actions.*.name' => 'required|in:' . implode(',', $validActions), - 'rule-actions.*.value' => 'required_if:rule-action.*.type,' . $contextActions . '|ruleActionValue', - 'strict' => 'required|boolean', - 'stop_processing' => 'required|boolean', - 'active' => 'required|boolean', + 'title' => 'required|between:1,100|uniqueObjectForUser:rules,title', + 'description' => 'between:1,5000|nullable', + 'rule_group_id' => 'required|belongsToUser:rule_groups|required_without:rule_group_title', + 'rule_group_title' => 'nullable|between:1,255|required_without:rule_group_id|belongsToUser:rule_groups,title', + 'trigger' => 'required|in:store-journal,update-journal', + 'rule-triggers.*.name' => 'required|in:' . implode(',', $validTriggers), + 'rule-triggers.*.stop-processing' => 'boolean', + 'rule-triggers.*.value' => 'required|min:1|ruleTriggerValue', // + 'rule-actions.*.name' => 'required|in:' . implode(',', $validActions), + 'rule-actions.*.value' => 'required_if:rule-action.*.type,' . $contextActions . '|ruleActionValue', + 'rule-actions.*.stop-processing' => 'boolean', + 'strict' => 'required|boolean', + 'stop_processing' => 'required|boolean', + 'active' => 'required|boolean', ]; return $rules; diff --git a/app/Http/Requests/RuleFormRequest.php b/app/Http/Requests/RuleFormRequest.php index 148c24aa43..9ef8d49a60 100644 --- a/app/Http/Requests/RuleFormRequest.php +++ b/app/Http/Requests/RuleFormRequest.php @@ -32,7 +32,7 @@ class RuleFormRequest extends Request /** * @return bool */ - public function authorize() + public function authorize(): bool { // Only allow logged in users return auth()->check(); @@ -43,27 +43,52 @@ class RuleFormRequest extends Request */ public function getRuleData(): array { - return [ - 'title' => $this->string('title'), - 'rule_group_id' => $this->integer('rule_group_id'), - 'active' => $this->boolean('active'), - 'trigger' => $this->string('trigger'), - 'description' => $this->string('description'), - 'rule-triggers' => $this->get('rule-trigger'), - 'rule-trigger-values' => $this->get('rule-trigger-value'), - 'rule-trigger-stop' => $this->get('rule-trigger-stop'), - 'rule-actions' => $this->get('rule-action'), - 'rule-action-values' => $this->get('rule-action-value'), - 'rule-action-stop' => $this->get('rule-action-stop'), - 'stop_processing' => $this->boolean('stop_processing'), - 'strict' => $this->boolean('strict'), + $data = [ + 'title' => $this->string('title'), + 'rule_group_id' => $this->integer('rule_group_id'), + 'active' => $this->boolean('active'), + 'trigger' => $this->string('trigger'), + 'description' => $this->string('description'), + 'stop-processing' => $this->boolean('stop_processing'), + 'strict' => $this->boolean('strict'), + 'rule-triggers' => [], + 'rule-actions' => [], ]; + $triggers = $this->get('rule-trigger'); + $triggerValues = $this->get('rule-trigger-value'); + $triggerStop = $this->get('rule-trigger-stop'); + + $actions = $this->get('rule-action'); + $actionValues = $this->get('rule-action-value'); + $actionStop = $this->get('rule-action-stop'); + + if (\is_array($triggers)) { + foreach ($triggers as $index => $value) { + $data['rule-triggers'][] = [ + 'name' => $value, + 'value' => $triggerValues[$index] ?? '', + 'stop-processing' => (int)($triggerStop[$index] ?? 0) === 1, + ]; + } + } + + if (\is_array($actions)) { + foreach ($actions as $index => $value) { + $data['rule-actions'][] = [ + 'name' => $value, + 'value' => $actionValues[$index] ?? '', + 'stop-processing' => (int)($actionStop[$index] ?? 0) === 1, + ]; + } + } + + return $data; } /** * @return array */ - public function rules() + public function rules(): array { /** @var RuleRepositoryInterface $repository */ $repository = app(RuleRepositoryInterface::class); diff --git a/app/Models/Rule.php b/app/Models/Rule.php index 36d67bb89d..36982b40c3 100644 --- a/app/Models/Rule.php +++ b/app/Models/Rule.php @@ -47,6 +47,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @property string $text * @property int $order * @property RuleGroup $ruleGroup + * @property int $rule_group_id + * @property string $description */ class Rule extends Model { diff --git a/app/Repositories/Rule/RuleRepository.php b/app/Repositories/Rule/RuleRepository.php index 26a1cedb92..cb33208d77 100644 --- a/app/Repositories/Rule/RuleRepository.php +++ b/app/Repositories/Rule/RuleRepository.php @@ -290,7 +290,7 @@ class RuleRepository implements RuleRepositoryInterface $rule->order = ($order + 1); $rule->active = 1; $rule->strict = $data['strict'] ?? false; - $rule->stop_processing = 1 === (int)$data['stop_processing']; + $rule->stop_processing = 1 === (int)$data['stop-processing']; $rule->title = $data['title']; $rule->description = \strlen($data['description']) > 0 ? $data['description'] : null; @@ -356,7 +356,7 @@ class RuleRepository implements RuleRepositoryInterface // update rule: $rule->rule_group_id = $data['rule_group_id']; $rule->active = $data['active']; - $rule->stop_processing = $data['stop_processing']; + $rule->stop_processing = $data['stop-processing']; $rule->title = $data['title']; $rule->strict = $data['strict'] ?? false; $rule->description = $data['description']; @@ -387,11 +387,11 @@ class RuleRepository implements RuleRepositoryInterface { $order = 1; foreach ($data['rule-actions'] as $index => $action) { - $value = $data['rule-action-values'][$index] ?? ''; - $stopProcessing = isset($data['rule-action-stop'][$index]) ? true : false; + $value = $action['value'] ?? ''; + $stopProcessing = $action['stop-processing'] ?? false; $actionValues = [ - 'action' => $action, + 'action' => $action['name'], 'value' => $value, 'stopProcessing' => $stopProcessing, 'order' => $order, @@ -423,11 +423,11 @@ class RuleRepository implements RuleRepositoryInterface $this->storeTrigger($rule, $triggerValues); foreach ($data['rule-triggers'] as $index => $trigger) { - $value = $data['rule-trigger-values'][$index] ?? ''; - $stopProcessing = isset($data['rule-trigger-stop'][$index]) ? true : false; + $value = $trigger['value'] ?? ''; + $stopProcessing = $trigger['stop-processing'] ?? false; $triggerValues = [ - 'action' => $trigger, + 'action' => $trigger['name'], 'value' => $value, 'stopProcessing' => $stopProcessing, 'order' => $order,