/**
  * @param Exercise $exercise
  * @return array
  */
 public function transform(Exercise $exercise)
 {
     $array = ['id' => $exercise->id, 'name' => $exercise->name, 'description' => $exercise->description, 'stepNumber' => $exercise->step_number, 'defaultQuantity' => $exercise->default_quantity, 'tag_ids' => $exercise->tags()->lists('id'), 'target' => $exercise->target, 'priority' => $exercise->priority, 'program' => $exercise->program, 'lastDone' => $exercise->lastDone, 'stretch' => $exercise->stretch, 'frequency' => $exercise->frequency, 'dueIn' => $exercise->dueIn];
     if ($exercise->series) {
         $array['series'] = ['id' => $exercise->series->id, 'name' => $exercise->series->name];
     }
     return $array;
 }
 /**
  * Insert an exercise entry.
  * It can be an exercise set.
  * @param Request $request
  * @return \Illuminate\Http\Response
  */
 public function store(Request $request)
 {
     $exercise = Exercise::find($request->get('exercise_id'));
     if ($request->get('exerciseSet')) {
         // We are inserting an exercise set
         $quantity = $exercise->default_quantity;
         $unit = Unit::find($exercise->default_unit_id);
     } else {
         $quantity = $request->get('quantity');
         $unit = Unit::find($request->get('unit_id'));
     }
     $entry = new Entry(['date' => $request->get('date'), 'quantity' => $quantity]);
     $entry->user()->associate(Auth::user());
     $entry->exercise()->associate($exercise);
     $entry->unit()->associate($unit);
     $entry->save();
     //Return the entries for the day
     $entries = transform(createCollection($this->exerciseEntriesRepository->getEntriesForTheDay($request->get('date')), new ExerciseEntryTransformer()))['data'];
     return response($entries, Response::HTTP_CREATED);
 }
 /**
  *
  * @param $exercises
  * @param Unit $unit
  * @param Series $series
  */
 private function insertExercisesInSeries($exercises, Unit $unit, Series $series)
 {
     $index = 0;
     //        $series_ids = Series::where('user_id', $this->user->id)->lists('id')->all();
     foreach ($exercises as $exercise) {
         $index++;
         $stretch = isset($exercise['stretch']) ? 1 : 0;
         $temp = new Exercise(['name' => $exercise['name'], 'description' => $exercise['description'], 'default_quantity' => $exercise['defaultQuantity'], 'step_number' => $index, 'target' => '3 * 10', 'priority' => $exercise['priority'], 'stretch' => $stretch]);
         if (isset($exercise['frequency'])) {
             $temp['frequency'] = $exercise['frequency'];
         }
         $temp->user()->associate($this->user);
         $temp->defaultUnit()->associate($unit);
         $temp->program()->associate(ExerciseProgram::first());
         $temp->series()->associate($series);
         $temp->save();
     }
 }
 /**
  * Get all exercises for the current user,
  * along with their tags, default unit name
  * and the name of the series each exercise belongs to.
  * Order first by series name, then by step number.
  * @return mixed
  */
 public function getExercises()
 {
     $exercises = Exercise::forCurrentUser('exercises')->with('defaultUnit')->orderBy('step_number')->with('series')->with('tags')->get();
     return transform(createCollection($exercises, new ExerciseTransformer()))['data'];
 }
 /**
  * @test
  * @return void
  */
 public function it_can_delete_an_exercise()
 {
     $this->logInUser();
     $exercise = new Exercise(['name' => 'echidna']);
     $exercise->user()->associate($this->user);
     $exercise->save();
     $this->seeInDatabase('exercises', ['name' => 'echidna']);
     $response = $this->call('DELETE', '/api/exercises/' . $exercise->id);
     $this->assertEquals(204, $response->getStatusCode());
     $this->missingFromDatabase('exercises', ['name' => 'echidna']);
     $response = $this->call('DELETE', '/api/units/0');
     $this->assertEquals(404, $response->getStatusCode());
 }
 /**
  * @test
  * @return void
  */
 public function it_can_delete_an_exercise_entry()
 {
     $this->logInUser();
     $date = Carbon::today()->format('Y-m-d');
     $entry = new Entry(['date' => $date, 'quantity' => 501]);
     $entry->user()->associate($this->user);
     $entry->exercise()->associate(Exercise::find(1));
     $entry->unit()->associate(Unit::find(1));
     $entry->save();
     $this->seeInDatabase('exercise_entries', ['date' => $date, 'exercise_id' => 1, 'quantity' => 501, 'exercise_unit_id' => 1]);
     $response = $this->call('DELETE', '/api/exerciseEntries/' . $entry->id);
     $this->assertEquals(204, $response->getStatusCode());
     $this->missingFromDatabase('exercise_entries', ['date' => $date, 'exercise_id' => 1, 'quantity' => 501, 'exercise_unit_id' => 1]);
     $response = $this->call('DELETE', '/api/exerciseEntries/' . $entry->id);
     $this->assertEquals(404, $response->getStatusCode());
 }
 /**
  * Create the entries for the same exercise but with different units
  * for today, so that I can test out the getSpecificExerciseEntries
  * for a day where the exercise is entered with different units
  */
 private function createEntriesForToday()
 {
     $exercise = Exercise::where('user_id', $this->user->id)->first();
     $date = Carbon::today();
     $this->createEntry(5, $exercise, Unit::find($this->unit_ids[0]), $date);
     $this->createEntry(5, $exercise, Unit::find($this->unit_ids[0]), $date);
     $this->createEntry(10, $exercise, Unit::find($this->unit_ids[1]), $date);
 }
 /**
  *
  * @param Exercise $exercise
  * @return mixed
  * @throws \Exception
  */
 public function destroy(Exercise $exercise = null)
 {
     //        if(is_null($exercise)) {
     //            return response([
     //                'error' => 'Exercise not found.',
     //                'status' => Response::HTTP_NOT_FOUND // = 404
     //            ], Response::HTTP_NOT_FOUND);
     //        }
     $exercise->delete();
     return $this->responseNoContent();
 }
 /**
  * Define your route model bindings, pattern filters, etc.
  *
  * @param  \Illuminate\Routing\Router  $router
  * @return void
  */
 public function boot(Router $router)
 {
     parent::boot($router);
     Route::bind('exercises', function ($id) {
         return Exercise::forCurrentUser()->findOrFail($id);
     });
     Route::bind('exerciseEntries', function ($id) {
         return ExerciseEntry::forCurrentUser()->findOrFail($id);
     });
     Route::bind('menuEntries', function ($id) {
         return MenuEntry::forCurrentUser()->findOrFail($id);
     });
     Route::bind('exerciseSeries', function ($id) {
         return ExerciseSeries::forCurrentUser()->findOrFail($id);
     });
     Route::bind('foods', function ($id) {
         return Food::forCurrentUser()->findOrFail($id);
     });
     Route::bind('recipes', function ($id) {
         return Recipe::forCurrentUser()->findOrFail($id);
     });
     Route::bind('exerciseTags', function ($id) {
         return Tag::forCurrentUser()->where('for', 'exercise')->findOrFail($id);
     });
     Route::bind('recipeTags', function ($id) {
         return Tag::forCurrentUser()->where('for', 'recipe')->findOrFail($id);
     });
     Route::bind('foodUnits', function ($id) {
         return Unit::forCurrentUser()->where('for', 'food')->findOrFail($id);
     });
     Route::bind('exerciseUnits', function ($id) {
         return Unit::forCurrentUser()->where('for', 'exercise')->findOrFail($id);
     });
     Route::bind('timers', function ($id) {
         return Timer::forCurrentUser()->findOrFail($id);
     });
     Route::bind('activities', function ($id) {
         return Activity::forCurrentUser()->findOrFail($id);
     });
     Route::bind('weights', function ($idOrDate) {
         if (strrpos($idOrDate, '-')) {
             //parameter is the date of the entry
             $weight = Weight::forCurrentUser()->where('date', $idOrDate)->first();
         } else {
             //parameter is the id of the entry
             $weight = Weight::forCurrentUser()->findOrFail($idOrDate);
         }
         return $weight;
     });
     /**
      * $parameter is either the id or the date
      */
     Route::bind('journal', function ($parameter) {
         /**
          * @VP:
          * Is there a better way to check if the $parameter is an
          * id or a date? When I tried using Carbon to create an object from
          * the parameter, it threw an exception when the $parameter was the id,
          * whereas I just wanted a boolean.
          */
         if (strrpos($parameter, '-')) {
             //$parameter is the date of the entry
             $journal = Journal::forCurrentUser()->where('date', $parameter)->first();
         } else {
             //$parameter is the id of the entry
             $journal = Journal::forCurrentUser()->findOrFail($parameter);
         }
         return $journal;
     });
 }