GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Push — master ( 4d9763...76aa8a )
by James
23:28 queued 10:43
created

app/Api/V1/Controllers/RuleController.php (1 issue)

Labels
Severity
1
<?php
2
/**
3
 * RuleController.php
4
 * Copyright (c) 2018 [email protected]
5
 *
6
 * This file is part of Firefly III.
7
 *
8
 * Firefly III is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation, either version 3 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * Firefly III is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with Firefly III. If not, see <http://www.gnu.org/licenses/>.
20
 */
21
22
declare(strict_types=1);
23
24
namespace FireflyIII\Api\V1\Controllers;
25
26
use Carbon\Carbon;
27
use FireflyIII\Api\V1\Requests\RuleRequest;
28
use FireflyIII\Exceptions\FireflyException;
29
use FireflyIII\Jobs\ExecuteRuleOnExistingTransactions;
30
use FireflyIII\Models\AccountType;
31
use FireflyIII\Models\Rule;
32
use FireflyIII\Repositories\Account\AccountRepositoryInterface;
33
use FireflyIII\Repositories\Rule\RuleRepositoryInterface;
34
use FireflyIII\TransactionRules\TransactionMatcher;
35
use FireflyIII\Transformers\RuleTransformer;
36
use FireflyIII\Transformers\TransactionTransformer;
37
use FireflyIII\User;
38
use Illuminate\Http\JsonResponse;
39
use Illuminate\Http\Request;
40
use Illuminate\Pagination\LengthAwarePaginator;
41
use Illuminate\Support\Collection;
42
use League\Fractal\Manager;
43
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
44
use League\Fractal\Resource\Collection as FractalCollection;
45
use League\Fractal\Resource\Item;
46
use League\Fractal\Serializer\JsonApiSerializer;
47
use Log;
48
49
/**
50
 * Class RuleController
51
 */
52
class RuleController extends Controller
53
{
54
    /** @var AccountRepositoryInterface Account repository */
55
    private $accountRepository;
56
    /** @var RuleRepositoryInterface The rule repository */
57
    private $ruleRepository;
58
59
    /**
60
     * RuleController constructor.
61
     */
62
    public function __construct()
63
    {
64
        parent::__construct();
65
        $this->middleware(
66
            function ($request, $next) {
67
                /** @var User $user */
68
                $user = auth()->user();
69
70
                $this->ruleRepository = app(RuleRepositoryInterface::class);
71
                $this->ruleRepository->setUser($user);
72
73
                $this->accountRepository = app(AccountRepositoryInterface::class);
74
                $this->accountRepository->setUser($user);
75
76
                return $next($request);
77
            }
78
        );
79
    }
80
81
    /**
82
     * Delete the resource.
83
     *
84
     * @param Rule $rule
85
     *
86
     * @return JsonResponse
87
     */
88
    public function delete(Rule $rule): JsonResponse
89
    {
90
        $this->ruleRepository->destroy($rule);
91
92
        return response()->json([], 204);
93
    }
94
95
    /**
96
     * List all of them.
97
     *
98
     * @param Request $request
99
     *
100
     * @return JsonResponse]
101
     */
102
    public function index(Request $request): JsonResponse
103
    {
104
        // create some objects:
105
        $manager = new Manager;
106
        $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
107
108
        // types to get, page size:
109
        $pageSize = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
110
111
        // get list of budgets. Count it and split it.
112
        $collection = $this->ruleRepository->getAll();
113
        $count      = $collection->count();
114
        $rules      = $collection->slice(($this->parameters->get('page') - 1) * $pageSize, $pageSize);
115
116
        // make paginator:
117
        $paginator = new LengthAwarePaginator($rules, $count, $pageSize, $this->parameters->get('page'));
118
        $paginator->setPath(route('api.v1.rules.index') . $this->buildParams());
119
120
        // present to user.
121
        $manager->setSerializer(new JsonApiSerializer($baseUrl));
122
123
        /** @var RuleTransformer $transformer */
124
        $transformer = app(RuleTransformer::class);
125
        $transformer->setParameters($this->parameters);
126
127
        $resource = new FractalCollection($rules, $transformer, 'rules');
128
        $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
129
130
        return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
131
132
    }
133
134
    /**
135
     * List single resource.
136
     *
137
     * @param Request $request
138
     * @param Rule    $rule
139
     *
140
     * @return JsonResponse
141
     */
142
    public function show(Request $request, Rule $rule): JsonResponse
143
    {
144
        $manager = new Manager();
145
        $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
146
        $manager->setSerializer(new JsonApiSerializer($baseUrl));
147
148
        /** @var RuleTransformer $transformer */
149
        $transformer = app(RuleTransformer::class);
150
        $transformer->setParameters($this->parameters);
151
152
        $resource = new Item($rule, $transformer, 'rules');
153
154
        return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
155
156
    }
157
158
    /**
159
     * Store new object.
160
     *
161
     * @param RuleRequest $request
162
     *
163
     * @return JsonResponse
164
     */
165
    public function store(RuleRequest $request): JsonResponse
166
    {
167
        $rule    = $this->ruleRepository->store($request->getAll());
168
        $manager = new Manager();
169
        $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
170
        $manager->setSerializer(new JsonApiSerializer($baseUrl));
171
172
        /** @var RuleTransformer $transformer */
173
        $transformer = app(RuleTransformer::class);
174
        $transformer->setParameters($this->parameters);
175
176
        $resource = new Item($rule, $transformer, 'rules');
177
178
        return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
179
    }
180
181
    /**
182
     * @param Request $request
183
     * @param Rule    $rule
184
     *
185
     * @return JsonResponse
186
     * @throws FireflyException
187
     */
188
    public function testRule(Request $request, Rule $rule): JsonResponse
189
    {
190
        $pageSize     = (int)app('preferences')->getForUser(auth()->user(), 'listPageSize', 50)->data;
191
        $page         = 0 === (int)$request->query('page') ? 1 : (int)$request->query('page');
192
        $startDate    = null === $request->query('start_date') ? null : Carbon::createFromFormat('Y-m-d', $request->query('start_date'));
0 ignored issues
show
It seems like $request->query('start_date') can also be of type array; however, parameter $time of Carbon\Carbon::createFromFormat() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

192
        $startDate    = null === $request->query('start_date') ? null : Carbon::createFromFormat('Y-m-d', /** @scrutinizer ignore-type */ $request->query('start_date'));
Loading history...
193
        $endDate      = null === $request->query('end_date') ? null : Carbon::createFromFormat('Y-m-d', $request->query('end_date'));
194
        $searchLimit  = 0 === (int)$request->query('search_limit') ? (int)config('firefly.test-triggers.limit') : (int)$request->query('search_limit');
195
        $triggerLimit = 0 === (int)$request->query('triggered_limit') ? (int)config('firefly.test-triggers.range') : (int)$request->query('triggered_limit');
196
        $accountList  = '' === (string)$request->query('accounts') ? [] : explode(',', $request->query('accounts'));
197
        $accounts     = new Collection;
198
199
        foreach ($accountList as $accountId) {
200
            Log::debug(sprintf('Searching for asset account with id "%s"', $accountId));
201
            $account = $this->accountRepository->findNull((int)$accountId);
202
            if (null !== $account && AccountType::ASSET === $account->accountType->type) {
203
                Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name));
204
                $accounts->push($account);
205
            }
206
            if (null === $account) {
207
                Log::debug(sprintf('No asset account with id "%s"', $accountId));
208
            }
209
        }
210
211
        /** @var Rule $rule */
212
        Log::debug(sprintf('Now testing rule #%d, "%s"', $rule->id, $rule->title));
213
        /** @var TransactionMatcher $matcher */
214
        $matcher = app(TransactionMatcher::class);
215
        // set all parameters:
216
        $matcher->setRule($rule);
217
        $matcher->setStartDate($startDate);
218
        $matcher->setEndDate($endDate);
219
        $matcher->setSearchLimit($searchLimit);
220
        $matcher->setTriggeredLimit($triggerLimit);
221
        $matcher->setAccounts($accounts);
222
223
        $matchingTransactions = $matcher->findTransactionsByRule();
224
        $matchingTransactions = $matchingTransactions->unique('id');
225
226
        // make paginator out of results.
227
        $count        = $matchingTransactions->count();
228
        $transactions = $matchingTransactions->slice(($page - 1) * $pageSize, $pageSize);
229
        // make paginator:
230
        $paginator = new LengthAwarePaginator($transactions, $count, $pageSize, $this->parameters->get('page'));
231
        $paginator->setPath(route('api.v1.rules.test', [$rule->id]) . $this->buildParams());
232
233
        // resulting list is presented as JSON thing.
234
        $manager = new Manager();
235
        $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
236
        $manager->setSerializer(new JsonApiSerializer($baseUrl));
237
238
        /** @var TransactionTransformer $transformer */
239
        $transformer = app(TransactionTransformer::class);
240
        $transformer->setParameters($this->parameters);
241
242
        $resource = new FractalCollection($matchingTransactions, $transformer, 'transactions');
243
        $resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
244
245
        return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
246
    }
247
248
    /**
249
     * Execute the given rule group on a set of existing transactions.
250
     *
251
     * @param Request $request
252
     * @param Rule    $rule
253
     *
254
     * @return JsonResponse
255
     */
256
    public function triggerRule(Request $request, Rule $rule): JsonResponse
257
    {
258
        // Get parameters specified by the user
259
        /** @var User $user */
260
        $user        = auth()->user();
261
        $startDate   = new Carbon($request->get('start_date'));
262
        $endDate     = new Carbon($request->get('end_date'));
263
        $accountList = '' === (string)$request->query('accounts') ? [] : explode(',', $request->query('accounts'));
264
        $accounts    = new Collection;
265
266
        foreach ($accountList as $accountId) {
267
            Log::debug(sprintf('Searching for asset account with id "%s"', $accountId));
268
            $account = $this->accountRepository->findNull((int)$accountId);
269
            if (null !== $account && $this->accountRepository->isAsset($account)) {
270
                Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name));
271
                $accounts->push($account);
272
            }
273
            if (null === $account) {
274
                Log::debug(sprintf('No asset account with id "%s"', $accountId));
275
            }
276
        }
277
278
        // Create a job to do the work asynchronously
279
        $job = new ExecuteRuleOnExistingTransactions($rule);
280
281
        // Apply parameters to the job
282
        $job->setUser($user);
283
        $job->setAccounts($accounts);
284
        $job->setStartDate($startDate);
285
        $job->setEndDate($endDate);
286
287
        // Dispatch a new job to execute it in a queue
288
        $this->dispatch($job);
289
290
        return response()->json([], 204);
291
    }
292
293
    /**
294
     * Update a rule.
295
     *
296
     * @param RuleRequest $request
297
     * @param Rule        $rule
298
     *
299
     * @return JsonResponse
300
     */
301
    public function update(RuleRequest $request, Rule $rule): JsonResponse
302
    {
303
        $rule    = $this->ruleRepository->update($rule, $request->getAll());
304
        $manager = new Manager();
305
        $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1';
306
        $manager->setSerializer(new JsonApiSerializer($baseUrl));
307
308
        /** @var RuleTransformer $transformer */
309
        $transformer = app(RuleTransformer::class);
310
        $transformer->setParameters($this->parameters);
311
312
        $resource = new Item($rule, $transformer, 'rules');
313
314
        return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json');
315
316
    }
317
}
318