refresh(); $pilot->flights = $pilot->flights + $count; $pilot->save(); event(new UserStateChanged($pilot)); return $pilot; } public function adjustFlightHours(User &$pilot, int $hours): User { $pilot->refresh(); $pilot->flight_time = $pilot->flight_time + $hours; $pilot->save(); event(new UserStateChanged($pilot)); return $pilot; } public function calculatePilotRank(User &$pilot): User { $pilot->refresh(); $pilot_hours = $pilot->flight_time / 3600; # TODO: Cache $ranks = Cache::remember( config('cache.keys.RANKS_PILOT_LIST.key'), config('cache.keys.RANKS_PILOT_LIST.time'), function () { return Rank::where('auto_promote', true)->orderBy('hours', 'asc')->get(); }); foreach ($ranks as $rank) { if($rank->hours > $pilot_hours) { break; } else { $pilot->rank_id = $rank->id; } } $pilot->save(); event(new UserStateChanged($pilot)); return $pilot; } public function createPilot(array $data) { $user = User::create(['name' => $data['name'], 'email' => $data['email'], 'airline_id' => $data['airline'], 'home_airport_id' => $data['home_airport'], 'curr_airport_id' => $data['home_airport'], 'password' => Hash::make($data['password'])]); # Attach the user roles $role = Role::where('name', 'user')->first(); $user->attachRole($role); # Let's check their rank $this->calculatePilotRank($user); event(new UserRegistered($user)); # TODO: Send out an email # Looking good, let's return their information return $user; } }