Extract reservation logic from controller to model