diff --git a/app/Api/V1/Controllers/Models/Budget/DestroyController.php b/app/Api/V1/Controllers/Models/Budget/DestroyController.php new file mode 100644 index 0000000000..e6b7f4293c --- /dev/null +++ b/app/Api/V1/Controllers/Models/Budget/DestroyController.php @@ -0,0 +1,68 @@ +. + */ + +namespace FireflyIII\Api\V1\Controllers\Models\Budget; + + +use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Models\Budget; +use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use Illuminate\Http\JsonResponse; + +/** + * Class DestroyController + */ +class DestroyController extends Controller +{ + private BudgetRepositoryInterface $repository; + + /** + * DestroyController constructor. + * + * @codeCoverageIgnore + */ + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + $this->repository = app(BudgetRepositoryInterface::class); + $this->repository->setUser(auth()->user()); + + return $next($request); + } + ); + } + /** + * Remove the specified resource from storage. + * + * @param Budget $budget + * + * @return JsonResponse + * @codeCoverageIgnore + */ + public function destroy(Budget $budget): JsonResponse + { + $this->repository->destroy($budget); + + return response()->json([], 204); + } +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/BudgetController.php b/app/Api/V1/Controllers/Models/Budget/ListController.php similarity index 77% rename from app/Api/V1/Controllers/BudgetController.php rename to app/Api/V1/Controllers/Models/Budget/ListController.php index ed570f20e5..f8f1e740ad 100644 --- a/app/Api/V1/Controllers/BudgetController.php +++ b/app/Api/V1/Controllers/Models/Budget/ListController.php @@ -1,7 +1,7 @@ . */ -declare(strict_types=1); +namespace FireflyIII\Api\V1\Controllers\Models\Budget; -namespace FireflyIII\Api\V1\Controllers; -use FireflyIII\Api\V1\Requests\BudgetStoreRequest; -use FireflyIII\Api\V1\Requests\BudgetUpdateRequest; -use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Helpers\Collector\GroupCollectorInterface; use FireflyIII\Models\Budget; use FireflyIII\Repositories\Budget\BudgetLimitRepositoryInterface; @@ -43,22 +40,17 @@ use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Resource\Collection as FractalCollection; use League\Fractal\Resource\Item; -/** - * Class BudgetController. +/*** + * Class ListController */ -class BudgetController extends Controller +class ListController extends Controller { use TransactionFilter; - - /** @var BudgetLimitRepositoryInterface */ - private $blRepository; - - /** @var BudgetRepositoryInterface The budget repository */ - private $repository; - + private BudgetLimitRepositoryInterface $blRepository; + private BudgetRepositoryInterface $repository; /** - * BudgetController constructor. + * ListController constructor. * * @codeCoverageIgnore */ @@ -67,13 +59,10 @@ class BudgetController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var User $admin */ - $admin = auth()->user(); - $this->repository = app(BudgetRepositoryInterface::class); $this->blRepository = app(BudgetLimitRepositoryInterface::class); - $this->repository->setUser($admin); - $this->blRepository->setUser($admin); + $this->repository->setUser(auth()->user()); + $this->blRepository->setUser(auth()->user()); return $next($request); } @@ -139,21 +128,6 @@ class BudgetController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } - /** - * Remove the specified resource from storage. - * - * @param Budget $budget - * - * @return JsonResponse - * @codeCoverageIgnore - */ - public function delete(Budget $budget): JsonResponse - { - $this->repository->destroy($budget); - - return response()->json([], 204); - } - /** * Display a listing of the resource. * @@ -207,28 +181,7 @@ class BudgetController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } - /** - * Store a budget. - * - * @param BudgetStoreRequest $request - * - * @return JsonResponse - * @throws FireflyException - * - */ - public function store(BudgetStoreRequest $request): JsonResponse - { - $budget = $this->repository->store($request->getAll()); - $manager = $this->getManager(); - /** @var BudgetTransformer $transformer */ - $transformer = app(BudgetTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($budget, $transformer, 'budgets'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - } /** * Show all transactions. @@ -294,28 +247,4 @@ class BudgetController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); } - /** - * Update a budget. - * - * @param BudgetUpdateRequest $request - * @param Budget $budget - * - * @return JsonResponse - */ - public function update(BudgetUpdateRequest $request, Budget $budget): JsonResponse - { - $data = $request->getAll(); - $budget = $this->repository->update($budget, $data); - $manager = $this->getManager(); - - /** @var BudgetTransformer $transformer */ - $transformer = app(BudgetTransformer::class); - $transformer->setParameters($this->parameters); - - $resource = new Item($budget, $transformer, 'budgets'); - - return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); - - } - -} +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/Models/Budget/StoreController.php b/app/Api/V1/Controllers/Models/Budget/StoreController.php new file mode 100644 index 0000000000..656f14c38b --- /dev/null +++ b/app/Api/V1/Controllers/Models/Budget/StoreController.php @@ -0,0 +1,81 @@ +. + */ + +namespace FireflyIII\Api\V1\Controllers\Models\Budget; + + +use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\BudgetStoreRequest; +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Transformers\BudgetTransformer; +use Illuminate\Http\JsonResponse; +use League\Fractal\Resource\Item; + +/** + * Class StoreController + */ +class StoreController extends Controller +{ + private BudgetRepositoryInterface $repository; + + + /** + * StoreController constructor. + * + * @codeCoverageIgnore + */ + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + $this->repository = app(BudgetRepositoryInterface::class); + $this->repository->setUser(auth()->user()); + + return $next($request); + } + ); + } + + /** + * Store a budget. + * + * @param BudgetStoreRequest $request + * + * @return JsonResponse + * @throws FireflyException + * + */ + public function store(BudgetStoreRequest $request): JsonResponse + { + $budget = $this->repository->store($request->getAll()); + $manager = $this->getManager(); + + /** @var BudgetTransformer $transformer */ + $transformer = app(BudgetTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($budget, $transformer, 'budgets'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + } +} \ No newline at end of file diff --git a/app/Api/V1/Controllers/Models/Budget/UpdateController.php b/app/Api/V1/Controllers/Models/Budget/UpdateController.php new file mode 100644 index 0000000000..7c5637d9c6 --- /dev/null +++ b/app/Api/V1/Controllers/Models/Budget/UpdateController.php @@ -0,0 +1,80 @@ +. + */ + +namespace FireflyIII\Api\V1\Controllers\Models\Budget; + + +use FireflyIII\Api\V1\Controllers\Controller; +use FireflyIII\Api\V1\Requests\BudgetUpdateRequest; +use FireflyIII\Models\Budget; +use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Transformers\BudgetTransformer; +use Illuminate\Http\JsonResponse; +use League\Fractal\Resource\Item; + +/** + * Class UpdateController + */ +class UpdateController extends Controller +{ + private BudgetRepositoryInterface $repository; + + /** + * UpdateController constructor. + * + * @codeCoverageIgnore + */ + public function __construct() + { + parent::__construct(); + $this->middleware( + function ($request, $next) { + $this->repository = app(BudgetRepositoryInterface::class); + $this->repository->setUser(auth()->user()); + + return $next($request); + } + ); + } + /** + * Update a budget. + * + * @param BudgetUpdateRequest $request + * @param Budget $budget + * + * @return JsonResponse + */ + public function update(BudgetUpdateRequest $request, Budget $budget): JsonResponse + { + $data = $request->getAll(); + $budget = $this->repository->update($budget, $data); + $manager = $this->getManager(); + + /** @var BudgetTransformer $transformer */ + $transformer = app(BudgetTransformer::class); + $transformer->setParameters($this->parameters); + + $resource = new Item($budget, $transformer, 'budgets'); + + return response()->json($manager->createData($resource)->toArray())->header('Content-Type', self::CONTENT_TYPE); + + } +} \ No newline at end of file diff --git a/app/Api/V1/Requests/BudgetStoreRequest.php b/app/Api/V1/Requests/BudgetStoreRequest.php index fb1f121098..1711eedfe0 100644 --- a/app/Api/V1/Requests/BudgetStoreRequest.php +++ b/app/Api/V1/Requests/BudgetStoreRequest.php @@ -55,9 +55,11 @@ class BudgetStoreRequest extends FormRequest 'name' => $this->string('name'), 'active' => $active, 'order' => 0, - 'auto_budget_type' => $this->string('auto_budget_type'), 'transaction_currency_id' => $this->integer('auto_budget_currency_id'), 'transaction_currency_code' => $this->string('auto_budget_currency_code'), + + // auto budget info + 'auto_budget_type' => $this->string('auto_budget_type'), 'auto_budget_amount' => $this->string('auto_budget_amount'), 'auto_budget_period' => $this->string('auto_budget_period'), ]; @@ -73,15 +75,15 @@ class BudgetStoreRequest extends FormRequest return [ 'name' => 'required|between:1,100|uniqueObjectForUser:budgets,name', 'active' => [new IsBoolean], - 'auto_budget_type' => 'in:reset,rollover,none', 'auto_budget_currency_id' => 'exists:transaction_currencies,id', 'auto_budget_currency_code' => 'exists:transaction_currencies,code', + // auto budget info + 'auto_budget_type' => 'in:reset,rollover,none', 'auto_budget_amount' => 'min:0|max:1000000000', 'auto_budget_period' => 'in:daily,weekly,monthly,quarterly,half_year,yearly', ]; } - /** * Configure the validator instance with special rules for after the basic validation rules. * diff --git a/app/Models/Attachment.php b/app/Models/Attachment.php index e55d58b6d7..263f050b5b 100644 --- a/app/Models/Attachment.php +++ b/app/Models/Attachment.php @@ -52,7 +52,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * @property int $size * @property bool $uploaded * @property-read Model|\Eloquent $attachable - * @property-read Collection|\FireflyIII\Models\Note[] $notes + * @property Collection|\FireflyIII\Models\Note[] $notes * @property-read int|null $notes_count * @property-read User $user * @method static \Illuminate\Database\Eloquent\Builder|Attachment newModelQuery() diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index 548b6a229f..90f25e3dad 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -269,7 +269,7 @@ class BudgetRepository implements BudgetRepositoryInterface // try to create associated auto budget: $type = $data['auto_budget_type'] ?? 0; - if (0 === $type) { + if (0 === $type || '' === $type || 'none' === $type) { return $newBudget; } if ('reset' === $type) { diff --git a/routes/api.php b/routes/api.php index 79717a1b39..1a3fc71c0d 100644 --- a/routes/api.php +++ b/routes/api.php @@ -162,16 +162,16 @@ Route::group( static function () { // Budget API routes: - Route::get('', ['uses' => 'BudgetController@index', 'as' => 'index']); - Route::post('', ['uses' => 'BudgetController@store', 'as' => 'store']); - Route::get('{budget}', ['uses' => 'BudgetController@show', 'as' => 'show']); - Route::put('{budget}', ['uses' => 'BudgetController@update', 'as' => 'update']); - Route::delete('{budget}', ['uses' => 'BudgetController@delete', 'as' => 'delete']); + Route::get('', ['uses' => 'Models\Budget\ListController@index', 'as' => 'index']); + Route::post('', ['uses' => 'Models\Budget\StoreController@store', 'as' => 'store']); + Route::get('{budget}', ['uses' => 'Models\Budget\ListController@show', 'as' => 'show']); + Route::put('{budget}', ['uses' => 'Models\Budget\UpdateController@update', 'as' => 'update']); + Route::delete('{budget}', ['uses' => 'Models\Budget\DestroyController@destroy', 'as' => 'delete']); Route::post('{budget}/limits', ['uses' => 'BudgetLimitController@store', 'as' => 'store_budget_limit']); - Route::get('{budget}/transactions', ['uses' => 'BudgetController@transactions', 'as' => 'transactions']); - Route::get('{budget}/attachments', ['uses' => 'BudgetController@attachments', 'as' => 'attachments']); - Route::get('{budget}/limits', ['uses' => 'BudgetController@budgetLimits', 'as' => 'budget_limits']); + Route::get('{budget}/transactions', ['uses' => 'Models\Budget\ListController@transactions', 'as' => 'transactions']); + Route::get('{budget}/attachments', ['uses' => 'Models\Budget\ListController@attachments', 'as' => 'attachments']); + Route::get('{budget}/limits', ['uses' => 'Models\Budget\ListController@budgetLimits', 'as' => 'budget_limits']); } );