diff --git a/app/Http/Controllers/ReminderController.php b/app/Http/Controllers/ReminderController.php index 4f4ec5fe94..a5e0b087db 100644 --- a/app/Http/Controllers/ReminderController.php +++ b/app/Http/Controllers/ReminderController.php @@ -1,9 +1,9 @@ reminders()->get(); - $reminders->each( - function (Reminder $reminder) use ($helper) { - $reminder->description = $helper->getReminderText($reminder); - } - ); - - $today = new Carbon; - // active reminders: - $active = $reminders->filter( - function (Reminder $reminder) use ($today) { - if ($reminder->notnow === false && $reminder->active === true && $reminder->startdate <= $today && $reminder->enddate >= $today) { - return $reminder; - } - } - ); - - // expired reminders: - $expired = $reminders->filter( - function (Reminder $reminder) use ($today) { - if ($reminder->notnow === false && $reminder->active === true && $reminder->startdate > $today || $reminder->enddate < $today) { - return $reminder; - } - } - ); - - // inactive reminders - $inactive = $reminders->filter( - function (Reminder $reminder) { - if ($reminder->active === false) { - return $reminder; - } - } - ); - - // dismissed reminders - $dismissed = $reminders->filter( - function (Reminder $reminder) { - if ($reminder->notnow === true) { - return $reminder; - } - } - ); + $active = $repository->getActiveReminders(); + $expired = $repository->getExpiredReminders(); + $inactive = $repository->getInactiveReminders(); + $dismissed = $repository->getDismissedReminders(); $title = 'Reminders'; $mainTitleIcon = 'fa-clock-o'; diff --git a/app/Http/routes.php b/app/Http/routes.php index ecb1e96c3a..11e5f33a89 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -130,9 +130,25 @@ Route::bind( Route::bind( 'category', function ($value, $route) { if (Auth::check()) { - return Category::where('id', $value)->where('user_id', Auth::user()->id)->first(); + $object = Category::where('id', $value)->where('user_id', Auth::user()->id)->first(); if ($object) { - $object = $object; + return $object; + } + } + + throw new NotFoundHttpException; +} +); + +Route::bind( + 'reminder', function ($value, $route) { + if (Auth::check()) { + /** @var \FireflyIII\Models\Reminder $object */ + $object = Reminder::find($value); + if($object) { + if($object->remindersable->account->user_id == Auth::user()->id) { + return $object; + } } } @@ -143,9 +159,9 @@ Route::bind( Route::bind( 'tag', function ($value, $route) { if (Auth::check()) { - return Tag::where('id', $value)->where('user_id', Auth::user()->id)->first(); + $object = Tag::where('id', $value)->where('user_id', Auth::user()->id)->first(); if ($object) { - $object = $object; + return $object; } } diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index eaecd56528..36c32de527 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -84,6 +84,7 @@ class FireflyServiceProvider extends ServiceProvider $this->app->bind('FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface', 'FireflyIII\Repositories\PiggyBank\PiggyBankRepository'); $this->app->bind('FireflyIII\Repositories\Currency\CurrencyRepositoryInterface', 'FireflyIII\Repositories\Currency\CurrencyRepository'); $this->app->bind('FireflyIII\Repositories\Tag\TagRepositoryInterface', 'FireflyIII\Repositories\Tag\TagRepository'); + $this->app->bind('FireflyIII\Repositories\Reminder\ReminderRepositoryInterface', 'FireflyIII\Repositories\Reminder\ReminderRepository'); $this->app->bind('FireflyIII\Support\Search\SearchInterface', 'FireflyIII\Support\Search\Search'); diff --git a/app/Repositories/Reminder/ReminderRepository.php b/app/Repositories/Reminder/ReminderRepository.php new file mode 100644 index 0000000000..d35e8bda2f --- /dev/null +++ b/app/Repositories/Reminder/ReminderRepository.php @@ -0,0 +1,116 @@ +helper = App::make('FireflyIII\Helpers\Reminders\ReminderHelperInterface'); + } + + /** + * @return Collection + */ + public function getActiveReminders() + { + $today = new Carbon; + // active reminders: + $active = Auth::user()->reminders() + ->where('notnow', 0) + ->where('active', 1) + ->where('startdate', '<=', $today->format('Y-m-d 00:00:00')) + ->where('enddate', '>=', $today->format('Y-m-d 00:00:00')) + ->get(); + + $active->each( + function (Reminder $reminder) { + $reminder->description = $this->helper->getReminderText($reminder); + } + ); + + return $active; + + } + + /** + * @return Collection + */ + public function getDismissedReminders() + { + $dismissed = Auth::user()->reminders() + ->where('notnow', 1) + ->get(); + + $dismissed->each( + function (Reminder $reminder) { + $reminder->description = $this->helper->getReminderText($reminder); + } + ); + + return $dismissed; + } + + /** + * @return Collection + */ + public function getExpiredReminders() + { + + $expired = Auth::user()->reminders() + ->where('notnow', 0) + ->where('active', 1) + ->where( + function (Builder $q) { + $today = new Carbon; + $q->where('startdate', '>', $today->format('Y-m-d 00:00:00')); + $q->orWhere('enddate', '<', $today->format('Y-m-d 00:00:00')); + } + )->get(); + + $expired->each( + function (Reminder $reminder) { + $reminder->description = $this->helper->getReminderText($reminder); + } + ); + + return $expired; + } + + /** + * @return Collection + */ + public function getInactiveReminders() + { + $inactive = Auth::user()->reminders() + ->where('active', 0) + ->get(); + + $inactive->each( + function (Reminder $reminder) { + $reminder->description = $this->helper->getReminderText($reminder); + } + ); + + return $inactive; + } +} diff --git a/app/Repositories/Reminder/ReminderRepositoryInterface.php b/app/Repositories/Reminder/ReminderRepositoryInterface.php new file mode 100644 index 0000000000..5692c432c0 --- /dev/null +++ b/app/Repositories/Reminder/ReminderRepositoryInterface.php @@ -0,0 +1,34 @@ +be($reminder->remindersable->account->user); + + $this->call('GET', '/reminder/act/' . $reminder->id); + $this->assertResponseStatus(302); + $this->assertRedirectedToRoute('transactions.create', ['transfer']); + + } + + public function testDismiss() + { + $reminder = FactoryMuffin::create('FireflyIII\Models\Reminder'); + $this->be($reminder->remindersable->account->user); + + $this->call('GET', '/reminder/dismiss/' . $reminder->id); + $this->assertResponseStatus(302); + $this->assertRedirectedTo('/'); + } + + public function testIndex() + { + $user = FactoryMuffin::create('FireflyIII\User'); + $this->be($user); + $reminder = FactoryMuffin::create('FireflyIII\Models\Reminder'); + $collection = new Collection([$reminder]); + + $repository = $this->mock('FireflyIII\Repositories\Reminder\ReminderRepositoryInterface\ReminderRepositoryInterface'); + + $repository->shouldReceive('getActiveReminders')->andReturn($collection); + $repository->shouldReceive('getExpiredReminders')->andReturn($collection); + $repository->shouldReceive('getInactiveReminders')->andReturn($collection); + $repository->shouldReceive('getDismissedReminders')->andReturn($collection); + + $this->call('GET', '/reminders'); + $this->assertResponseOk(); + } + + public function testShow() + { + $reminder = FactoryMuffin::create('FireflyIII\Models\Reminder'); + $reminder->notnow = false; + $reminder->save(); + $this->be($reminder->remindersable->account->user); + + $this->call('GET', '/reminder/' . $reminder->id); + $this->assertResponseOk(); + } + + public function testShowDismissed() + { + $reminder = FactoryMuffin::create('FireflyIII\Models\Reminder'); + $reminder->notnow = true; + $reminder->save(); + $this->be($reminder->remindersable->account->user); + + $this->call('GET', '/reminder/' . $reminder->id); + $this->assertResponseOk(); + } + +} \ No newline at end of file diff --git a/tests/factories/all.php b/tests/factories/all.php index 85e4683a13..760980a8da 100644 --- a/tests/factories/all.php +++ b/tests/factories/all.php @@ -91,6 +91,29 @@ FactoryMuffin::define( ] ); +FactoryMuffin::define( + 'FireflyIII\Models\Reminder', + [ + 'user_id' => 'factory|FireflyIII\User', + 'startdate' => 'date', + 'enddate' => 'date', + 'active' => 'boolean', + 'notnow' => 'boolean', + 'remindersable_id' => 'factory|FireflyIII\Models\Piggybank', + 'remindersable_type' => 'FireflyIII\Models\Piggybank', + 'metadata' => function () { + return [ + 'perReminder' => 100, + 'rangesCount' => 0, + 'ranges' => [], + 'leftToSave' => 100, + ]; + }, + 'encrypted' => 1, + ] +); + + FactoryMuffin::define( 'FireflyIII\Models\Category', [