diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..dba0b6e --- /dev/null +++ b/.env.example @@ -0,0 +1,37 @@ +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_LOG_LEVEL=debug +APP_URL=http://localhost + +DB_CONNECTION=mysql +DB_HOST= +DB_PORT= +DB_DATABASE= +DB_USERNAME= +DB_PASSWORD= + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +SESSION_DRIVER=file +QUEUE_DRIVER=sync + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_DRIVER=smtp +MAIL_HOST=mailtrap.io +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null + +PUSHER_APP_ID= +PUSHER_KEY= +PUSHER_SECRET= + +KONTAKT_KEY= +KONTAKT_VERSION= + +TEAM_CAPACITY= \ No newline at end of file diff --git a/.gitignore b/.gitignore index 41dc809..30c4492 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,8 @@ Homestead.yaml Homestead.json .env public/uploads +public/storage/images/* +storage/app/files/findables/* storage/framework/messages -.env.example .DS_Store /.idea \ No newline at end of file diff --git a/README.md b/README.md index 3ac4a39..4710fe9 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,18 @@ The API (V1) documentation can be found [here](https://documenter.getpostman.com Our good friends [Mustache](http://mustache.dk/) has created an iOS app using Beacon Bacon, and put it on GitHub. It's not a SDK, but it's a very good start. Find it [here](https://github.com/mustachedk/beacon-bacon-ios). +## Findables custom plug-ins + +For people interested in integrating 3rd party services or rearranging data internally, Beacon Bacon comes with an extendable structure. When a user creates a Findable the user has the option of uploading a .php-file as well. This .php-file has to follow a very strict structure in order to function. However, if the core structure has been implemented, the possibilities are endless. The major structure rules are as follow: + +* The Namespace MUST be namespace BB\{YOURNAME}Plugin +* The class HAS to {YOURNAME}Plugin +* One public function called Findable() +* The public function has to return an array or a json object +* The rest is up to you. + +An example of such a file can be found in storage/app/files/findables/TestPlugin.php. Whenever **place/{{id}}/find** is called with a payload corresponding to the Identifier chosen when creating the Findable, the new functionality will be invoked. + ## Security Vulnerabilities If you discover a security vulnerability within Beacon Bacon, please send an e-mail to us at webmaster@nosuchagency.dk. All security vulnerabilities will be promptly addressed. diff --git a/app/Block.php b/app/Block.php index 3edec07..28e6efe 100644 --- a/app/Block.php +++ b/app/Block.php @@ -41,15 +41,23 @@ class Block extends Model protected static $logAttributes = ['name', 'image']; /** - * Return full path to image. + * Return full virtual path to icon. * - * @param string $value + * @return string + */ + public function getVirtualIconPath() + { + return !$this->image ? '' : url('/blocks/' . $this->id . '/image'); + } + + /** + * Return full physical path to icon. * * @return string */ - public function getImageAttribute($value) + public function getPhysicalIconPath() { - return !$value ? '' : asset('uploads/blocks/'.$this->id.'/'.$value); + return !$this->image ? '' : storage_path() . '/app/images/blocks/' . $this->id . '/' . $this->image; } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 5b532c1..1b2ccd8 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -113,15 +113,15 @@ protected function renderExceptionWithWhoops($request, Exception $e) * Convert an authentication exception into an unauthenticated response. * * @param \Illuminate\Http\Request $request - * @param \Illuminate\Auth\AuthenticationException $e - * @return \Symfony\Component\HttpFoundation\Response + * @param \Illuminate\Auth\AuthenticationException $exception + * @return \Illuminate\Http\Response */ - protected function unauthenticated($request, AuthenticationException $e) + protected function unauthenticated($request, AuthenticationException $exception) { - if ($request->ajax() || $request->wantsJson()) { - return response(['error' => 'Unauthorized.'], 401); - } else { - return redirect()->guest('login'); + if ($request->expectsJson()) { + return response()->json(['error' => 'Unauthenticated.'], 401); } + + return redirect()->guest('login'); } } diff --git a/app/Findable.php b/app/Findable.php index 4cb91de..902f184 100644 --- a/app/Findable.php +++ b/app/Findable.php @@ -17,7 +17,7 @@ class Findable extends Model * * @var array */ - protected $fillable = ['name', 'identifier', 'parameter_one_name', 'parameter_two_name', 'parameter_three_name', 'parameter_four_name', 'parameter_five_name']; + protected $fillable = ['name', 'identifier', 'parameter_one_name', 'parameter_two_name', 'parameter_three_name', 'parameter_four_name', 'parameter_five_name', 'custom_file', 'type']; /** * The attributes that should be mutated to dates. diff --git a/app/Floor.php b/app/Floor.php index 0264d53..3f26d99 100644 --- a/app/Floor.php +++ b/app/Floor.php @@ -67,9 +67,29 @@ public function locations() * * @return string */ - public function getImageAttribute($value) + public function getPublicImage() { - return !$value ? '' : asset('uploads/floors/'.$this->id.'/'.$value); + return !$this->image ? '' : asset('storage/images/floors/' . $this->id . '/' . $this->image); + } + + /** + * Return full virtual path to icon. + * + * @return string + */ + public function getVirtualIconPath() + { + return !$this->image ? '' : url('/floors/' . $this->id . '/image'); + } + + /** + * Return full physical path to icon. + * + * @return string + */ + public function getPhysicalIconPath() + { + return !$this->image ? '' : storage_path() . '/app/images/floors/' . $this->id . '/' . $this->image; } /** diff --git a/app/Http/Controllers/API/V1/BeaconController.php b/app/Http/Controllers/API/V1/BeaconController.php index 6269657..80dcfd4 100644 --- a/app/Http/Controllers/API/V1/BeaconController.php +++ b/app/Http/Controllers/API/V1/BeaconController.php @@ -45,9 +45,9 @@ public function store(Request $request) */ public function show(Request $request, $id) { - $place = Beacon::findOrFail($id); + $beacon = Beacon::findOrFail($id); - return $this->attachResources($request, $place); + return $this->attachResources($request, $beacon); } /** @@ -61,13 +61,14 @@ public function show(Request $request, $id) public function update(Request $request, $id) { $this->validate($request, [ - 'name' => 'max:255', + 'name' => 'required|max:255', ]); - $model = Beacon::findOrFail($id); - $model->update($request->all()); + $beacon = Beacon::findOrFail($id); + + $beacon->update($request->all()); - return $model; + return $beacon; } /** @@ -79,7 +80,7 @@ public function update(Request $request, $id) */ public function destroy($id) { - Beacon::findOrFail($id)->delete(); + $beacon = Beacon::findOrFail($id)->delete(); return response('', 204); } diff --git a/app/Http/Controllers/API/V1/FloorController.php b/app/Http/Controllers/API/V1/FloorController.php index 590e08f..8c5e418 100644 --- a/app/Http/Controllers/API/V1/FloorController.php +++ b/app/Http/Controllers/API/V1/FloorController.php @@ -16,7 +16,18 @@ class FloorController extends Controller */ public function index(Request $request) { - return $this->filteredAndOrdered($request, new Floor())->paginate($this->pageSize); + + $floors = $this->filteredAndOrdered($request, new Floor())->paginate($this->pageSize); + + foreach ($floors->items() as $floor) { + if ($floor->image) { + $floor->image = $floor->getPublicImage(); + } else { + $floor->image = null; + } + } + + return $floors; } /** @@ -46,9 +57,11 @@ public function store(Request $request) */ public function show(Request $request, $id) { - $place = Floor::findOrFail($id); + $floor = Floor::findOrFail($id); + + $floor->image = $floor->getPublicImage(); - return $this->attachResources($request, $place); + return $this->attachResources($request, $floor); } /** @@ -62,14 +75,15 @@ public function show(Request $request, $id) public function update(Request $request, $id) { $this->validate($request, [ - 'name' => 'max:255', - 'image' => 'image', + 'name' => 'required|max:255', + 'image' => 'required|image', ]); - $model = Floor::findOrFail($id); - $model->update($request->all()); + $floor = Floor::findOrFail($id); + + $floor->update($request->all()); - return $model; + return $floor; } /** @@ -81,7 +95,7 @@ public function update(Request $request, $id) */ public function destroy($id) { - Floor::findOrFail($id)->delete(); + $floor = Floor::findOrFail($id)->delete(); return response('', 204); } diff --git a/app/Http/Controllers/API/V1/LocationController.php b/app/Http/Controllers/API/V1/LocationController.php index d0ef4c8..8eab3a3 100644 --- a/app/Http/Controllers/API/V1/LocationController.php +++ b/app/Http/Controllers/API/V1/LocationController.php @@ -45,9 +45,9 @@ public function store(Request $request) */ public function show(Request $request, $id) { - $place = Location::findOrFail($id); + $location = Location::findOrFail($id); - return $this->attachResources($request, $place); + return $this->attachResources($request, $location); } /** @@ -61,13 +61,14 @@ public function show(Request $request, $id) public function update(Request $request, $id) { $this->validate($request, [ - 'name' => 'max:255', + 'name' => 'required|max:255', ]); - $model = Location::findOrFail($id); - $model->update($request->all()); + $location = Location::findOrFail($id); + + $location->update($request->all()); - return $model; + return $location; } /** @@ -79,7 +80,7 @@ public function update(Request $request, $id) */ public function destroy($id) { - Location::findOrFail($id)->delete(); + $location = Location::findOrFail($id)->delete(); return response('', 204); } diff --git a/app/Http/Controllers/API/V1/PlaceController.php b/app/Http/Controllers/API/V1/PlaceController.php index a835fcc..9bc1783 100644 --- a/app/Http/Controllers/API/V1/PlaceController.php +++ b/app/Http/Controllers/API/V1/PlaceController.php @@ -21,8 +21,15 @@ class PlaceController extends Controller */ public function index(Request $request) { - $request->request->add(array('activated' => 1)); - return $this->filteredAndOrdered($request, new Place())->paginate($this->pageSize); + $request->request->add(['activated' => 1]); + + $places = $this->filteredAndOrdered($request, new Place())->paginate($this->pageSize); + + foreach($places as $place) { + $place->identifier = $place->identifier_one; + } + + return $places; } /** @@ -35,7 +42,7 @@ public function index(Request $request) public function store(Request $request) { $this->validate($request, [ - 'name' => 'required|max:255', + 'name' => 'required|max:255', ]); return response(Place::create($request->all()), 201); @@ -45,57 +52,45 @@ public function store(Request $request) * Return a findable Location * * @param Request $request - * @param int $id + * @param int $id * * @return json */ public function find(Request $request, $id) { $response = new \stdClass(); - $identifier = $request->find_identifier; - - if ( empty( $identifier ) ) { - $response->status = 'Not Found'; - $response->data = []; - - return response()->json( $response ); - } - - $findable = Findable::where( 'identifier', $identifier )->first(); - - if ( empty( $findable ) ) { - $response->status = 'Not Found'; - $response->data = []; - - return response()->json( $response ); - } + $identifier = $request->find_identifier; - $place = Place::findOrFail($id); + if (empty($identifier)) { + $response->status = 'Not Found'; + $response->data = []; - if ( empty( $place ) ) { - $response->status = 'Not Found'; - $response->data = []; + return response()->json($response); + } + $findable = Findable::where('identifier', $identifier)->first(); - return response()->json( $response ); - } + if (empty($findable)) { + $response->status = 'Not Found'; + $response->data = []; + return response()->json($response); + } + $place = Place::findOrFail($id); - return $this->{'findable' . $identifier}( $place, $findable, $request ); + return $this->{'findable' . $identifier}($place, $findable, $request); } - private function findableIMS ( $place, $findable, Request $request ) { - + private function findableIMS($place, $findable, Request $request) + { $response = new \stdClass(); - - - if ( empty( $request->data['Faust'] ) ) { - $response->status = 'Not Found'; - $response->data = []; - - return response()->json( $response ); + + if (empty($request->data['Faust'])) { + $response->status = 'Not Found'; + $response->data = []; + + return response()->json($response); } - - $faust = $request->data['Faust']; + $faust = $request->data['Faust']; SoapWrapper::add(function ($service) { $service ->name('imssecurity') @@ -103,90 +98,88 @@ private function findableIMS ( $place, $findable, Request $request ) { ->trace(true) ->cache(WSDL_CACHE_NONE); }); - $payload = [ 'Username' => config('services.ims.username'), 'Password' => config('services.ims.password'), 'ClientInfo' => config('services.ims.client'), ]; - - $ims_response = ''; + + $ims_response = ''; SoapWrapper::service('imssecurity', function ($service) use ($payload, &$ims_response) { - $ims_response = $service->call('Login', [$payload]); + $ims_response = $service->call('Login', [$payload]); }); + $token = $ims_response->Token; - $token = $ims_response->Token; - SoapWrapper::add(function ($service) { $service ->name('imsquery') ->wsdl('https://ims.lyngsoesystems.com/kkb/ImsWs/soap/Query?wsdl') ->trace(true) ->cache(WSDL_CACHE_NONE); - }); - - $request = (object) $request->json()->all(); - $locations = Location::where( 'findable_id', $findable->id )->lists('parameter_one', 'id'); - - $ims_locations = []; - foreach( $locations as $id => $parameter_one ) { - $ims_locations[$id] = $parameter_one; - } + }); + + $request = (object)$request->json()->all(); + $locations = Location::where('findable_id', $findable->id)->pluck('parameter_one', 'id'); + $ims_locations = []; + foreach ($locations as $id => $parameter_one) { + $ims_locations[$id] = $parameter_one; + } $payload = [ 'Token' => $token, 'BibliographicRecordId' => $faust, 'IlsStatusKey' => 0, 'Excluded' => false, ]; - - $ims_response = ''; + + $ims_response = ''; SoapWrapper::service('imsquery', function ($service) use ($payload, &$ims_response) { - $ims_response = $service->call('FindItems', [$payload]); + $ims_response = $service->call('FindItems', [$payload]); }); + if (empty($ims_response->Items)) { + $response->status = 'Not Found'; + $response->data = []; - if ( empty( $ims_response->Items ) ) { - $response->status = 'Not Found'; - $response->data = []; - - return response()->json( $response ); + return response()->json($response); } - $ims_found_location = 0; - foreach( $ims_response->Items as $item ) { - if ( ! empty( $item->ShortPlacementText ) && in_array( $item->ShortPlacementText, $ims_locations ) ) { - $ims_found_location = array_search( $item->ShortPlacementText, $ims_locations ); - } - } - - if ( empty( $ims_found_location ) ) { - $response->status = 'Not Found'; - $response->data = []; - - return response()->json( $response ); + foreach ($ims_response->Items as $item) { + if (!empty($item->PlacementInfo->ShortPlacementText) && in_array($item->PlacementInfo->ShortPlacementText, $ims_locations)) { + $ims_found_location = array_search($item->PlacementInfo->ShortPlacementText, $ims_locations); + } + } + if (empty($ims_found_location)) { + $response->status = 'Not Found'; + $response->data = []; + + return response()->json($response); } - - $location = Location::findOrFail( $ims_found_location ); + + $location = Location::findOrFail($ims_found_location); $response->status = 'Found'; $response->data = new \stdClass(); - $response->data->floor = new \stdClass(); $response->data->floor->id = $location->floor_id; $response->data->location = new \stdClass(); $response->data->location->id = $location->id; - $response->data->location->posX = $location->posX; - $response->data->location->posY = $location->posY; - return response()->json( $response ); - } + if(!empty($location->area) && size_of(explode(',', $location->area)) > 0) { + $response->data->location->area = $location->area; + } else { + $response->data->location->posX = $location->posX; + $response->data->location->posY = $location->posY; + } + + return response()->json($response); + } /** * Return a single item. * * @param Request $request - * @param int $id + * @param int $id * * @return json */ @@ -194,39 +187,51 @@ public function show(Request $request, $id) { $place = Place::findOrFail($id); - $place = $this->attachResources($request, $place); - foreach( $place->floors as $floor ) { - foreach( $floor->locations as $location ) { - if ( $location->poi_id > 0 ) { - $poi = Poi::findOrFail( $location->poi_id ); - $location->poi = $poi; - } else { - $location->poi = null; - } - } - } - - return $place; + $place = $this->attachResources($request, $place); + $place->identifier = $place->identifier_one; + foreach ($place->floors as $floor) { + + $floor->image = $floor->getPublicImage(); + + foreach ($floor->locations as $location) { + if ($location->poi_id > 0) { + + $poi = Poi::find($location->poi_id); + + if (!$poi) { + continue; + } + + $poi->icon = $poi->getPublicImage(); + $location->poi = $poi; + } else { + $location->poi = null; + } + } + } + + return $place; } /** * Update a single item. * * @param Request $request - * @param int $id + * @param int $id * * @return json */ public function update(Request $request, $id) { $this->validate($request, [ - 'name' => 'max:255', + 'name' => 'required|max:255', ]); - $model = Place::findOrFail($id); - $model->update($request->all()); + $place = Place::findOrFail($id); + + $place->update($request->all()); - return $model; + return $place; } /** @@ -238,7 +243,7 @@ public function update(Request $request, $id) */ public function destroy($id) { - Place::findOrFail($id)->delete(); + $place = Place::findOrFail($id)->delete(); return response('', 204); } @@ -262,7 +267,15 @@ public function deleted() */ public function menu($id) { - return Menu::where('place_id', $id)->orderBy('order')->with('poi')->get(); + $menus = Menu::where('place_id', $id)->orderBy('order')->with('poi')->get(); + + foreach($menus as $menu ) { + if($menu->poi) { + $menu->poi->icon = $menu->poi->getPublicImage(); + } + } + + return $menus; } } diff --git a/app/Http/Controllers/API/V1/PoiController.php b/app/Http/Controllers/API/V1/PoiController.php index 6baee7a..7e38f2b 100644 --- a/app/Http/Controllers/API/V1/PoiController.php +++ b/app/Http/Controllers/API/V1/PoiController.php @@ -16,7 +16,17 @@ class PoiController extends Controller */ public function index(Request $request) { - return $this->filteredAndOrdered($request, new Poi())->paginate($this->pageSize); + $pois = $this->filteredAndOrdered($request, new Poi())->paginate($this->pageSize); + + foreach ($pois->items() as $poi) { + if ($poi->icon) { + $poi->icon = $poi->getPublicImage(); + } else { + $poi->icon = null; + } + } + + return $pois; } @@ -50,6 +60,8 @@ public function show(Request $request, $id) { $poi = Poi::findOrFail($id); + $poi->icon = $poi->getPublicImage(); + return $this->attachResources($request, $poi); } @@ -64,15 +76,16 @@ public function show(Request $request, $id) public function update(Request $request, $id) { $this->validate($request, [ - 'name' => 'max:255', - 'internal_name' => 'max:255', - 'icon' => 'image', + 'name' => 'required|max:255', + 'internal_name' => 'required|max:255', + 'icon' => 'required|image', ]); - $model = Poi::findOrFail($id); - $model->update($request->all()); + $poi = Poi::findOrFail($id); + + $poi->update($request->all()); - return $model; + return $poi; } /** @@ -84,7 +97,7 @@ public function update(Request $request, $id) */ public function destroy($id) { - Poi::findOrFail($id)->delete(); + $poi = Poi::findOrFail($id)->delete(); return response('', 204); } diff --git a/app/Http/Controllers/API/V2/BeaconController.php b/app/Http/Controllers/API/V2/BeaconController.php new file mode 100644 index 0000000..baebd64 --- /dev/null +++ b/app/Http/Controllers/API/V2/BeaconController.php @@ -0,0 +1,97 @@ +filteredAndOrdered($request, new Beacon())->paginate($this->pageSize); + } + + /** + * Save a new item. + * + * @param Request $request + * + * @return json + */ + public function store(Request $request) + { + $this->validate($request, [ + 'name' => 'required|max:255', + ]); + + return response(Beacon::create($request->all()), 201); + } + + /** + * Return a single item. + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function show(Request $request, $id) + { + $beacon = Beacon::findOrFail($id); + + return $this->attachResources($request, $beacon); + } + + /** + * Update a single item. + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function update(Request $request, $id) + { + $this->validate($request, [ + 'name' => 'required|max:255', + ]); + + $beacon = Beacon::findOrFail($id); + + $beacon->update($request->all()); + + return $beacon; + } + + /** + * Delete a single item. + * + * @param int $id + * + * @return empty + */ + public function destroy($id) + { + $beacon = Beacon::findOrFail($id)->delete(); + + return response('', 204); + } + + /** + * Return a list of deleted items. + * + * @return json + */ + public function deleted() + { + return Beacon::onlyTrashed()->get(); + } +} diff --git a/app/Http/Controllers/API/V2/Controller.php b/app/Http/Controllers/API/V2/Controller.php new file mode 100644 index 0000000..d16a95b --- /dev/null +++ b/app/Http/Controllers/API/V2/Controller.php @@ -0,0 +1,116 @@ +pageSize = $request->has('per_page') ? $request->input('per_page') : $request->input('size', 20); + + if (!$request->has('page') && $request->has('offset')) { + // if no "page" parameter is set, but we have an "offset" parameter, + // calculate and set a "page" parameter, since the paginator expects it + $offset = $request->input('offset', 0); + $request->offsetSet('page', floor(($offset / $this->pageSize) + 1)); + } + } + + /** + * Get filtered and ordered results. + * Only fillable fields are used in filters. + * Order can be prefixed with "-" for descending order. + * + * @see https://laravel.com/docs/5.2/queries + * + * @param Request $request + * @param Model $model + * + * @return Builder + */ + protected function filteredAndOrdered(Request $request, Model $model) + { + $fillable = $model->getFillable(); + $query = $model->newQuery(); + + foreach ($request->all() as $key => $value) { + // skip filter if not in fillable fields + if (!in_array($key, $fillable)) { + continue; + } + + $query->where($key, $value); + } + + if ($request->q) { + // search all fillable fields for the search query + $query->where(function (Builder $query) use ($request, $fillable) { + foreach ($fillable as $field) { + $query->orWhere($field, 'LIKE', '%'.$request->q.'%'); + } + }); + } + + if ($request->order) { + // multiple orderBys are possible with a comma separated string + $order = explode(',', $request->order); + + foreach ($order as $orderby) { + $hasPrefix = in_array(substr($orderby, 0, 1), ['-', '+']); + + // if key is preceed by a minus, then the order is descending + $direction = substr($orderby, 0, 1) == '-' ? 'DESC' : 'ASC'; + + // remove order prefixes + $orderby = $hasPrefix ? substr($orderby, 1) : $orderby; + + $query->orderBy($orderby, $direction); + } + } + + return $query; + } + + /** + * Support embedded resources. Also support nested resources. + * + * @see https://laravel.com/docs/5.2/eloquent-relationships#eager-loading + * + * @param Request $request + * @param Model $model + * + * @return Model + */ + public function attachResources(Request $request, Model $model) + { + if (!$request->has('embed')) { + return $model; + } + + foreach (explode(',', $request->embed) as $resource) { + $model->load($resource); + } + + return $model; + } +} diff --git a/app/Http/Controllers/API/V2/FloorController.php b/app/Http/Controllers/API/V2/FloorController.php new file mode 100644 index 0000000..9d0deca --- /dev/null +++ b/app/Http/Controllers/API/V2/FloorController.php @@ -0,0 +1,156 @@ +filteredAndOrdered($request, new Floor())->paginate($this->pageSize); + + foreach ($floors->items() as $floor) { + if ($floor->image) { + $floor->image = url('api/v2/floors/' . $floor->id . '/image'); + } else { + $floor->image = null; + } + } + + return $floors; + } + + /** + * Save a new item. + * + * @param Request $request + * + * @return json + */ + public function store(Request $request) + { + $this->validate($request, [ + 'name' => 'required|max:255', + 'map_height_in_centimeters' => 'required|numeric', + 'map_width_in_centimeters' => 'required|numeric', + 'image' => 'required|imageable', + ]); + + $floor = Floor::create($request->except('image')); + + $this->uploadFloor($floor, $request); + + return response($floor, 201); + } + + /** + * Return a single item. + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function show(Request $request, $id) + { + $floor = Floor::findOrFail($id); + + $floor->image = url('api/v2/floors/' . $floor->id . '/image'); + + return $this->attachResources($request, $floor); + } + + /** + * Update a single item. + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function update(Request $request, $id) + { + $this->validate($request, [ + 'name' => 'required|max:255', + 'map_height_in_centimeters' => 'required|numeric', + 'map_width_in_centimeters' => 'required|numeric', + 'image' => 'required|imageable', + ]); + + $floor = Floor::findOrFail($id); + + $floor->update($request->except('image')); + + $this->uploadFloor($floor, $request); + + return $floor; + } + + /** + * Delete a single item. + * + * @param int $id + * + * @return empty + */ + public function destroy($id) + { + $floor = Floor::findOrFail($id)->delete(); + + return response('', 204); + } + + /** + * Return a list of deleted items. + * + * @return json + */ + public function deleted() + { + return Floor::onlyTrashed()->get(); + } + + protected function uploadFloor(Floor $floor, Request $request) + { + $destinationPath = storage_path() . '/app/images/floors/' . $floor->id; + + if(!File::exists($destinationPath)) { + File::makeDirectory($destinationPath); + } + + $image = Image::make($request->image); + + $fileName = md5($request->image) . '.' . substr($image->mime, strpos($image->mime, "/") + 1); + + $file = storage_path() . '/app/images/floors/' . $floor->id . '/' . $fileName; + + $image->save($file); + + if ($floor->image && is_file($destinationPath . '/' . $floor->image)) { + unlink($destinationPath . '/' . $floor->image); + } + + $image = Image::make($destinationPath . '/' . $fileName); + $image->save($destinationPath . '/original-' . $fileName); + $map_pixel_to_centimeter_ratio = round($image->width() / $floor->map_width_in_centimeters, 2); + + $floor->update([ + 'image' => $fileName, + 'map_height_in_pixels' => $image->height(), + 'map_width_in_pixels' => $image->width(), + 'map_pixel_to_centimeter_ratio' => $map_pixel_to_centimeter_ratio + ]); + } +} diff --git a/app/Http/Controllers/API/V2/LocationController.php b/app/Http/Controllers/API/V2/LocationController.php new file mode 100644 index 0000000..893c60a --- /dev/null +++ b/app/Http/Controllers/API/V2/LocationController.php @@ -0,0 +1,97 @@ +filteredAndOrdered($request, new Location())->paginate($this->pageSize); + } + + /** + * Save a new item. + * + * @param Request $request + * + * @return json + */ + public function store(Request $request) + { + $this->validate($request, [ + 'name' => 'required|max:255', + ]); + + return response(Location::create($request->all()), 201); + } + + /** + * Return a single item. + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function show(Request $request, $id) + { + $location = Location::findOrFail($id); + + return $this->attachResources($request, $location); + } + + /** + * Update a single item. + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function update(Request $request, $id) + { + $this->validate($request, [ + 'name' => 'required|max:255', + ]); + + $location = Location::findOrFail($id); + + $location->update($request->all()); + + return $location; + } + + /** + * Delete a single item. + * + * @param int $id + * + * @return empty + */ + public function destroy($id) + { + $location = Location::findOrFail($id)->delete(); + + return response('', 204); + } + + /** + * Return a list of deleted items. + * + * @return json + */ + public function deleted() + { + return Location::onlyTrashed()->get(); + } +} diff --git a/app/Http/Controllers/API/V2/MediaController.php b/app/Http/Controllers/API/V2/MediaController.php new file mode 100644 index 0000000..4eb6006 --- /dev/null +++ b/app/Http/Controllers/API/V2/MediaController.php @@ -0,0 +1,53 @@ +id . '/' . $poi->icon; + + if (!File::exists($path)) { + return response(['message' => 'Resource not found',], 404); + } + + return response()->file($path); + } + + /** + * Get the specified image resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function image($id) + { + $floor = Floor::findOrFail($id); + + $path = storage_path() . '/app/images/floors/' . $floor->id . '/' . $floor->image; + + if (!File::exists($path)) { + return response(['message' => 'Resource not found',], 404); + } + + return response()->file($path); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/API/V2/PlaceController.php b/app/Http/Controllers/API/V2/PlaceController.php new file mode 100644 index 0000000..284cd48 --- /dev/null +++ b/app/Http/Controllers/API/V2/PlaceController.php @@ -0,0 +1,183 @@ +request->add(array('activated' => 1)); + return $this->filteredAndOrdered($request, new Place())->paginate($this->pageSize); + } + + /** + * Save a new item. + * + * @param Request $request + * + * @return json + */ + public function store(Request $request) + { + $this->validate($request, [ + 'name' => 'required|max:255', + ]); + + return response(Place::create($request->all()), 201); + } + + /** + * Return a findable Location + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function find(Request $request, $id) + { + $identifier = $request->find_identifier; + if (empty($identifier)) { + return response(['message' => 'missing parameter', 'parameter' => 'identifier'], 400); + } + $findable = Findable::where('identifier', $identifier)->first(); + if (empty($findable)) { + return response(['message' => 'resource not found', 'resource' => 'findable'], 404); + } + + $place = Place::findOrFail($id); + + $class = "BB\\" . $identifier . "Plugin\\" . $identifier . "Plugin"; + if (!class_exists($class)) { + return response(['message' => 'resource not found', 'resource' => 'class'], 404); + } + $plugin = new $class; + if (!method_exists($plugin, 'findable' . $identifier)) { + return response(['message' => 'resource not found', 'resource' => 'method'], 404); + } + + return $plugin->{'findable' . $identifier}($place, $findable, $request); + } + + /** + * Return a single item. + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function show(Request $request, $id) + { + $place = Place::findOrFail($id); + + $place = $this->attachResources($request, $place); + foreach ($place->floors as $floor) { + + $floor->image = url('api/v2/floors/' . $floor->id . '/image'); + + foreach ($floor->locations as $location) { + if ($location->poi_id > 0) { + $poi = Poi::find($location->poi_id); + + if (!$poi) { + continue; + } + + $poi->icon = url('api/v2/pois/' . $poi->id . '/icon'); + $location->poi = $poi; + } else { + $location->poi = null; + } + } + + } + + return $place; + } + + /** + * Update a single item. + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function update(Request $request, $id) + { + $this->validate($request, [ + 'name' => 'required|max:255', + ]); + + $place = Place::findOrFail($id); + + $place->update($request->all()); + + return $place; + } + + /** + * Delete a single item. + * + * @param int $id + * + * @return empty + */ + public function destroy($id) + { + $place = Place::findOrFail($id)->delete(); + + return response('', 204); + } + + /** + * Return a list of deleted items. + * + * @return json + */ + public function deleted() + { + return Place::onlyTrashed()->get(); + } + + /** + * Get menu items. + * + * @param int $id + * + * @return json + */ + public function menu($id) + { + $menus = Menu::where('place_id', $id)->orderBy('order')->with('poi')->get(); + + foreach($menus as $menu ) { + if(!empty($menu->poi) && !empty($menu->poi->icon)) { + $menu->poi->icon = url('api/v2/pois/' . $menu->poi->id . '/icon'); + } + } + + return $menus; + } + +} diff --git a/app/Http/Controllers/API/V2/PoiController.php b/app/Http/Controllers/API/V2/PoiController.php new file mode 100644 index 0000000..d25ba5e --- /dev/null +++ b/app/Http/Controllers/API/V2/PoiController.php @@ -0,0 +1,153 @@ +filteredAndOrdered($request, new Poi())->paginate($this->pageSize); + + foreach ($pois->items() as $poi) { + if ($poi->icon) { + $poi->icon = url('api/v2/pois/' . $poi->id . '/icon'); + } else { + $poi->icon = null; + } + } + + return $pois; + } + + + /** + * Save a new item. + * + * @param Request $request + * + * @return json + */ + public function store(Request $request) + { + $this->validate($request, [ + 'name' => 'required|max:255', + 'internal_name' => 'required|max:255', + 'icon' => 'required|imageable', + ]); + + $poi = Poi::create($request->except('icon')); + + $this->uploadIcon($poi, $request); + + $poi->icon = url('api/v2/pois/' . $poi->id . '/icon'); + + return response($poi, 201); + } + + /** + * Return a single item. + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function show(Request $request, $id) + { + $poi = Poi::findOrFail($id); + + $poi->icon = url('api/v2/pois/' . $poi->id . '/icon'); + + return $this->attachResources($request, $poi); + } + + /** + * Update a single item. + * + * @param Request $request + * @param int $id + * + * @return json + */ + public function update(Request $request, $id) + { + $this->validate($request, [ + 'name' => 'required|max:255', + 'internal_name' => 'required|max:255', + 'icon' => 'required|imageable', + ]); + + $poi = Poi::findOrFail($id); + + $poi->update($request->except('icon')); + + $this->uploadIcon($poi, $request); + + $poi->icon = url('api/v2/pois/' . $poi->id . '/icon'); + + return $poi; + } + + /** + * Delete a single item. + * + * @param int $id + * + * @return empty + */ + public function destroy($id) + { + $poi = Poi::findOrFail($id)->delete(); + + return response('', 204); + } + + /** + * Return a list of deleted items. + * + * @return json + */ + public function deleted() + { + $pois = Poi::onlyTrashed()->get(); + + return $pois; + } + + protected function uploadIcon(Poi $poi, Request $request) + { + $destinationPath = storage_path() . '/app/images/pois/' . $poi->id; + + if (!File::exists($destinationPath)) { + File::makeDirectory($destinationPath); + } + + $image = Image::make($request->icon); + + $fileName = md5($request->icon . str_random(40)) . '.' . substr($image->mime, strpos($image->mime, "/") + 1); + + $file = storage_path() . '/app/images/pois/' . $poi->id . '/' . $fileName; + + $image->save($file); + + if ($poi->icon && is_file($destinationPath . '/' . $poi->icon)) { + unlink($destinationPath . '/' . $poi->icon); + } + + $poi->update([ + 'icon' => $fileName + ]); + } +} diff --git a/app/Http/Controllers/API/V2/ProfileController.php b/app/Http/Controllers/API/V2/ProfileController.php new file mode 100644 index 0000000..b8dc307 --- /dev/null +++ b/app/Http/Controllers/API/V2/ProfileController.php @@ -0,0 +1,37 @@ +guard('api')->user(); + } + + /** + * Update info of logged in user. + * + * @param Request $request + * + * @return User + */ + public function update(Request $request) + { + $user = auth()->guard('api')->user(); + $user->update($request->only(['name', 'email'])); + + return $user; + } +} diff --git a/app/Http/Controllers/ApiController.php b/app/Http/Controllers/ApiController.php index fa70718..234899b 100644 --- a/app/Http/Controllers/ApiController.php +++ b/app/Http/Controllers/ApiController.php @@ -14,7 +14,7 @@ class ApiController extends Controller public function index() { $keys = ApiKey::all(); - $users = auth()->user()->currentTeam->users()->orderBy('name')->lists('name', 'id'); + $users = auth()->user()->currentTeam->users()->orderBy('name')->pluck('name', 'id'); return view('apikeys.index', compact('keys', 'users')); } diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php new file mode 100644 index 0000000..6a247fe --- /dev/null +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -0,0 +1,32 @@ +middleware('guest'); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php new file mode 100644 index 0000000..56fffee --- /dev/null +++ b/app/Http/Controllers/Auth/LoginController.php @@ -0,0 +1,61 @@ +middleware('guest', ['except' => 'logout']); + } + + /** + * Show the application's login form. + * + * @return \Illuminate\Http\Response + */ + public function showLoginForm() + { + $teamCount = Team::count(); + + $teamLimit = env('TEAM_LIMIT') ? env('TEAM_LIMIT') : 1; + + $allowTeam = true; + + if($teamCount >= $teamLimit) { + $allowTeam = false; + } + + return view('auth.login', ['allowTeam' => $allowTeam]); + } +} diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/RegisterController.php similarity index 63% rename from app/Http/Controllers/Auth/AuthController.php rename to app/Http/Controllers/Auth/RegisterController.php index bcffe33..d598584 100644 --- a/app/Http/Controllers/Auth/AuthController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -2,45 +2,60 @@ namespace App\Http\Controllers\Auth; + use Auth; use App\Team; use App\User; +use Illuminate\Auth\GuardHelpers; use Validator; -use Illuminate\Http\Request; use App\Http\Controllers\Controller; -use Illuminate\Foundation\Auth\ThrottlesLogins; -use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; +use Illuminate\Http\Request; +use Illuminate\Foundation\Auth\RegistersUsers; -class AuthController extends Controller +class RegisterController extends Controller { /* |-------------------------------------------------------------------------- - | Registration & Login Controller + | Register Controller |-------------------------------------------------------------------------- | - | This controller handles the registration of new users, as well as the - | authentication of existing users. By default, this controller uses - | a simple trait to add these behaviors. Why don't you explore it? + | This controller handles the registration of new users as well as their + | validation and creation. By default this controller uses a trait to + | provide this functionality without requiring any additional code. | */ - use AuthenticatesAndRegistersUsers, ThrottlesLogins; + use RegistersUsers; /** - * Where to redirect users after login / registration. + * Where to redirect users after registration. * * @var string */ protected $redirectTo = '/'; /** - * Create a new authentication controller instance. + * Show the application registration form. + * + * @return \Illuminate\Http\Response + */ + public function showRegistrationForm(Request $request) + { + if($this->isTeamLimitReached() && !$request->session()->has('invite_token')) { + return view('auth.full'); + } + + return view('auth.register'); + } + + /** + * Create a new controller instance. * * @return void */ public function __construct() { - $this->middleware($this->guestMiddleware(), ['except' => 'logout']); + $this->middleware('guest'); } /** @@ -54,8 +69,7 @@ protected function validator(array $data) return Validator::make($data, [ 'name' => 'required|max:255', 'email' => 'required|email|max:255|unique:users', - 'password' => 'required|confirmed|min:6', - 'terms' => 'required', + 'password' => 'required|min:6|confirmed', ]); } @@ -90,6 +104,10 @@ public function register(Request $request) ); } + if($this->isTeamLimitReached() && !$request->session()->has('invite_token')) { + return view('auth.full'); + } + $user = $this->create($request->all()); // If user was not invited, create and join a new team @@ -106,8 +124,16 @@ public function register(Request $request) } // Log the user in - Auth::guard($this->getGuard())->login($user); + + $this->guard()->login($user); return redirect($this->redirectPath()); } + + private function isTeamLimitReached() { + $teamLimit = env('TEAM_LIMIT') ? env('TEAM_LIMIT') : 1; + + return (Team::count() >= $teamLimit); + } + } diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php similarity index 72% rename from app/Http/Controllers/Auth/PasswordController.php rename to app/Http/Controllers/Auth/ResetPasswordController.php index 90c2a82..2c863aa 100644 --- a/app/Http/Controllers/Auth/PasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -5,7 +5,7 @@ use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ResetsPasswords; -class PasswordController extends Controller +class ResetPasswordController extends Controller { /* |-------------------------------------------------------------------------- @@ -21,13 +21,19 @@ class PasswordController extends Controller use ResetsPasswords; /** - * Create a new password controller instance. + * Where to redirect users after resetting their password. + * + * @var string + */ + protected $redirectTo = '/'; + + /** + * Create a new controller instance. * * @return void */ public function __construct() { - $this->middleware($this->guestMiddleware()); - $this->subject = config('mail.templates.reset.subject'); + $this->middleware('guest'); } } diff --git a/app/Http/Controllers/BeaconController.php b/app/Http/Controllers/BeaconController.php index 0e0cdbb..d0f287b 100644 --- a/app/Http/Controllers/BeaconController.php +++ b/app/Http/Controllers/BeaconController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Floor; +use App\Jobs\ImportBeaconsJob; use App\Place; use App\Beacon; use App\Setting; @@ -40,11 +41,12 @@ public function index() */ public function import() { - $services = array( - '' => 'Select Service' , - 'kontakt.io' => 'Kontakt.io', - 'estimote' => 'estimote', - ); + $services = array( + '' => 'Select Service', + 'kontakt.io' => 'Kontakt.io', + 'estimote' => 'estimote', + 'test' => 'test' + ); return view('beacons.import', compact('services')); } @@ -64,25 +66,12 @@ public function importing(Request $request) $setting = Setting::firstOrCreate(['key' => str_replace('-', '.', $key)]); $setting->update(['value' => $value]); } - - $devices = $this->getBeaconsFromWebservice(); - foreach( $devices as $device ) { - $beacon = Beacon::where( 'beacon_uid', '=', $device )->first(); - - if( empty( $beacon ) ) { - $device = $this->getBeaconFromWebservice($device); - - $beacon = Beacon::create([ - 'name' => $device->uniqueId, - 'beacon_uid' => $device->uniqueId, - 'proximity_uuid' => $device->proximity, - 'minor' => $device->minor, - 'major' => $device->major, - ]); - } - } - - return redirect()->route('beacons.import'); + + $service = $filtered->get('beacon-import-service'); + + dispatch(new ImportBeaconsJob($service)); + + return redirect()->route('beacons.import'); } /** @@ -92,14 +81,14 @@ public function importing(Request $request) */ public function create(Request $request) { -// $places = Place::lists('name', 'id'); -// $floors = Floor::lists('name', 'id'); +// $places = Place::pluck('name', 'id'); +// $floors = Floor::pluck('name', 'id'); // $devices = $this->getBeaconsFromWebservice(); // if ($request->input('beacon_uid')) { - // $beacon = $this->getBeaconFromWebservice($request->input('beacon_uid')); - // } + // $beacon = $this->getBeaconFromWebservice($request->input('beacon_uid')); + // } return view('beacons.create'); } @@ -107,13 +96,13 @@ public function create(Request $request) /** * Store a newly created resource in storage. * - * @param \Illuminate\Http\Request $request + * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $this->validate($request, [ - 'name' => 'required|max:255', + 'name' => 'required|max:255', ]); $beacon = Beacon::create($request->all()); @@ -123,7 +112,7 @@ public function store(Request $request) /** * Display the specified resource. * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function show($id) @@ -135,14 +124,14 @@ public function show($id) /** * Show the form for editing the specified resource. * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { $beacon = Beacon::findOrFail($id); -// $places = Place::lists('name', 'id'); -// $floors = Floor::lists('name', 'id'); +// $places = Place::pluck('name', 'id'); +// $floors = Floor::pluck('name', 'id'); return view('beacons.edit', compact('beacon')); } @@ -150,14 +139,14 @@ public function edit($id) /** * Update the specified resource in storage. * - * @param \Illuminate\Http\Request $request - * @param int $id + * @param \Illuminate\Http\Request $request + * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { $this->validate($request, [ - 'name' => 'required|max:255', + 'name' => 'required|max:255', ]); $beacon = Beacon::findOrFail($id); @@ -168,7 +157,7 @@ public function update(Request $request, $id) /** * Remove the specified resource from storage. * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) @@ -177,56 +166,4 @@ public function destroy($id) $beacon->delete(); return redirect()->route('beacons.index'); } - - /** - * Get beacons from Kontakt webservice - * @return Illuminate\Support\Collection - */ - protected function getBeaconsFromWebservice() - { - $client = new Client([ - 'base_uri' => 'https://api.kontakt.io/', - 'headers' => [ - 'Accept' => 'application/vnd.com.kontakt+json;version=7', - 'Api-Key' => config('services.kontakt.key'), - 'User-Agent' => 'BeaconBacon' - ] - ]); - - try { - $response = $client->request('GET', '/device?maxResult=1000'); - $results = json_decode($response->getBody()->getContents()); - $devices = collect(); - - foreach ($results->devices as $device) { - $devices->put($device->uniqueId, $device->uniqueId . ($device->alias ? ' (' . $device->alias . ')' : '')); - } - - return $devices; - } - catch (\Exception $e) { - return []; - } - } - - protected function getBeaconFromWebservice($beaconId) - { - $client = new Client([ - 'base_uri' => 'https://api.kontakt.io/', - 'headers' => [ - 'Accept' => 'application/vnd.com.kontakt+json;version=7', - 'Api-Key' => config('services.kontakt.key'), - 'User-Agent' => 'BeaconBacon' - ] - ]); - - try { - $response = $client->request('GET', '/device/'.$beaconId); - $results = json_decode($response->getBody()->getContents()); - return $results; - } - catch (\Exception $e) { - return null; - } - } } diff --git a/app/Http/Controllers/BlockController.php b/app/Http/Controllers/BlockController.php index e966bea..1a3a55b 100644 --- a/app/Http/Controllers/BlockController.php +++ b/app/Http/Controllers/BlockController.php @@ -105,6 +105,19 @@ public function update(Request $request, $id) return redirect()->route('blocks.index'); } + /** + * Get the specified image resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function image($id) + { + $block = Block::findOrFail($id); + + return response()->file($block->getPhysicalIconPath()); + } + /** * Remove the specified resource from storage. * @@ -132,15 +145,14 @@ protected function uploadIcon(Block $block, Request $request) return; } - $destinationPath = public_path('uploads/blocks/' . $block->id); - $fileName = $request->file('image')->getClientOriginalName(); + $request->file('image')->store('blocks/' . $block->id); + $fileName = $request->image->hashName(); + $destinationPath = storage_path() . '/app/images/blocks/' . $block->id; if ($block->image && is_file($destinationPath . '/' . $block->image)) { unlink($destinationPath . '/' . $block->image); } - $request->file('image')->move($destinationPath, $fileName); - $image = Image::make($destinationPath . '/' . $fileName); $block->update([ diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index d492e0b..50dd158 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -10,5 +10,5 @@ class Controller extends BaseController { - use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests; + use AuthorizesRequests, DispatchesJobs, ValidatesRequests; } diff --git a/app/Http/Controllers/FindableController.php b/app/Http/Controllers/FindableController.php index 5ce9038..0f66117 100644 --- a/app/Http/Controllers/FindableController.php +++ b/app/Http/Controllers/FindableController.php @@ -5,6 +5,7 @@ use App\Findable; use App\Http\Requests; use Illuminate\Http\Request; +use Artisan; class FindableController extends Controller { @@ -35,8 +36,10 @@ public function index() * @return \Illuminate\Http\Response */ public function create() - { - return view('findable.create'); + { + $types = array('icon' => 'Icon', 'area' => 'Area'); + + return view('findable.create', compact('types')); } /** @@ -49,10 +52,12 @@ public function store(Request $request) { $this->validate($request, [ 'name' => 'required|max:255', - 'identifier' => 'required|max:255', + 'identifier' => 'required|max:255|unique:findables', ]); - $findable = Findable::create($request->all()); + $findable = Findable::create($request->except('custom_file')); + + $this->uploadFile($findable, $request); return redirect()->route('findables.index'); } @@ -97,7 +102,9 @@ public function update(Request $request, $id) ]); $findable = Findable::findOrFail($id); - $findable->update($request->all()); + $findable->update($request->except('custom_file')); + + $this->uploadFile($findable, $request); return redirect()->route('findables.index'); } @@ -115,4 +122,29 @@ public function destroy($id) return redirect()->route('findables.index'); } + + protected function uploadFile(Findable $findable, Request $request) + { + if (!$request->hasFile('custom_file')) { + return; + } + + $file = $request->file('custom_file'); + + $fileName = $findable->identifier . 'Plugin.php'; + + $destinationPath = storage_path() . '/app/files/findables/'; + + if ($findable->custom_file && is_file($destinationPath . $findable->custom_file)) { + unlink($destinationPath . $findable->custom_file); + } + + $file->storeAs('files/findables/', $fileName); + + $findable->update([ + 'custom_file' => $fileName, + ]); + + $output = shell_exec('cd .. && composer dump-autoload -o 2>&1'); + } } diff --git a/app/Http/Controllers/FloorController.php b/app/Http/Controllers/FloorController.php index d9ba304..114476c 100644 --- a/app/Http/Controllers/FloorController.php +++ b/app/Http/Controllers/FloorController.php @@ -77,7 +77,8 @@ public function show($placeId, $id) $floor = Floor::findOrFail($id); if ($floor->image) { - $image = Image::make($floor->image); + $path = $floor->getPhysicalIconPath(); + $image = Image::make($path); $floor->mapWidth = $image->width(); $floor->mapHeight = $image->height(); } @@ -123,6 +124,19 @@ public function update(Request $request, $placeId, $id) return redirect()->route('floors.show', [$placeId, $id]); } + /** + * Get the specified image resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function image($id) + { + $floor = Floor::findOrFail($id); + + return response()->file($floor->getPhysicalIconPath()); + } + /** * Remove the specified resource from storage. * @@ -150,14 +164,18 @@ protected function uploadFloor(Floor $floor, Request $request) return; } - $destinationPath = public_path('uploads/floors/' . $floor->id); - $fileName = $request->file('image')->getClientOriginalName(); + $request->file('image')->store('images/floors/' . $floor->id); + $fileName = $request->image->hashName(); + $destinationPath = storage_path() . '/app/images/floors/' . $floor->id; + + /*$destinationPath = public_path('uploads/floors/' . $floor->id); + $fileName = $request->file('image')->getClientOriginalName();*/ if ($floor->image && is_file($destinationPath . '/' . $floor->image)) { unlink($destinationPath . '/' . $floor->image); } - $request->file('image')->move($destinationPath, $fileName); + //$request->file('image')->move($destinationPath, $fileName); $image = Image::make($destinationPath . '/' . $fileName); $image->save( $destinationPath . '/original-' . $fileName ); diff --git a/app/Http/Controllers/LocationController.php b/app/Http/Controllers/LocationController.php index ea31fc2..f5d86b4 100644 --- a/app/Http/Controllers/LocationController.php +++ b/app/Http/Controllers/LocationController.php @@ -2,6 +2,8 @@ namespace App\Http\Controllers; +use App\User; +use App\Jobs\GenerateMap; use Image; use App\Floor; use App\Place; @@ -10,6 +12,7 @@ use App\Block; use App\Findable; use App\Location; +use App\Setting; use App\Http\Requests; use Illuminate\Http\Request; @@ -32,7 +35,7 @@ public function __construct() */ public function index($placeId, $floorId) { - //TODO -> redirect to floor show? + //TODO -> redirect to floor show? $locations = Location::all(); $place = Place::findOrFail($placeId); $floor = Floor::findOrFail($floorId); @@ -45,72 +48,77 @@ public function index($placeId, $floorId) * * @return \Illuminate\Http\Response */ - public function create ($placeId, $floorId, $type = 'poi') + public function create($placeId, $floorId, $type = 'poi') { $place = Place::findOrFail($placeId); $floor = Floor::findOrFail($floorId); - if ( $type == 'beacon' ) { + if ($type == 'beacon') { - $beacons = Beacon::where( 'location_id', 0 )->lists('name', 'id'); + $beacons = Beacon::where('location_id', 0)->pluck('name', 'id'); - $beacons_select = []; - $beacons_select[0] = 'Select Beacon...'; + $beacons_select = []; + $beacons_select[0] = 'Select Beacon...'; - $beacons = Beacon::where( 'location_id', 0 )->get()->sortBy('name'); - foreach( $beacons as $beacon ) { - $beacons_select[ $beacon->id ] = $beacon->name . ' (' . $beacon->major . ' : ' . $beacon->minor . ')'; - } + $beacons = Beacon::where('location_id', 0)->get()->sortBy('name'); + foreach ($beacons as $beacon) { + $beacons_select[$beacon->id] = $beacon->name . ' (' . $beacon->major . ' : ' . $beacon->minor . ')'; + } - return view('locations.create.beacon', compact('beacons_select', 'place', 'floor', 'placeId', 'floorId')); - } + return view('locations.create.beacon', compact('beacons_select', 'place', 'floor', 'placeId', 'floorId')); + } - if ( $type == 'findable' ) { + if ($type == 'findable') { - $findables = Findable::lists( 'name', 'id' ); - $findables->prepend( 'Select type...', 0 ); + $findables = Findable::pluck('name', 'id'); + $findables->prepend('Select Findable...', 0); + $types = array( + '' => 'Select type...', + 'point' => 'Point', + 'area' => 'Area' + ); - return view('locations.create.findable', compact('findables', 'place', 'floor', 'placeId', 'floorId')); - } + return view('locations.create.findable', compact('types', 'findables', 'place', 'floor', 'placeId', 'floorId')); + } - if ( $type == 'block' ) { + if ($type == 'block') { - $blocks = Block::lists( 'name', 'id' ); - $blocks->prepend( 'Select block...', 0 ); + $blocks = Block::pluck('name', 'id'); + $blocks->prepend('Select block...', 0); - $findables = Findable::lists( 'name', 'id' ); - $findables->prepend( 'Is this block findable?', 0 ); + $findables = Findable::pluck('name', 'id'); + $findables->prepend('Is this block findable?', 0); - return view('locations.create.block', compact('blocks','findables','place', 'floor', 'placeId', 'floorId')); - } + return view('locations.create.block', compact('blocks', 'findables', 'place', 'floor', 'placeId', 'floorId')); + } - $pois = Poi::lists( 'name', 'id' ); - $pois->prepend( 'Select POI...', 0 ); + $pois = Poi::pluck('name', 'id'); + $pois->prepend('Select POI...', 0); - return view('locations.create.poi', compact('pois', 'place', 'floor', 'placeId', 'floorId')); + return view('locations.create.poi', compact('pois', 'place', 'floor', 'placeId', 'floorId')); } /** * Store a newly created resource in storage. * - * @param \Illuminate\Http\Request $request + * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request, $placeId, $floorId) { $this->validate($request, [ - 'name' => 'required|max:255', + 'name' => 'required|max:255', ]); - $location = Location::create( $request->all() ); + $location = Location::create($request->all()); $beacon_id = $request->input('beacon_id'); - if ( ! empty( $beacon_id ) ) { - $beacon = Beacon::findOrFail($beacon_id); - $beacon->place_id = $request->input('place_id'); - $beacon->floor_id = $request->input('floor_id'); - $beacon->location_id = $location->id; - $beacon->save(); + if (!empty($beacon_id)) { + $beacon = Beacon::findOrFail($beacon_id); + $beacon->place_id = $request->input('place_id'); + $beacon->floor_id = $request->input('floor_id'); + $beacon->location_id = $location->id; + $beacon->save(); } return redirect()->route('locations.edit', [$placeId, $floorId, $location->id]); @@ -119,7 +127,7 @@ public function store(Request $request, $placeId, $floorId) /** * Display the specified resource. * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function show($placeId, $floorId, $id) @@ -130,7 +138,7 @@ public function show($placeId, $floorId, $id) /** * Show the form for editing the specified resource. * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function edit($placeId, $floorId, $id) @@ -140,7 +148,7 @@ public function edit($placeId, $floorId, $id) $location = Location::findOrFail($id); if ($location->floor->image) { - $image = Image::make($location->floor->image); + $image = Image::make($location->floor->getPhysicalIconPath()); $location->mapWidth = $image->width(); $location->mapHeight = $image->height(); } @@ -148,146 +156,139 @@ public function edit($placeId, $floorId, $id) $location->mapWidthCentimeters = $floor->map_width_in_centimeters; $location->mapHeightCentimeters = $floor->map_height_in_centimeters; - if ( $location->type == 'beacon' ) { - $beacons_select = []; - $beacons = Beacon::where( 'location_id', 0 )->get(); - foreach( $beacons as $beacon ) { - $beacons_select[ $beacon->id ] = $beacon->name . ' (' . $beacon->major . ' : ' . $beacon->minor . ')'; - } + if ($location->type == 'beacon') { + $beacons_select = []; + $beacons = Beacon::where('location_id', 0)->get(); + foreach ($beacons as $beacon) { + $beacons_select[$beacon->id] = $beacon->name . ' (' . $beacon->major . ' : ' . $beacon->minor . ')'; + } - $beacons_select[ $location->beacon->id ] = $location->beacon->name . ' (' . $location->beacon->major . ' : ' . $location->beacon->minor . ')'; + $beacons_select[$location->beacon->id] = $location->beacon->name . ' (' . $location->beacon->major . ' : ' . $location->beacon->minor . ')'; - return view('locations.edit.beacon', compact('beacons_select','location', 'placeId', 'floorId')); - } + return view('locations.edit.beacon', compact('beacons_select', 'location', 'placeId', 'floorId')); + } - if ( $location->type == 'findable' ) { + if ($location->type == 'findable') { - $findables = Findable::lists( 'name', 'id' ); - $findables->prepend( 'Select type...', 0 ); + $findables = Findable::pluck('name', 'id'); + $findables->prepend('Select Findable...', 0); - return view('locations.edit.findable', compact('findables','location', 'placeId', 'floorId')); - } + if ($location->draw_type === "area") { + return view('locations.edit.findable.area', compact('findables', 'location', 'placeId', 'floorId')); + } - if ( $location->type == 'block' ) { + return view('locations.edit.findable.icon', compact('findables', 'location', 'placeId', 'floorId')); + } - $blocks = Block::lists( 'name', 'id' ); - $blocks->prepend( 'Select Block...', 0 ); + if ($location->type == 'block') { - $findables = Findable::lists( 'name', 'id' ); - $findables->prepend( 'Is findable?', 0 ); + $blocks = Block::pluck('name', 'id'); + $blocks->prepend('Select Block...', 0); - if ($location->block->image) { - $image = Image::make($location->block->image); - $location->imageWidth = $image->width(); - $location->imageHeight = $image->height(); - } + $findables = Findable::pluck('name', 'id'); + $findables->prepend('Is findable?', 0); - $location->imageRotation = deg2rad( $location->rotation ); + if ($location->block->image) { + $path = $location->block->getPhysicalIconPath(); + $image = Image::make($path); + $location->imageWidth = $image->width(); + $location->imageHeight = $image->height(); + } - return view('locations.edit.block', compact('blocks','findables','location','placeId','floor','floorId')); - } + $location->imageRotation = deg2rad($location->rotation); - $pois = Poi::lists( 'name', 'id' ); + return view('locations.edit.block', compact('blocks', 'findables', 'location', 'placeId', 'floor', 'floorId')); + } + + $pois = Poi::pluck('name', 'id'); if ($location->poi->icon) { - $icon = Image::make($location->poi->icon); + $icon = Image::make($location->poi->getPhysicalIconPath()); $location->iconWidth = 32; - $location->iconHeight = round( 32 / $icon->width() * $icon->height() ); + $location->iconHeight = round(32 / $icon->width() * $icon->height()); } - if ( $location->poi->type == 'area' ) { - return view('locations.edit.poi.area', compact('pois','location', 'placeId', 'floorId')); - } + if ($location->poi->type == 'area') { + return view('locations.edit.poi.area', compact('pois', 'location', 'placeId', 'floorId')); + } - return view('locations.edit.poi.icon', compact('pois','location', 'placeId', 'floorId')); + return view('locations.edit.poi.icon', compact('pois', 'location', 'placeId', 'floorId')); } /** * Update the specified resource in storage. * - * @param \Illuminate\Http\Request $request - * @param int $id + * @param \Illuminate\Http\Request $request + * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $placeId, $floorId, $id) { $this->validate($request, [ - 'name' => 'required|max:255', + 'name' => 'required|max:255', ]); $location = Location::findOrFail($id); - if ( $location->type == 'beacon' ) { - $beacon = Beacon::where( 'location_id', '=', $location->id )->first(); - $beacon->place_id = 0; - $beacon->floor_id = 0; - $beacon->location_id = 0; - $beacon->save(); - } + if ($location->type == 'beacon') { + $beacon = Beacon::where('location_id', '=', $location->id)->first(); + $beacon->place_id = 0; + $beacon->floor_id = 0; + $beacon->location_id = 0; + $beacon->save(); + } $beacon_id = $request->input('beacon_id'); - if ( ! empty( $beacon_id ) ) { - $beacon = Beacon::findOrFail($beacon_id); - $beacon->place_id = $request->input('place_id'); - $beacon->floor_id = $request->input('floor_id'); - $beacon->location_id = $location->id; - $beacon->save(); + if (!empty($beacon_id)) { + $beacon = Beacon::findOrFail($beacon_id); + $beacon->place_id = $request->input('place_id'); + $beacon->floor_id = $request->input('floor_id'); + $beacon->location_id = $location->id; + $beacon->save(); } $location->update($request->all()); - if ( $location->type == 'block' ) { - $this->createFloorMap( $location ); - } - - return redirect()->route('floors.show', [$placeId, $floorId]); - } - - private function createFloorMap ( Location $location ) { - $locations = $location->floor->locations; - $floorImage = Image::make( public_path( 'uploads/floors/' . $location->floor->id . '/original-' . basename( $location->floor->image ) ) ); + if ($location->type == 'block') { + $locations = Location::with('block')->get()->where('floor_id', $floorId); - foreach( $locations as $location ) { - if ( $location->type != 'block' || empty( $location->block->image ) ) { - continue; - } + $floor = $location->floor; - try { - $blockImage = Image::make( $location->block->image ); - $blockImage->rotate( -$location->rotation ); - $floorImage->insert( $blockImage, 'top-left', round( $location->posX - ( $blockImage->width() / 2 ) ), round( $location->posY - ( $blockImage->height() / 2 ) ) ); + dispatch(new GenerateMap($locations->toArray(), $floor)); } - catch( \Exception $e) { - } - } - $floorImage->save( base_path( 'public/uploads/floors/' . $location->floor->id . '/' . basename( $location->floor->image ) ) ); + return redirect()->route('floors.show', [$placeId, $floorId]); } /** * Remove the specified resource from storage. * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function destroy($placeId, $floorId, $id) { - $location = Location::findOrFail($id); + $location = Location::findOrFail($id); - if ( $location->type == 'beacon' ) { - $beacon = Beacon::where( 'location_id', '=', $location->id )->first(); - $beacon->place_id = 0; - $beacon->floor_id = 0; - $beacon->location_id = 0; - $beacon->save(); - } + if ($location->type == 'beacon') { + $beacon = Beacon::where('location_id', '=', $location->id)->first(); + $beacon->place_id = 0; + $beacon->floor_id = 0; + $beacon->location_id = 0; + $beacon->save(); + } $location->delete(); - if ( $location->type == 'block' ) { - $this->createFloorMap( $location ); - } + if ($location->type == 'block') { + + $locations = Location::with('block')->get()->where('floor_id', $floorId); + + $floor = $location->floor; + + dispatch(new GenerateMap($locations->toArray(), $floor)); + } return redirect()->route('floors.show', [$placeId, $floorId]); } diff --git a/app/Http/Controllers/PlaceController.php b/app/Http/Controllers/PlaceController.php index 8b63156..4315e6f 100644 --- a/app/Http/Controllers/PlaceController.php +++ b/app/Http/Controllers/PlaceController.php @@ -36,7 +36,7 @@ public function index() */ public function create() { - $places = Place::lists( 'name', 'id' ); + $places = Place::pluck( 'name', 'id' ); $places->prepend( 'Select parent place...', 0 ); return view('places.create', compact('places')); @@ -71,7 +71,7 @@ public function show($id) { $place = Place::findOrFail($id); $menuitems = Menu::where('place_id', $id)->orderBy('order')->get(); - $pois = Poi::lists('name', 'id')->prepend('', ''); + $pois = Poi::pluck('name', 'id')->prepend('', ''); return view('places.show', compact('place', 'menuitems', 'pois')); } @@ -87,7 +87,7 @@ public function edit($id) { $place = Place::findOrFail($id); - $places = Place::lists( 'name', 'id' ); + $places = Place::pluck( 'name', 'id' ); $places->prepend( 'Select parent place...', 0 ); return view('places.edit', compact('place','places')); diff --git a/app/Http/Controllers/PoiController.php b/app/Http/Controllers/PoiController.php index 3b4080f..3fca6ee 100644 --- a/app/Http/Controllers/PoiController.php +++ b/app/Http/Controllers/PoiController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use Image; use App\Poi; use App\Http\Requests; use Illuminate\Http\Request; @@ -36,22 +37,22 @@ public function index() */ public function create() { - $types = array('icon' => 'Icon', 'area' => 'Area'); - + $types = array('icon' => 'Icon', 'area' => 'Area'); + return view('pois.create', compact('types')); } /** * Store a newly created resource in storage. * - * @param \Illuminate\Http\Request $request + * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { $this->validate($request, [ - 'name' => 'required|max:255', - 'internal_name' => 'required|max:255', + 'name' => 'required|max:255', + 'internal_name' => 'required|max:255', ]); $poi = Poi::create($request->except('icon')); @@ -64,7 +65,7 @@ public function store(Request $request) /** * Display the specified resource. * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function show($id) @@ -76,29 +77,29 @@ public function show($id) /** * Show the form for editing the specified resource. * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { $poi = Poi::findOrFail($id); - $types = array('icon' => 'Icon', 'area' => 'Area'); + $types = array('icon' => 'Icon', 'area' => 'Area'); - return view('pois.edit', compact('poi','types')); + return view('pois.edit', compact('poi', 'types')); } /** * Update the specified resource in storage. * - * @param \Illuminate\Http\Request $request - * @param int $id + * @param \Illuminate\Http\Request $request + * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { $this->validate($request, [ - 'name' => 'required|max:255', - 'internal_name' => 'required|max:255', + 'name' => 'required|max:255', + 'internal_name' => 'required|max:255', ]); $poi = Poi::findOrFail($id); @@ -109,10 +110,23 @@ public function update(Request $request, $id) return redirect()->route('pois.index'); } + /** + * Get the specified image resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function image($id) + { + $poi = Poi::findOrFail($id); + + return response()->file($poi->getPhysicalIconPath()); + } + /** * Remove the specified resource from storage. * - * @param int $id + * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) @@ -126,7 +140,7 @@ public function destroy($id) /** * Upload icon * @param Poi $Poi - * @param Request $request + * @param Request $request * @return void */ protected function uploadIcon(Poi $poi, Request $request) @@ -134,16 +148,14 @@ protected function uploadIcon(Poi $poi, Request $request) if (!$request->hasFile('icon')) { return; } - - $destinationPath = public_path('uploads/pois/' . $poi->id); - $fileName = $request->file('icon')->getClientOriginalName(); + $request->file('icon')->store('images/pois/' . $poi->id); + $fileName = $request->icon->hashName(); + $destinationPath = storage_path() . '/app/images/pois/' . $poi->id; if ($poi->icon && is_file($destinationPath . '/' . $poi->icon)) { unlink($destinationPath . '/' . $poi->icon); } - $request->file('icon')->move($destinationPath, $fileName); - $poi->update([ 'icon' => $fileName ]); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index b70b83d..906547b 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -33,10 +33,12 @@ class Kernel extends HttpKernel \App\Http\Middleware\AdminMenu::class, \App\Http\Middleware\ConfigLoader::class, \Xinax\LaravelGettext\Middleware\GettextMiddleware::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ 'throttle:60,1', + 'bindings', ], ]; @@ -50,8 +52,9 @@ class Kernel extends HttpKernel protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, - 'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, ]; } diff --git a/app/Http/Middleware/ConfigLoader.php b/app/Http/Middleware/ConfigLoader.php index f7d7a11..f2ae588 100644 --- a/app/Http/Middleware/ConfigLoader.php +++ b/app/Http/Middleware/ConfigLoader.php @@ -22,14 +22,14 @@ public function handle($request, Closure $next) // check if user is logged in if (auth()->check()) { // get the settings in a nice key=>value format - $settings = Setting::lists('value', 'key'); + $settings = Setting::pluck('value', 'key'); } // check for email input (ie. forgot password) elseif ($request->input('email')) { $user = User::whereEmail($request->input('email'))->first(); if ($user) { - $settings = Setting::withoutGlobalScopes()->whereTeamId($user->current_team_id)->lists('value', 'key'); + $settings = Setting::withoutGlobalScopes()->whereTeamId($user->current_team_id)->pluck('value', 'key'); } } diff --git a/app/Jobs/GenerateMap.php b/app/Jobs/GenerateMap.php new file mode 100644 index 0000000..4f27b6f --- /dev/null +++ b/app/Jobs/GenerateMap.php @@ -0,0 +1,54 @@ +locations = $locations; + $this->floor = $floor; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $floorImage = Image::make(storage_path() . '/app/images/floors/' . $this->floor->id . '/original-' . basename($this->floor->image)); + + foreach ($this->locations as $location) { + + if ($location['type'] != 'block' || empty($location['block']['image'])) { + continue; + } + + try { + $blockImage = Image::make(storage_path() . '/app/images/blocks/' . $location['block']['id'] . '/' . $location['block']['image']); + $blockImage->rotate(-$location['rotation']); + $floorImage->insert($blockImage, 'top-left', round($location['posX'] - ($blockImage->width() / 2)), round($location['posY'] - ($blockImage->height() / 2))); + } catch (\Exception $e) { + + } + } + + $floorImage->save(storage_path() . '/app/images/floors/' . $this->floor->id . '/' . basename($this->floor->image)); + } +} diff --git a/app/Jobs/ImportBeaconsJob.php b/app/Jobs/ImportBeaconsJob.php new file mode 100644 index 0000000..cbfc864 --- /dev/null +++ b/app/Jobs/ImportBeaconsJob.php @@ -0,0 +1,222 @@ +service = $service; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $externalBeacons = $this->getBeaconsFromWebservice($this->service); + foreach ($externalBeacons as $externalBeaconId) { + $beacon = DB::table('beacons')->where('beacon_uid', $externalBeaconId)->first(); + + if (empty($beacon)) { + + $device = $this->getBeaconFromWebservice($externalBeaconId, $this->service); + try { + DB::table('beacons')->insert([ + 'name' => $device->uniqueId, + 'beacon_uid' => $device->uniqueId, + 'proximity_uuid' => $device->proximity, + 'minor' => $device->minor, + 'major' => $device->major, + 'created_at' => Carbon::now()->toDateTimeString(), + 'updated_at' => Carbon::now()->toDateTimeString() + ]); + } catch (\Exception $e) { + echo $e; + } + + } else { + echo "tom!"; + } + } + + } + + /** + * Get beacons from Kontakt webservice + * @return Illuminate\Support\Collection + */ + protected function getBeaconsFromWebservice($service) + { + $data = []; + switch ($service) { + case 'kontakt.io': + $data = $this->getBeaconsFromKontakt(); + break; + case 'estimote': + $data = $this->getBeaconsFromEstimote(); + break; + case 'test': + $data = $this->getBeaconsFromTest(); + break; + } + return $data; + } + + protected function getBeaconFromWebservice($beaconId, $service) + { + $data = []; + + switch ($service) { + case 'kontakt.io': + $data = $this->getBeaconFromKontakt($beaconId); + break; + case 'estimote': + $data = $this->getBeaconFromEstimote($beaconId); + break; + case 'test': + $data = $this->getBeaconFromTest($beaconId); + break; + } + return $data; + } + + protected function getBeaconsFromKontakt() + { + $settings = DB::table('settings')->get(); + + $client = new Client([ + 'base_uri' => 'https://api.kontakt.io/', + 'headers' => [ + 'Accept' => 'application/vnd.com.kontakt+json;version=8', + 'Api-Key' => $settings[3]->value, + 'User-Agent' => 'BeaconBacon' + ] + ]); + + try { + $response = $client->request('GET', '/device?maxResult=5'); + $results = json_decode($response->getBody()->getContents()); + $devices = collect(); + + foreach ($results->devices as $device) { + $devices->put($device->uniqueId, $device->uniqueId . ($device->alias ? ' (' . $device->alias . ')' : '')); + + } + + return $devices; + } catch (\Exception $e) { + return []; + } + } + + protected function getBeaconFromKontakt($beaconId) + { + $settings = DB::table('settings')->get(); + + $client = new Client([ + 'base_uri' => 'https://api.kontakt.io/', + 'headers' => [ + 'Accept' => 'application/vnd.com.kontakt+json;version=8', + 'Api-Key' => $settings[3]->value, + 'User-Agent' => 'BeaconBacon' + ] + ]); + + try { + $response = $client->request('GET', '/device/' . $beaconId); + $results = json_decode($response->getBody()->getContents()); + return $results; + } catch (\Exception $e) { + echo $e; + return null; + } + } + + protected function getBeaconsFromEstimote() + { + $settings = DB::table('settings')->get(); + + $client = new Client([ + 'base_uri' => 'https://cloud.estimote.com/v2/', + 'headers' => [ + 'Accept' => 'application/json;' + ] + ]); + + try { + $response = $client->request('GET', 'devices', ['auth' => ['user', $settings[3]->value]]); + $results = json_decode($response->getBody()->getContents()); + $devices = collect(); + + foreach ($results->devices as $device) { + $devices->put($device->uniqueId, $device->uniqueId . ($device->alias ? ' (' . $device->alias . ')' : '')); + } + + return $devices; + } catch (\Exception $e) { + return []; + } + } + + protected function getBeaconFromEstimote($beaconId) + { + $settings = DB::table('settings')->get(); + + $client = new Client([ + 'base_uri' => 'https://cloud.estimote.com/v2/', + 'headers' => [ + 'Accept' => 'application/json' + ] + ]); + + try { + $response = $client->request('GET', 'devices/' . $beaconId, ['auth' => ['user', $settings[3]->value]]); + $results = json_decode($response->getBody()->getContents()); + return $results; + } catch (\Exception $e) { + return null; + } + } + + protected function getBeaconsFromTest() + { + $devices = collect(); + + $devices->put('uniqueId', 'testeren'); + $devices->put('uniqueId', 'tove2'); + + return $devices; + } + + protected function getBeaconFromTest($beaconId) + { + $data = new \stdClass; + $data->uniqueId = "tove2"; + $data->beacon_uid = "tove2"; + $data->proximity = "testeren"; + $data->minor = "1234"; + $data->major = "4321"; + + return $data; + } +} diff --git a/app/Location.php b/app/Location.php index a5cd740..58efc3f 100644 --- a/app/Location.php +++ b/app/Location.php @@ -17,7 +17,7 @@ class Location extends Model * * @var array */ - protected $fillable = ['place_id', 'floor_id', 'poi_id', 'block_id', 'findable_id', 'type', 'name', 'posX', 'posY', 'area', 'rotation', 'parameter_one', 'parameter_two', 'parameter_three', 'parameter_four', 'parameter_five']; + protected $fillable = ['place_id', 'floor_id', 'poi_id', 'block_id', 'findable_id', 'type', 'name', 'posX', 'posY', 'area', 'rotation', 'parameter_one', 'parameter_two', 'parameter_three', 'parameter_four', 'parameter_five', 'draw_type']; /** * The attributes that should be mutated to dates. diff --git a/app/Place.php b/app/Place.php index 05b03d7..34a57d5 100644 --- a/app/Place.php +++ b/app/Place.php @@ -17,7 +17,9 @@ class Place extends Model * * @var array */ - protected $fillable = ['name', 'address', 'zipcode', 'city', 'identifier', 'place_id', 'order', 'beacon_positioning_enabled', 'beacon_proximity_enabled', 'activated']; + protected $fillable = ['name', 'address', 'zipcode', 'city', + 'identifier_one', 'identifier_one', 'identifier_three', 'identifier_four', 'identifier_five', + 'place_id', 'order', 'beacon_positioning_enabled', 'beacon_proximity_enabled', 'activated']; /** * The attributes that should be mutated to dates. diff --git a/app/Poi.php b/app/Poi.php index 9f2730c..eb8bedd 100644 --- a/app/Poi.php +++ b/app/Poi.php @@ -41,17 +41,36 @@ class Poi extends Model protected static $logAttributes = ['name', 'internal_name', 'icon']; /** - * Return full path to icon. + * Return full path to image. * * @param string $value * * @return string */ - public function getIconAttribute($value) + public function getPublicImage() { - return !$value ? '' : asset('uploads/pois/'.$this->id.'/'.$value); + return !$this->icon ? '' : asset('storage/images/pois/' . $this->id . '/' . $this->icon); } + /** + * Return full virtual path to icon. + * + * @return string + */ + public function getVirtualIconPath() + { + return !$this->icon ? '' : url('/pois/' . $this->id . '/image'); + } + + /** + * Return full physical path to icon. + * + * @return string + */ + public function getPhysicalIconPath() + { + return !$this->icon ? '' : storage_path() . '/app/images/pois/' . $this->id . '/' . $this->icon; + } /** * Get locations belonging to this poi @@ -59,7 +78,7 @@ public function getIconAttribute($value) */ public function locations() { - return $this->hasMany('App\Location'); + return $this->hasMany('App\Location'); } /** diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 35471f6..a5813fe 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,6 +3,8 @@ namespace App\Providers; use Illuminate\Support\ServiceProvider; +use Illuminate\Support\Facades\Validator; +use Intervention\Image\ImageManagerStatic; class AppServiceProvider extends ServiceProvider { @@ -13,7 +15,14 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { - // + Validator::extend('imageable', function ($attribute, $value, $params, $validator) { + try { + ImageManagerStatic::make($value); + return true; + } catch (\Exception $e) { + return false; + } + }); } /** @@ -23,6 +32,7 @@ public function boot() */ public function register() { + // } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 57d88ea..bd87817 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -22,9 +22,9 @@ class AuthServiceProvider extends ServiceProvider * @param \Illuminate\Contracts\Auth\Access\Gate $gate * @return void */ - public function boot(GateContract $gate) + public function boot() { - $this->registerPolicies($gate); + $this->registerPolicies(); // } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 58ce962..2d82960 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -24,9 +24,9 @@ class EventServiceProvider extends ServiceProvider * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */ - public function boot(DispatcherContract $events) + public function boot() { - parent::boot($events); + parent::boot(); // } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index bde0881..e77a2ab 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -2,7 +2,7 @@ namespace App\Providers; -use Illuminate\Routing\Router; +use Illuminate\Support\Facades\Route; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; class RouteServiceProvider extends ServiceProvider @@ -19,27 +19,27 @@ class RouteServiceProvider extends ServiceProvider /** * Define your route model bindings, pattern filters, etc. * - * @param \Illuminate\Routing\Router $router + * @param \Illuminate\Routing\Router $router * @return void */ - public function boot(Router $router) + public function boot() { // - parent::boot($router); + parent::boot(); } /** * Define the routes for the application. * - * @param \Illuminate\Routing\Router $router + * @param \Illuminate\Routing\Router $router * @return void */ - public function map(Router $router) + public function map() { - $this->mapWebRoutes($router); - - // + $this->mapApi1Routes(); + $this->mapApi2Routes(); + $this->mapWebRoutes(); } /** @@ -47,15 +47,51 @@ public function map(Router $router) * * These routes all receive session state, CSRF protection, etc. * - * @param \Illuminate\Routing\Router $router + * @param \Illuminate\Routing\Router $router * @return void */ - protected function mapWebRoutes(Router $router) + protected function mapWebRoutes() { - $router->group([ + Route::group([ 'namespace' => $this->namespace, 'middleware' => 'web', ], function ($router) { - require app_path('Http/routes.php'); + require base_path('routes/web.php'); + }); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapApi1Routes() + { + Route::group([ + 'middleware' => 'auth:api', + 'namespace' => $this->namespace .'\API\V1', + 'prefix' => 'api/v1', + ], function ($router) { + require base_path('routes/api1.php'); + }); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapApi2Routes() + { + Route::group([ + 'middleware' => 'auth:api', + 'namespace' => $this->namespace .'\API\V2', + 'prefix' => 'api/v2', + ], function ($router) { + require base_path('routes/api2.php'); }); } } diff --git a/app/User.php b/app/User.php index 7dec34e..1ed12ae 100644 --- a/app/User.php +++ b/app/User.php @@ -2,13 +2,14 @@ namespace App; +use Illuminate\Notifications\Notifiable; use Mpociot\Teamwork\Traits\UserHasTeams; use Spatie\Activitylog\Traits\LogsActivity; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { - use UserHasTeams, LogsActivity; + use UserHasTeams, LogsActivity, Notifiable; /** * The attributes that are mass assignable. diff --git a/composer.json b/composer.json index 26ea021..006b1bf 100644 --- a/composer.json +++ b/composer.json @@ -6,33 +6,36 @@ "type": "project", "require": { "php": ">=5.5.9", - "laravel/framework": "5.2.*", + "laravel/framework": "5.3.*", "barryvdh/laravel-debugbar": "^2.2", "filp/whoops": "^2.1", - "laravelcollective/html": "5.2.*", + "laravelcollective/html": "5.3.*", "lavary/laravel-menu": "dev-master", - "mpociot/teamwork": "~3.0", + "mpociot/teamwork": "~4.0", "guzzlehttp/guzzle": "~6.0", "intervention/image": "^2.3", "spatie/laravel-activitylog": "^1.2", "xinax/laravel-gettext": "^3.1", "doctrine/dbal": "~2.3", - "artisaninweb/laravel-soap": "0.2.*" + "artisaninweb/laravel-soap": "0.2.*", + "pda/pheanstalk": "~3.0" }, "require-dev": { "fzaninotto/faker": "~1.4", "mockery/mockery": "0.9.*", "phpunit/phpunit": "~4.0", - "symfony/css-selector": "2.8.*|3.0.*", - "symfony/dom-crawler": "2.8.*|3.0.*" + "symfony/css-selector": "3.1.*", + "symfony/dom-crawler": "3.1.*" }, "autoload": { "classmap": [ "database" ], "psr-4": { - "App\\": "app/" + "App\\": "app/", + "BB\\":"storage/app/files/findables/" } + }, "autoload-dev": { "classmap": [ diff --git a/composer.lock b/composer.lock index 4b63aa3..f795bac 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "daadca074b9bf991b63f0cedcb1db58a", - "content-hash": "77a028d042c54ce37f936b21ef9ab59c", + "content-hash": "1a38080ad47587295799aa7873a2d8c0", "packages": [ { "name": "anahkiasen/underscore-php", @@ -55,7 +54,7 @@ "laravel", "toolkit" ], - "time": "2015-05-16 19:24:58" + "time": "2015-05-16T19:24:58+00:00" }, { "name": "artisaninweb/laravel-soap", @@ -97,24 +96,24 @@ "soap", "wrapper" ], - "time": "2015-06-17 11:22:29" + "time": "2015-06-17T11:22:29+00:00" }, { "name": "barryvdh/laravel-debugbar", - "version": "v2.3.0", + "version": "v2.3.2", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "0c87981df959c7c1943abe227baf607c92f204f9" + "reference": "24e4f0261e352d3fd86d0447791b56ae49398674" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/0c87981df959c7c1943abe227baf607c92f204f9", - "reference": "0c87981df959c7c1943abe227baf607c92f204f9", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/24e4f0261e352d3fd86d0447791b56ae49398674", + "reference": "24e4f0261e352d3fd86d0447791b56ae49398674", "shasum": "" }, "require": { - "illuminate/support": "5.1.*|5.2.*|5.3.*", + "illuminate/support": "5.1.*|5.2.*|5.3.*|5.4.*", "maximebf/debugbar": "~1.13.0", "php": ">=5.5.9", "symfony/finder": "~2.7|~3.0" @@ -151,24 +150,24 @@ "profiler", "webprofiler" ], - "time": "2016-09-15 14:05:56" + "time": "2017-01-19T08:19:49+00:00" }, { "name": "classpreloader/classpreloader", - "version": "3.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/ClassPreloader/ClassPreloader.git", - "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a" + "reference": "bc7206aa892b5a33f4680421b69b191efd32b096" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/9b10b913c2bdf90c3d2e0d726b454fb7f77c552a", - "reference": "9b10b913c2bdf90c3d2e0d726b454fb7f77c552a", + "url": "https://api.github.com/repos/ClassPreloader/ClassPreloader/zipball/bc7206aa892b5a33f4680421b69b191efd32b096", + "reference": "bc7206aa892b5a33f4680421b69b191efd32b096", "shasum": "" }, "require": { - "nikic/php-parser": "^1.0|^2.0", + "nikic/php-parser": "^1.0|^2.0|^3.0", "php": ">=5.5.9" }, "require-dev": { @@ -177,7 +176,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -205,7 +204,7 @@ "class", "preload" ], - "time": "2015-11-09 22:51:51" + "time": "2016-09-16T12:50:15+00:00" }, { "name": "dnoegel/php-xdg-base-dir", @@ -238,20 +237,20 @@ "MIT" ], "description": "implementation of xdg base directory specification for php", - "time": "2014-10-24 07:27:01" + "time": "2014-10-24T07:27:01+00:00" }, { "name": "doctrine/annotations", - "version": "v1.3.0", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "30e07cf03edc3cd3ef579d0dd4dd8c58250799a5" + "reference": "bd4461328621bde0ae6b1b2675fbc6aca4ceb558" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/30e07cf03edc3cd3ef579d0dd4dd8c58250799a5", - "reference": "30e07cf03edc3cd3ef579d0dd4dd8c58250799a5", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/bd4461328621bde0ae6b1b2675fbc6aca4ceb558", + "reference": "bd4461328621bde0ae6b1b2675fbc6aca4ceb558", "shasum": "" }, "require": { @@ -306,7 +305,7 @@ "docblock", "parser" ], - "time": "2016-10-24 11:45:47" + "time": "2016-12-30T15:59:45+00:00" }, { "name": "doctrine/cache", @@ -376,32 +375,33 @@ "cache", "caching" ], - "time": "2016-10-29 11:16:17" + "time": "2016-10-29T11:16:17+00:00" }, { "name": "doctrine/collections", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/collections.git", - "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a" + "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a", - "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a", + "url": "https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba", + "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^5.6 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "doctrine/coding-standard": "~0.1@dev", + "phpunit/phpunit": "^5.7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -442,20 +442,20 @@ "collections", "iterator" ], - "time": "2015-04-14 22:21:58" + "time": "2017-01-03T10:49:41+00:00" }, { "name": "doctrine/common", - "version": "v2.6.1", + "version": "v2.7.2", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "a579557bc689580c19fee4e27487a67fe60defc0" + "reference": "930297026c8009a567ac051fd545bf6124150347" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/a579557bc689580c19fee4e27487a67fe60defc0", - "reference": "a579557bc689580c19fee4e27487a67fe60defc0", + "url": "https://api.github.com/repos/doctrine/common/zipball/930297026c8009a567ac051fd545bf6124150347", + "reference": "930297026c8009a567ac051fd545bf6124150347", "shasum": "" }, "require": { @@ -464,10 +464,10 @@ "doctrine/collections": "1.*", "doctrine/inflector": "1.*", "doctrine/lexer": "1.*", - "php": "~5.5|~7.0" + "php": "~5.6|~7.0" }, "require-dev": { - "phpunit/phpunit": "~4.8|~5.0" + "phpunit/phpunit": "^5.4.6" }, "type": "library", "extra": { @@ -515,24 +515,24 @@ "persistence", "spl" ], - "time": "2015-12-25 13:18:31" + "time": "2017-01-13T14:02:13+00:00" }, { "name": "doctrine/dbal", - "version": "v2.5.5", + "version": "v2.5.12", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "9f8c05cd5225a320d56d4bfdb4772f10d045a0c9" + "reference": "7b9e911f9d8b30d43b96853dab26898c710d8f44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/9f8c05cd5225a320d56d4bfdb4772f10d045a0c9", - "reference": "9f8c05cd5225a320d56d4bfdb4772f10d045a0c9", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/7b9e911f9d8b30d43b96853dab26898c710d8f44", + "reference": "7b9e911f9d8b30d43b96853dab26898c710d8f44", "shasum": "" }, "require": { - "doctrine/common": ">=2.4,<2.7-dev", + "doctrine/common": ">=2.4,<2.8-dev", "php": ">=5.3.2" }, "require-dev": { @@ -586,7 +586,7 @@ "persistence", "queryobject" ], - "time": "2016-09-09 19:13:33" + "time": "2017-02-08T12:53:47+00:00" }, { "name": "doctrine/inflector", @@ -653,7 +653,7 @@ "singularize", "string" ], - "time": "2015-11-06 14:35:42" + "time": "2015-11-06T14:35:42+00:00" }, { "name": "doctrine/lexer", @@ -707,20 +707,20 @@ "lexer", "parser" ], - "time": "2014-09-09 13:34:57" + "time": "2014-09-09T13:34:57+00:00" }, { "name": "filp/whoops", - "version": "2.1.4", + "version": "2.1.5", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "3f5cbd0e6a2fc17bc40b0238025ef1ff4c8c3efa" + "reference": "2abce9d956589122c6443d6265f01cf7e9388e3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/3f5cbd0e6a2fc17bc40b0238025ef1ff4c8c3efa", - "reference": "3f5cbd0e6a2fc17bc40b0238025ef1ff4c8c3efa", + "url": "https://api.github.com/repos/filp/whoops/zipball/2abce9d956589122c6443d6265f01cf7e9388e3c", + "reference": "2abce9d956589122c6443d6265f01cf7e9388e3c", "shasum": "" }, "require": { @@ -767,7 +767,7 @@ "whoops", "zf2" ], - "time": "2016-10-11 15:32:23" + "time": "2016-12-26T16:13:31+00:00" }, { "name": "guzzlehttp/guzzle", @@ -829,32 +829,32 @@ "rest", "web service" ], - "time": "2016-10-08 15:01:37" + "time": "2016-10-08T15:01:37+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.3.0", + "version": "v1.3.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "2693c101803ca78b27972d84081d027fca790a1e" + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/2693c101803ca78b27972d84081d027fca790a1e", - "reference": "2693c101803ca78b27972d84081d027fca790a1e", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", "shasum": "" }, "require": { "php": ">=5.5.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "^4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "1.4-dev" } }, "autoload": { @@ -880,7 +880,7 @@ "keywords": [ "promise" ], - "time": "2016-11-18 17:47:58" + "time": "2016-12-20T10:07:11+00:00" }, { "name": "guzzlehttp/psr7", @@ -938,20 +938,20 @@ "stream", "uri" ], - "time": "2016-06-24 23:00:38" + "time": "2016-06-24T23:00:38+00:00" }, { "name": "intervention/image", - "version": "2.3.8", + "version": "2.3.11", "source": { "type": "git", "url": "https://github.com/Intervention/image.git", - "reference": "4064a980324f6c3bfa2bd981dfb247afa705ec3c" + "reference": "e8881fd99b9804b29e02d6d1c2c15ee459335cf1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Intervention/image/zipball/4064a980324f6c3bfa2bd981dfb247afa705ec3c", - "reference": "4064a980324f6c3bfa2bd981dfb247afa705ec3c", + "url": "https://api.github.com/repos/Intervention/image/zipball/e8881fd99b9804b29e02d6d1c2c15ee459335cf1", + "reference": "e8881fd99b9804b29e02d6d1c2c15ee459335cf1", "shasum": "" }, "require": { @@ -1000,7 +1000,7 @@ "thumbnail", "watermark" ], - "time": "2016-09-01 17:04:03" + "time": "2017-02-04T10:37:19+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -1043,7 +1043,7 @@ "homepage": "http://www.acci.cz" } ], - "time": "2014-04-08 15:00:19" + "time": "2014-04-08T15:00:19+00:00" }, { "name": "jakub-onderka/php-console-highlighter", @@ -1087,24 +1087,24 @@ "homepage": "http://www.acci.cz/" } ], - "time": "2015-04-20 18:58:01" + "time": "2015-04-20T18:58:01+00:00" }, { "name": "jeremeamia/SuperClosure", - "version": "2.2.0", + "version": "2.3.0", "source": { "type": "git", "url": "https://github.com/jeremeamia/super_closure.git", - "reference": "29a88be2a4846d27c1613aed0c9071dfad7b5938" + "reference": "443c3df3207f176a1b41576ee2a66968a507b3db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/29a88be2a4846d27c1613aed0c9071dfad7b5938", - "reference": "29a88be2a4846d27c1613aed0c9071dfad7b5938", + "url": "https://api.github.com/repos/jeremeamia/super_closure/zipball/443c3df3207f176a1b41576ee2a66968a507b3db", + "reference": "443c3df3207f176a1b41576ee2a66968a507b3db", "shasum": "" }, "require": { - "nikic/php-parser": "^1.2|^2.0", + "nikic/php-parser": "^1.2|^2.0|^3.0", "php": ">=5.4", "symfony/polyfill-php56": "^1.0" }, @@ -1114,7 +1114,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-master": "2.3-dev" } }, "autoload": { @@ -1145,20 +1145,20 @@ "serialize", "tokenizer" ], - "time": "2015-12-05 17:17:57" + "time": "2016-12-07T09:37:55+00:00" }, { "name": "laravel/framework", - "version": "v5.2.45", + "version": "v5.3.30", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "2a79f920d5584ec6df7cf996d922a742d11095d1" + "reference": "2d4e8c95f584b38d2279b552e2868fc447b97578" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/2a79f920d5584ec6df7cf996d922a742d11095d1", - "reference": "2a79f920d5584ec6df7cf996d922a742d11095d1", + "url": "https://api.github.com/repos/laravel/framework/zipball/2d4e8c95f584b38d2279b552e2868fc447b97578", + "reference": "2d4e8c95f584b38d2279b552e2868fc447b97578", "shasum": "" }, "require": { @@ -1171,20 +1171,20 @@ "monolog/monolog": "~1.11", "mtdowling/cron-expression": "~1.0", "nesbot/carbon": "~1.20", - "paragonie/random_compat": "~1.4", - "php": ">=5.5.9", - "psy/psysh": "0.7.*", - "swiftmailer/swiftmailer": "~5.1", - "symfony/console": "2.8.*|3.0.*", - "symfony/debug": "2.8.*|3.0.*", - "symfony/finder": "2.8.*|3.0.*", - "symfony/http-foundation": "2.8.*|3.0.*", - "symfony/http-kernel": "2.8.*|3.0.*", - "symfony/polyfill-php56": "~1.0", - "symfony/process": "2.8.*|3.0.*", - "symfony/routing": "2.8.*|3.0.*", - "symfony/translation": "2.8.*|3.0.*", - "symfony/var-dumper": "2.8.*|3.0.*", + "paragonie/random_compat": "~1.4|~2.0", + "php": ">=5.6.4", + "psy/psysh": "0.7.*|0.8.*", + "ramsey/uuid": "~3.0", + "swiftmailer/swiftmailer": "~5.4", + "symfony/console": "3.1.*", + "symfony/debug": "3.1.*", + "symfony/finder": "3.1.*", + "symfony/http-foundation": "3.1.*", + "symfony/http-kernel": "3.1.*", + "symfony/process": "3.1.*", + "symfony/routing": "3.1.*", + "symfony/translation": "3.1.*", + "symfony/var-dumper": "3.1.*", "vlucas/phpdotenv": "~2.2" }, "replace": { @@ -1206,6 +1206,7 @@ "illuminate/http": "self.version", "illuminate/log": "self.version", "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", "illuminate/pagination": "self.version", "illuminate/pipeline": "self.version", "illuminate/queue": "self.version", @@ -1222,10 +1223,10 @@ "aws/aws-sdk-php": "~3.0", "mockery/mockery": "~0.9.4", "pda/pheanstalk": "~3.0", - "phpunit/phpunit": "~4.1", + "phpunit/phpunit": "~5.4", "predis/predis": "~1.0", - "symfony/css-selector": "2.8.*|3.0.*", - "symfony/dom-crawler": "2.8.*|3.0.*" + "symfony/css-selector": "3.1.*", + "symfony/dom-crawler": "3.1.*" }, "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", @@ -1237,20 +1238,17 @@ "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (2.8.*|3.0.*).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (2.8.*|3.0.*).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (3.1.*).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (3.1.*).", "symfony/psr-http-message-bridge": "Required to use psr7 bridging features (0.2.*)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.2-dev" + "dev-master": "5.3-dev" } }, "autoload": { - "classmap": [ - "src/Illuminate/Queue/IlluminateQueueClosure.php" - ], "files": [ "src/Illuminate/Foundation/helpers.php", "src/Illuminate/Support/helpers.php" @@ -1266,43 +1264,43 @@ "authors": [ { "name": "Taylor Otwell", - "email": "taylorotwell@gmail.com" + "email": "taylor@laravel.com" } ], "description": "The Laravel Framework.", - "homepage": "http://laravel.com", + "homepage": "https://laravel.com", "keywords": [ "framework", "laravel" ], - "time": "2016-08-26 11:44:52" + "time": "2017-01-26T14:29:55+00:00" }, { "name": "laravelcollective/html", - "version": "v5.2.4", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "3a312d39ffe37da0f57b602618b61fd07c1fcec5" + "reference": "2f7f2e127c6fed47f269ea29ab5efeb8f65e9d35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/3a312d39ffe37da0f57b602618b61fd07c1fcec5", - "reference": "3a312d39ffe37da0f57b602618b61fd07c1fcec5", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/2f7f2e127c6fed47f269ea29ab5efeb8f65e9d35", + "reference": "2f7f2e127c6fed47f269ea29ab5efeb8f65e9d35", "shasum": "" }, "require": { - "illuminate/http": "5.2.*", - "illuminate/routing": "5.2.*", - "illuminate/session": "5.2.*", - "illuminate/support": "5.2.*", - "illuminate/view": "5.2.*", - "php": ">=5.5.9" + "illuminate/http": "5.3.*", + "illuminate/routing": "5.3.*", + "illuminate/session": "5.3.*", + "illuminate/support": "5.3.*", + "illuminate/view": "5.3.*", + "php": ">=5.6.4" }, "require-dev": { - "illuminate/database": "5.2.*", - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~4.0" + "illuminate/database": "5.3.*", + "mockery/mockery": "~0.9.4", + "phpunit/phpunit": "~5.4" }, "type": "library", "autoload": { @@ -1329,7 +1327,7 @@ ], "description": "HTML and Form Builders for the Laravel Framework", "homepage": "http://laravelcollective.com", - "time": "2016-01-27 22:29:54" + "time": "2016-12-13T14:23:36+00:00" }, { "name": "lavary/laravel-menu", @@ -1371,20 +1369,20 @@ "keywords": [ "laravel" ], - "time": "2016-11-11 10:16:37" + "time": "2016-11-11T10:16:37+00:00" }, { "name": "league/flysystem", - "version": "1.0.32", + "version": "1.0.35", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "1b5c4a0031697f46e779a9d1b309c2e1b24daeab" + "reference": "dda7f3ab94158a002d9846a97dc18ebfb7acc062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1b5c4a0031697f46e779a9d1b309c2e1b24daeab", - "reference": "1b5c4a0031697f46e779a9d1b309c2e1b24daeab", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/dda7f3ab94158a002d9846a97dc18ebfb7acc062", + "reference": "dda7f3ab94158a002d9846a97dc18ebfb7acc062", "shasum": "" }, "require": { @@ -1454,20 +1452,20 @@ "sftp", "storage" ], - "time": "2016-10-19 20:38:46" + "time": "2017-02-09T11:33:58+00:00" }, { "name": "maximebf/debugbar", - "version": "v1.13.0", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "5f49a5ed6cfde81d31d89378806670d77462526e" + "reference": "afee79a236348e39a44cb837106b7c5b4897ac2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/5f49a5ed6cfde81d31d89378806670d77462526e", - "reference": "5f49a5ed6cfde81d31d89378806670d77462526e", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/afee79a236348e39a44cb837106b7c5b4897ac2a", + "reference": "afee79a236348e39a44cb837106b7c5b4897ac2a", "shasum": "" }, "require": { @@ -1515,20 +1513,20 @@ "debug", "debugbar" ], - "time": "2016-09-15 14:01:59" + "time": "2017-01-05T08:46:19+00:00" }, { "name": "monolog/monolog", - "version": "1.21.0", + "version": "1.22.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "f42fbdfd53e306bda545845e4dbfd3e72edb4952" + "reference": "bad29cb8d18ab0315e6c477751418a82c850d558" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f42fbdfd53e306bda545845e4dbfd3e72edb4952", - "reference": "f42fbdfd53e306bda545845e4dbfd3e72edb4952", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bad29cb8d18ab0315e6c477751418a82c850d558", + "reference": "bad29cb8d18ab0315e6c477751418a82c850d558", "shasum": "" }, "require": { @@ -1539,7 +1537,7 @@ "psr/log-implementation": "1.0.0" }, "require-dev": { - "aws/aws-sdk-php": "^2.4.9", + "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", "graylog2/gelf-php": "~1.0", "jakub-onderka/php-parallel-lint": "0.9", @@ -1593,32 +1591,31 @@ "logging", "psr-3" ], - "time": "2016-07-29 03:23:52" + "time": "2016-11-26T00:15:39+00:00" }, { "name": "mpociot/teamwork", - "version": "3.5.0", + "version": "4.1.0", "source": { "type": "git", "url": "https://github.com/mpociot/teamwork.git", - "reference": "aa17c5bde482d7185fd299218e37ee33cab13535" + "reference": "0c5e6a43399698e4dc09b0adb45a3b977e9a8607" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mpociot/teamwork/zipball/aa17c5bde482d7185fd299218e37ee33cab13535", - "reference": "aa17c5bde482d7185fd299218e37ee33cab13535", + "url": "https://api.github.com/repos/mpociot/teamwork/zipball/0c5e6a43399698e4dc09b0adb45a3b977e9a8607", + "reference": "0c5e6a43399698e4dc09b0adb45a3b977e9a8607", "shasum": "" }, "require": { - "laravel/framework": "~5.0", - "php": ">=5.5.9" + "laravel/framework": "~5.3", + "php": ">=5.6.4" }, "require-dev": { "illuminate/database": "~5.0", "mockery/mockery": "dev-master", - "orchestra/testbench": "~3.0", - "phpunit/phpunit": "~4.1", - "sami/sami": "dev-master" + "orchestra/testbench": "3.3.*@dev", + "phpunit/phpunit": "~4.1" }, "type": "library", "autoload": { @@ -1642,20 +1639,20 @@ "Invite", "Teams" ], - "time": "2016-06-13 20:59:24" + "time": "2016-11-19T12:52:22+00:00" }, { "name": "mtdowling/cron-expression", - "version": "v1.1.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/mtdowling/cron-expression.git", - "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5" + "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", - "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5", + "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad", + "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", "shasum": "" }, "require": { @@ -1666,8 +1663,8 @@ }, "type": "library", "autoload": { - "psr-0": { - "Cron": "src/" + "psr-4": { + "Cron\\": "src/Cron/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1686,30 +1683,36 @@ "cron", "schedule" ], - "time": "2016-01-26 21:23:30" + "time": "2017-01-23T04:29:33+00:00" }, { "name": "nesbot/carbon", - "version": "1.21.0", + "version": "1.22.1", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7" + "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7b08ec6f75791e130012f206e3f7b0e76e18e3d7", - "reference": "7b08ec6f75791e130012f206e3f7b0e76e18e3d7", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", + "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc", "shasum": "" }, "require": { "php": ">=5.3.0", - "symfony/translation": "~2.6|~3.0" + "symfony/translation": "~2.6 || ~3.0" }, "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" + "friendsofphp/php-cs-fixer": "~2", + "phpunit/phpunit": "~4.0 || ~5.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.23-dev" + } + }, "autoload": { "psr-4": { "Carbon\\": "src/Carbon/" @@ -1733,28 +1736,28 @@ "datetime", "time" ], - "time": "2015-11-04 20:07:17" + "time": "2017-01-16T07:55:07+00:00" }, { "name": "nikic/php-parser", - "version": "v2.1.1", + "version": "v3.0.4", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4dd659edadffdc2143e4753df655d866dbfeedf0" + "reference": "0bf561dfe75ba80441c22adecc0529056671a7d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4dd659edadffdc2143e4753df655d866dbfeedf0", - "reference": "4dd659edadffdc2143e4753df655d866dbfeedf0", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0bf561dfe75ba80441c22adecc0529056671a7d2", + "reference": "0bf561dfe75ba80441c22adecc0529056671a7d2", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=5.4" + "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "phpunit/phpunit": "~4.0|~5.0" }, "bin": [ "bin/php-parse" @@ -1762,7 +1765,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -1784,20 +1787,20 @@ "parser", "php" ], - "time": "2016-09-16 12:04:44" + "time": "2017-02-10T20:20:03+00:00" }, { "name": "paragonie/random_compat", - "version": "v1.4.1", + "version": "v2.0.4", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "c7e26a21ba357863de030f0b9e701c7d04593774" + "reference": "a9b97968bcde1c4de2a5ec6cbd06a0f6c919b46e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/c7e26a21ba357863de030f0b9e701c7d04593774", - "reference": "c7e26a21ba357863de030f0b9e701c7d04593774", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/a9b97968bcde1c4de2a5ec6cbd06a0f6c919b46e", + "reference": "a9b97968bcde1c4de2a5ec6cbd06a0f6c919b46e", "shasum": "" }, "require": { @@ -1832,7 +1835,7 @@ "pseudorandom", "random" ], - "time": "2016-03-18 20:34:03" + "time": "2016-11-07T23:38:38+00:00" }, { "name": "patchwork/utf8", @@ -1891,7 +1894,57 @@ "utf-8", "utf8" ], - "time": "2016-05-18 13:57:10" + "time": "2016-05-18T13:57:10+00:00" + }, + { + "name": "pda/pheanstalk", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/pda/pheanstalk.git", + "reference": "430e77c551479aad0c6ada0450ee844cf656a18b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pda/pheanstalk/zipball/430e77c551479aad0c6ada0450ee844cf656a18b", + "reference": "430e77c551479aad0c6ada0450ee844cf656a18b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Pheanstalk\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Annesley", + "email": "paul@annesley.cc", + "homepage": "http://paul.annesley.cc/", + "role": "Developer" + } + ], + "description": "PHP client for beanstalkd queue", + "homepage": "https://github.com/pda/pheanstalk", + "keywords": [ + "beanstalkd" + ], + "time": "2015-08-07T21:42:41+00:00" }, { "name": "psr/http-message", @@ -1941,7 +1994,7 @@ "request", "response" ], - "time": "2016-08-06 14:39:51" + "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/log", @@ -1988,41 +2041,42 @@ "psr", "psr-3" ], - "time": "2016-10-10 12:19:37" + "time": "2016-10-10T12:19:37+00:00" }, { "name": "psy/psysh", - "version": "v0.7.2", + "version": "v0.8.1", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280" + "reference": "701e8a1cc426ee170f1296f5d9f6b8a26ad25c4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e64e10b20f8d229cac76399e1f3edddb57a0f280", - "reference": "e64e10b20f8d229cac76399e1f3edddb57a0f280", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/701e8a1cc426ee170f1296f5d9f6b8a26ad25c4a", + "reference": "701e8a1cc426ee170f1296f5d9f6b8a26ad25c4a", "shasum": "" }, "require": { "dnoegel/php-xdg-base-dir": "0.1", "jakub-onderka/php-console-highlighter": "0.3.*", - "nikic/php-parser": "^1.2.1|~2.0", + "nikic/php-parser": "~1.3|~2.0|~3.0", "php": ">=5.3.9", "symfony/console": "~2.3.10|^2.4.2|~3.0", "symfony/var-dumper": "~2.7|~3.0" }, "require-dev": { - "fabpot/php-cs-fixer": "~1.5", - "phpunit/phpunit": "~3.7|~4.0|~5.0", - "squizlabs/php_codesniffer": "~2.0", + "friendsofphp/php-cs-fixer": "~1.11", + "hoa/console": "~3.16|~1.14", + "phpunit/phpunit": "~4.4|~5.0", "symfony/finder": "~2.1|~3.0" }, "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-pdo-sqlite": "The doc command requires SQLite to work.", "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", + "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." }, "bin": [ "bin/psysh" @@ -2030,7 +2084,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-develop": "0.8.x-dev" + "dev-develop": "0.9.x-dev" } }, "autoload": { @@ -2060,33 +2114,115 @@ "interactive", "shell" ], - "time": "2016-03-09 05:03:14" + "time": "2017-01-15T17:54:13+00:00" + }, + { + "name": "ramsey/uuid", + "version": "3.5.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "5677cfe02397dd6b58c861870dfaa5d9007d3954" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/5677cfe02397dd6b58c861870dfaa5d9007d3954", + "reference": "5677cfe02397dd6b58c861870dfaa5d9007d3954", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "^1.0|^2.0", + "php": ">=5.4" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "apigen/apigen": "^4.1", + "codeception/aspect-mock": "1.0.0", + "doctrine/annotations": "~1.2.0", + "goaop/framework": "1.0.0-alpha.2", + "ircmaxell/random-lib": "^1.1", + "jakub-onderka/php-parallel-lint": "^0.9.0", + "mockery/mockery": "^0.9.4", + "moontoast/math": "^1.1", + "php-mock/php-mock-phpunit": "^0.3|^1.1", + "phpunit/phpunit": "^4.7|>=5.0 <5.4", + "satooshi/php-coveralls": "^0.6.1", + "squizlabs/php_codesniffer": "^2.3" + }, + "suggest": { + "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", + "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", + "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", + "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marijn Huizendveld", + "email": "marijn.huizendveld@gmail.com" + }, + { + "name": "Thibaud Fabre", + "email": "thibaud@aztech.io" + }, + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", + "homepage": "https://github.com/ramsey/uuid", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "time": "2016-11-22T19:21:44+00:00" }, { "name": "spatie/laravel-activitylog", - "version": "1.10.2", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-activitylog.git", - "reference": "ce43394406af72eb3d8a03a16ca0cd1e4ec5faf0" + "reference": "9c683e38eeb0dc028f5453acda7a552c7acdaaf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/ce43394406af72eb3d8a03a16ca0cd1e4ec5faf0", - "reference": "ce43394406af72eb3d8a03a16ca0cd1e4ec5faf0", + "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/9c683e38eeb0dc028f5453acda7a552c7acdaaf9", + "reference": "9c683e38eeb0dc028f5453acda7a552c7acdaaf9", "shasum": "" }, "require": { - "illuminate/config": "~5.2.0|~5.3.0", - "illuminate/database": "~5.2.6|~5.3.0", - "illuminate/support": "~5.2.0|~5.3.0", + "illuminate/config": "~5.3.0|~5.4.0", + "illuminate/database": "~5.3.0|~5.4.0", + "illuminate/support": "~5.3.0|~5.4.0", "php": "^7.0", "spatie/string": "^2.1" }, "require-dev": { - "orchestra/database": "3.3.x-dev", - "orchestra/testbench": "3.3.x-dev", - "phpunit/phpunit": "5.*" + "orchestra/database": "~3.3.0|~3.4.0", + "orchestra/testbench": "~3.3.0|~3.4.0", + "phpunit/phpunit": "^5.7" }, "type": "library", "autoload": { @@ -2124,20 +2260,20 @@ "spatie", "user" ], - "time": "2016-11-20 15:08:50" + "time": "2017-02-12T17:38:29+00:00" }, { "name": "spatie/string", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/spatie/string.git", - "reference": "42b433803942494ee96dabd8f763f5b455e8de1a" + "reference": "5435f8095a6c2f4ac67cbc9a1fbc116197863144" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/string/zipball/42b433803942494ee96dabd8f763f5b455e8de1a", - "reference": "42b433803942494ee96dabd8f763f5b455e8de1a", + "url": "https://api.github.com/repos/spatie/string/zipball/5435f8095a6c2f4ac67cbc9a1fbc116197863144", + "reference": "5435f8095a6c2f4ac67cbc9a1fbc116197863144", "shasum": "" }, "require": { @@ -2177,27 +2313,28 @@ "spatie", "string" ], - "time": "2016-10-04 15:31:55" + "time": "2016-12-01T13:46:28+00:00" }, { "name": "swiftmailer/swiftmailer", - "version": "v5.4.4", + "version": "v5.4.6", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "545ce9136690cea74f98f86fbb9c92dd9ab1a756" + "reference": "81fdccfaf8bdc5d5d7a1ef6bb3a61bbb1a6c4a3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/545ce9136690cea74f98f86fbb9c92dd9ab1a756", - "reference": "545ce9136690cea74f98f86fbb9c92dd9ab1a756", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/81fdccfaf8bdc5d5d7a1ef6bb3a61bbb1a6c4a3e", + "reference": "81fdccfaf8bdc5d5d7a1ef6bb3a61bbb1a6c4a3e", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { - "mockery/mockery": "~0.9.1" + "mockery/mockery": "~0.9.1", + "symfony/phpunit-bridge": "~3.2" }, "type": "library", "extra": { @@ -2230,24 +2367,25 @@ "mail", "mailer" ], - "time": "2016-11-24 01:01:23" + "time": "2017-02-13T07:52:53+00:00" }, { "name": "symfony/console", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "926061e74229e935d3c5b4e9ba87237316c6693f" + "reference": "047f16485d68c083bd5d9b73ff16f9cb9c1a9f52" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/926061e74229e935d3c5b4e9ba87237316c6693f", - "reference": "926061e74229e935d3c5b4e9ba87237316c6693f", + "url": "https://api.github.com/repos/symfony/console/zipball/047f16485d68c083bd5d9b73ff16f9cb9c1a9f52", + "reference": "047f16485d68c083bd5d9b73ff16f9cb9c1a9f52", "shasum": "" }, "require": { "php": ">=5.5.9", + "symfony/debug": "~2.8|~3.0", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { @@ -2263,7 +2401,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -2290,20 +2428,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2016-07-30 07:22:48" + "time": "2017-01-08T20:43:43+00:00" }, { "name": "symfony/debug", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a" + "reference": "c6661361626b3cf5cf2089df98b3b5006a197e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/697c527acd9ea1b2d3efac34d9806bf255278b0a", - "reference": "697c527acd9ea1b2d3efac34d9806bf255278b0a", + "url": "https://api.github.com/repos/symfony/debug/zipball/c6661361626b3cf5cf2089df98b3b5006a197e85", + "reference": "c6661361626b3cf5cf2089df98b3b5006a197e85", "shasum": "" }, "require": { @@ -2320,7 +2458,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -2347,20 +2485,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2016-07-30 07:22:48" + "time": "2017-01-28T00:04:57+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.1.7", + "version": "v3.2.3", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc" + "reference": "9137eb3a3328e413212826d63eeeb0217836e2b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/28b0832b2553ffb80cabef6a7a812ff1e670c0bc", - "reference": "28b0832b2553ffb80cabef6a7a812ff1e670c0bc", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9137eb3a3328e413212826d63eeeb0217836e2b6", + "reference": "9137eb3a3328e413212826d63eeeb0217836e2b6", "shasum": "" }, "require": { @@ -2380,7 +2518,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -2407,20 +2545,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2016-10-13 06:28:43" + "time": "2017-01-02T20:32:22+00:00" }, { "name": "symfony/finder", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9" + "reference": "59687a255d1562f2c17b012418273862083d85f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9", - "reference": "3eb4e64c6145ef8b92adefb618a74ebdde9e3fe9", + "url": "https://api.github.com/repos/symfony/finder/zipball/59687a255d1562f2c17b012418273862083d85f7", + "reference": "59687a255d1562f2c17b012418273862083d85f7", "shasum": "" }, "require": { @@ -2429,7 +2567,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -2456,20 +2594,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2016-06-29 05:40:00" + "time": "2017-01-02T20:31:54+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "49ba00f8ede742169cb6b70abe33243f4d673f82" + "reference": "cef0ad49a2e90455cfc649522025b5a2929648c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49ba00f8ede742169cb6b70abe33243f4d673f82", - "reference": "49ba00f8ede742169cb6b70abe33243f4d673f82", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/cef0ad49a2e90455cfc649522025b5a2929648c0", + "reference": "cef0ad49a2e90455cfc649522025b5a2929648c0", "shasum": "" }, "require": { @@ -2482,7 +2620,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -2509,20 +2647,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2016-07-17 13:54:30" + "time": "2017-01-08T20:43:43+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "d97ba4425e36e79c794e7d14ff36f00f081b37b3" + "reference": "c830387dec1b48c100473d10a6a356c3c3ae2a13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d97ba4425e36e79c794e7d14ff36f00f081b37b3", - "reference": "d97ba4425e36e79c794e7d14ff36f00f081b37b3", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/c830387dec1b48c100473d10a6a356c3c3ae2a13", + "reference": "c830387dec1b48c100473d10a6a356c3c3ae2a13", "shasum": "" }, "require": { @@ -2530,7 +2668,7 @@ "psr/log": "~1.0", "symfony/debug": "~2.8|~3.0", "symfony/event-dispatcher": "~2.8|~3.0", - "symfony/http-foundation": "~2.8.8|~3.0.8|~3.1.2|~3.2" + "symfony/http-foundation": "~2.8.13|~3.1.6|~3.2" }, "conflict": { "symfony/config": "<2.8" @@ -2564,7 +2702,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -2591,7 +2729,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2016-07-30 09:10:37" + "time": "2017-01-28T02:53:17+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -2650,7 +2788,7 @@ "portable", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-php56", @@ -2706,7 +2844,7 @@ "portable", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/polyfill-util", @@ -2758,20 +2896,20 @@ "polyfill", "shim" ], - "time": "2016-11-14 01:06:16" + "time": "2016-11-14T01:06:16+00:00" }, { "name": "symfony/process", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "768debc5996f599c4372b322d9061dba2a4bf505" + "reference": "2605753c5f8c531623d24d002825ebb1d6a22248" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/768debc5996f599c4372b322d9061dba2a4bf505", - "reference": "768debc5996f599c4372b322d9061dba2a4bf505", + "url": "https://api.github.com/repos/symfony/process/zipball/2605753c5f8c531623d24d002825ebb1d6a22248", + "reference": "2605753c5f8c531623d24d002825ebb1d6a22248", "shasum": "" }, "require": { @@ -2780,7 +2918,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -2807,20 +2945,20 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2016-07-28 11:13:34" + "time": "2017-01-21T17:13:55+00:00" }, { "name": "symfony/routing", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "9038984bd9c05ab07280121e9e10f61a7231457b" + "reference": "f25581d4eb0a82962c291917f826166f0dcd8a9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/9038984bd9c05ab07280121e9e10f61a7231457b", - "reference": "9038984bd9c05ab07280121e9e10f61a7231457b", + "url": "https://api.github.com/repos/symfony/routing/zipball/f25581d4eb0a82962c291917f826166f0dcd8a9a", + "reference": "f25581d4eb0a82962c291917f826166f0dcd8a9a", "shasum": "" }, "require": { @@ -2849,7 +2987,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -2882,20 +3020,20 @@ "uri", "url" ], - "time": "2016-06-29 05:40:00" + "time": "2017-01-28T00:04:57+00:00" }, { "name": "symfony/translation", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26" + "reference": "d5a20fab5f63f44c233c69b3041c3cb1d4945e45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/eee6c664853fd0576f21ae25725cfffeafe83f26", - "reference": "eee6c664853fd0576f21ae25725cfffeafe83f26", + "url": "https://api.github.com/repos/symfony/translation/zipball/d5a20fab5f63f44c233c69b3041c3cb1d4945e45", + "reference": "d5a20fab5f63f44c233c69b3041c3cb1d4945e45", "shasum": "" }, "require": { @@ -2919,7 +3057,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -2946,20 +3084,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2016-07-30 07:22:48" + "time": "2017-01-21T17:01:39+00:00" }, { "name": "symfony/var-dumper", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "1f7e071aafc6676fcb6e3f0497f87c2397247377" + "reference": "16df11647e5b992d687cb4eeeb9a882d5f5c26b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1f7e071aafc6676fcb6e3f0497f87c2397247377", - "reference": "1f7e071aafc6676fcb6e3f0497f87c2397247377", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/16df11647e5b992d687cb4eeeb9a882d5f5c26b9", + "reference": "16df11647e5b992d687cb4eeeb9a882d5f5c26b9", "shasum": "" }, "require": { @@ -2975,7 +3113,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -3009,7 +3147,7 @@ "debug", "dump" ], - "time": "2016-07-26 08:03:56" + "time": "2017-01-24T13:02:38+00:00" }, { "name": "vlucas/phpdotenv", @@ -3059,7 +3197,7 @@ "env", "environment" ], - "time": "2016-09-01 10:05:43" + "time": "2016-09-01T10:05:43+00:00" }, { "name": "xinax/laravel-gettext", @@ -3113,7 +3251,7 @@ "poEdit", "translation" ], - "time": "2016-03-10 13:02:54" + "time": "2016-03-10T13:02:54+00:00" } ], "packages-dev": [ @@ -3169,7 +3307,7 @@ "constructor", "instantiate" ], - "time": "2015-06-14 21:17:01" + "time": "2015-06-14T21:17:01+00:00" }, { "name": "fzaninotto/faker", @@ -3217,7 +3355,7 @@ "faker", "fixtures" ], - "time": "2016-04-29 12:21:54" + "time": "2016-04-29T12:21:54+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -3262,20 +3400,20 @@ "keywords": [ "test" ], - "time": "2015-05-11 14:41:42" + "time": "2015-05-11T14:41:42+00:00" }, { "name": "mockery/mockery", - "version": "0.9.6", + "version": "0.9.8", "source": { "type": "git", "url": "https://github.com/padraic/mockery.git", - "reference": "65d4ca18e15cb02eeb1e5336f884e46b9b905be0" + "reference": "1e5e2ffdc4d71d7358ed58a6fdd30a4a0c506855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/padraic/mockery/zipball/65d4ca18e15cb02eeb1e5336f884e46b9b905be0", - "reference": "65d4ca18e15cb02eeb1e5336f884e46b9b905be0", + "url": "https://api.github.com/repos/padraic/mockery/zipball/1e5e2ffdc4d71d7358ed58a6fdd30a4a0c506855", + "reference": "1e5e2ffdc4d71d7358ed58a6fdd30a4a0c506855", "shasum": "" }, "require": { @@ -3327,7 +3465,7 @@ "test double", "testing" ], - "time": "2016-09-30 12:09:40" + "time": "2017-02-09T13:29:38+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -3381,7 +3519,7 @@ "reflection", "static analysis" ], - "time": "2015-12-27 11:43:31" + "time": "2015-12-27T11:43:31+00:00" }, { "name": "phpdocumentor/reflection-docblock", @@ -3426,20 +3564,20 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2016-09-30 07:12:33" + "time": "2016-09-30T07:12:33+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.2", + "version": "0.2.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443" + "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443", - "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", + "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", "shasum": "" }, "require": { @@ -3473,7 +3611,7 @@ "email": "me@mikevanriel.com" } ], - "time": "2016-06-10 07:14:17" + "time": "2016-11-25T06:54:22+00:00" }, { "name": "phpspec/prophecy", @@ -3536,7 +3674,7 @@ "spy", "stub" ], - "time": "2016-11-21 14:58:47" + "time": "2016-11-21T14:58:47+00:00" }, { "name": "phpunit/php-code-coverage", @@ -3598,20 +3736,20 @@ "testing", "xunit" ], - "time": "2015-10-06 15:47:00" + "time": "2015-10-06T15:47:00+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "1.4.1", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", - "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", "shasum": "" }, "require": { @@ -3645,7 +3783,7 @@ "filesystem", "iterator" ], - "time": "2015-06-21 13:08:43" + "time": "2016-10-03T07:40:28+00:00" }, { "name": "phpunit/php-text-template", @@ -3686,7 +3824,7 @@ "keywords": [ "template" ], - "time": "2015-06-21 13:50:34" + "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", @@ -3730,7 +3868,7 @@ "keywords": [ "timer" ], - "time": "2016-05-12 18:03:57" + "time": "2016-05-12T18:03:57+00:00" }, { "name": "phpunit/php-token-stream", @@ -3779,20 +3917,20 @@ "keywords": [ "tokenizer" ], - "time": "2016-11-15 14:06:22" + "time": "2016-11-15T14:06:22+00:00" }, { "name": "phpunit/phpunit", - "version": "4.8.29", + "version": "4.8.35", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f19d481b468b76a7fb55eb2b772ed487e484891e" + "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f19d481b468b76a7fb55eb2b772ed487e484891e", - "reference": "f19d481b468b76a7fb55eb2b772ed487e484891e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/791b1a67c25af50e230f841ee7a9c6eba507dc87", + "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87", "shasum": "" }, "require": { @@ -3851,7 +3989,7 @@ "testing", "xunit" ], - "time": "2016-11-20 10:35:28" + "time": "2017-02-06T05:18:07+00:00" }, { "name": "phpunit/phpunit-mock-objects", @@ -3907,20 +4045,20 @@ "mock", "xunit" ], - "time": "2015-10-02 06:51:40" + "time": "2015-10-02T06:51:40+00:00" }, { "name": "sebastian/comparator", - "version": "1.2.2", + "version": "1.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f" + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f", - "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", "shasum": "" }, "require": { @@ -3971,7 +4109,7 @@ "compare", "equality" ], - "time": "2016-11-19 09:18:40" + "time": "2017-01-29T09:50:25+00:00" }, { "name": "sebastian/diff", @@ -4023,7 +4161,7 @@ "keywords": [ "diff" ], - "time": "2015-12-08 07:14:41" + "time": "2015-12-08T07:14:41+00:00" }, { "name": "sebastian/environment", @@ -4073,7 +4211,7 @@ "environment", "hhvm" ], - "time": "2016-08-18 05:49:44" + "time": "2016-08-18T05:49:44+00:00" }, { "name": "sebastian/exporter", @@ -4140,7 +4278,7 @@ "export", "exporter" ], - "time": "2016-06-17 09:04:28" + "time": "2016-06-17T09:04:28+00:00" }, { "name": "sebastian/global-state", @@ -4191,7 +4329,7 @@ "keywords": [ "global state" ], - "time": "2015-10-12 03:26:01" + "time": "2015-10-12T03:26:01+00:00" }, { "name": "sebastian/recursion-context", @@ -4244,7 +4382,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-11-11 19:50:13" + "time": "2015-11-11T19:50:13+00:00" }, { "name": "sebastian/version", @@ -4279,20 +4417,20 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2015-06-21 13:59:46" + "time": "2015-06-21T13:59:46+00:00" }, { "name": "symfony/css-selector", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "b8999c1f33c224b2b66b38253f5e3a838d0d0115" + "reference": "722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/b8999c1f33c224b2b66b38253f5e3a838d0d0115", - "reference": "b8999c1f33c224b2b66b38253f5e3a838d0d0115", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d", + "reference": "722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d", "shasum": "" }, "require": { @@ -4301,7 +4439,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -4332,20 +4470,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2016-06-29 05:40:00" + "time": "2017-01-02T20:31:54+00:00" }, { "name": "symfony/dom-crawler", - "version": "v3.0.9", + "version": "v3.1.10", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "dff8fecf1f56990d88058e3a1885c2a5f1b8e970" + "reference": "7eede2a901a19928494194f7d1815a77b9a473a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/dff8fecf1f56990d88058e3a1885c2a5f1b8e970", - "reference": "dff8fecf1f56990d88058e3a1885c2a5f1b8e970", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7eede2a901a19928494194f7d1815a77b9a473a0", + "reference": "7eede2a901a19928494194f7d1815a77b9a473a0", "shasum": "" }, "require": { @@ -4361,7 +4499,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -4388,29 +4526,35 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2016-07-30 07:22:48" + "time": "2017-01-21T17:13:55+00:00" }, { "name": "symfony/yaml", - "version": "v3.1.7", + "version": "v3.2.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "9da375317228e54f4ea1b013b30fa47417e84943" + "reference": "e1718c6bf57e1efbb8793ada951584b2ab27775b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/9da375317228e54f4ea1b013b30fa47417e84943", - "reference": "9da375317228e54f4ea1b013b30fa47417e84943", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e1718c6bf57e1efbb8793ada951584b2ab27775b", + "reference": "e1718c6bf57e1efbb8793ada951584b2ab27775b", "shasum": "" }, "require": { "php": ">=5.5.9" }, + "require-dev": { + "symfony/console": "~2.8|~3.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -4437,7 +4581,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2016-11-18 21:05:29" + "time": "2017-01-21T17:06:35+00:00" }, { "name": "webmozart/assert", @@ -4487,7 +4631,7 @@ "check", "validate" ], - "time": "2016-11-23 20:04:58" + "time": "2016-11-23T20:04:58+00:00" } ], "aliases": [], diff --git a/config/app.php b/config/app.php index 9a1245d..1103295 100644 --- a/config/app.php +++ b/config/app.php @@ -2,6 +2,18 @@ return [ + /* + |-------------------------------------------------------------------------- + | Application Name + |-------------------------------------------------------------------------- + | + | This value is the name of your application. This value is used when the + | framework needs to place the application's name in a notification or + | any other location as required by the application or its packages. + */ + + 'name' => 'Beacon Bacon', + /* |-------------------------------------------------------------------------- | Application Environment @@ -149,6 +161,8 @@ Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, + Illuminate\Notifications\NotificationServiceProvider::class, + /* * Application Service Providers... @@ -197,6 +211,7 @@ 'Lang' => Illuminate\Support\Facades\Lang::class, 'Log' => Illuminate\Support\Facades\Log::class, 'Mail' => Illuminate\Support\Facades\Mail::class, + 'Notification' => Illuminate\Support\Facades\Notification::class, 'Password' => Illuminate\Support\Facades\Password::class, 'Queue' => Illuminate\Support\Facades\Queue::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class, diff --git a/config/queue.php b/config/queue.php index b4ae796..1bbc7ca 100644 --- a/config/queue.php +++ b/config/queue.php @@ -15,7 +15,7 @@ | */ - 'default' => env('QUEUE_DRIVER', 'sync'), + 'default' => env('QUEUE_DRIVER', 'database'), /* |-------------------------------------------------------------------------- diff --git a/config/services.php b/config/services.php index fcefa60..f3d8e2e 100644 --- a/config/services.php +++ b/config/services.php @@ -40,7 +40,8 @@ ], 'kontakt' => [ - 'key' => env('KONTAKT_KEY') + 'key' => env('KONTAKT_KEY'), + 'version' => env('KONTAKT_VERSION') ], 'ims' => [ diff --git a/database/migrations/2017_02_07_144323_add_column_findable_custom.php b/database/migrations/2017_02_07_144323_add_column_findable_custom.php new file mode 100644 index 0000000..20142d6 --- /dev/null +++ b/database/migrations/2017_02_07_144323_add_column_findable_custom.php @@ -0,0 +1,32 @@ +string('custom_file'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('findables', function (Blueprint $table) { + $table->dropColumn('custom_file'); + }); + } +} diff --git a/database/migrations/2017_02_08_132037_make_findable_identifier_unique.php b/database/migrations/2017_02_08_132037_make_findable_identifier_unique.php new file mode 100644 index 0000000..c5780df --- /dev/null +++ b/database/migrations/2017_02_08_132037_make_findable_identifier_unique.php @@ -0,0 +1,32 @@ +string('identifier')->unique()->change(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('findables', function (Blueprint $table) { + $table->string('identifier')->change(); + }); + } +} diff --git a/database/migrations/2017_02_09_143300_Add_identifiers_place.php b/database/migrations/2017_02_09_143300_Add_identifiers_place.php new file mode 100644 index 0000000..e4d61aa --- /dev/null +++ b/database/migrations/2017_02_09_143300_Add_identifiers_place.php @@ -0,0 +1,40 @@ +renameColumn('identifier', 'identifier1'); + $table->string('identifier5')->after('identifier'); + $table->string('identifier4')->after('identifier'); + $table->string('identifier3')->after('identifier'); + $table->string('identifier2')->after('identifier'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('places', function (Blueprint $table) { + $table->renameColumn('identifier1', 'identifier'); + $table->dropColumn('identifier2'); + $table->dropColumn('identifier3'); + $table->dropColumn('identifier4'); + $table->dropColumn('identifier5'); + }); + } +} diff --git a/database/migrations/2017_02_18_131725_add_draw_type_location.php b/database/migrations/2017_02_18_131725_add_draw_type_location.php new file mode 100644 index 0000000..4176d94 --- /dev/null +++ b/database/migrations/2017_02_18_131725_add_draw_type_location.php @@ -0,0 +1,32 @@ +string('draw_type')->after('parameter_five'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('locations', function (Blueprint $table) { + $table->dropColumn('draw_type'); + }); + } +} diff --git a/database/migrations/2017_02_19_093718_change_column_names_place.php b/database/migrations/2017_02_19_093718_change_column_names_place.php new file mode 100644 index 0000000..0dce562 --- /dev/null +++ b/database/migrations/2017_02_19_093718_change_column_names_place.php @@ -0,0 +1,40 @@ +renameColumn('identifier1', 'identifier_one'); + $table->renameColumn('identifier2', 'identifier_two'); + $table->renameColumn('identifier3', 'identifier_three'); + $table->renameColumn('identifier4', 'identifier_four'); + $table->renameColumn('identifier5', 'identifier_five'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('places', function (Blueprint $table) { + $table->renameColumn('identifier_one', 'identifier1'); + $table->renameColumn('identifier_two', 'identifier2'); + $table->renameColumn('identifier_three', 'identifier3'); + $table->renameColumn('identifier_four', 'identifier4'); + $table->renameColumn('identifier_five', 'identifier5'); + }); + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index e119db6..37daab7 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -11,6 +11,7 @@ class DatabaseSeeder extends Seeder */ public function run() { + // $this->call(UsersTableSeeder::class); } } diff --git a/public/foo.jpg b/public/foo.jpg new file mode 100644 index 0000000..f5e7443 Binary files /dev/null and b/public/foo.jpg differ diff --git a/resources/views/auth/full.blade.php b/resources/views/auth/full.blade.php new file mode 100644 index 0000000..4a5a962 --- /dev/null +++ b/resources/views/auth/full.blade.php @@ -0,0 +1,24 @@ +@extends('layouts.auth') + +@section('htmlheader_title') + Team Capacity Reached +@endsection + +@section('content') + +
+ +
+
+

Team capacity reached

+

You will need an invitation in order to register

+

If you are the system administrator, you can also raise the team limit

+

If you already have a profile, click the link below

+ Log in
+
+
+
+ +@endsection diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index a3fdb6b..187c6db 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -3,63 +3,61 @@ @section('htmlheader_title') Log in @endsection - @section('content') - +
+ @if (count($errors) > 0) +
+ Whoops! There were some problems with your input.

+ +
+ @endif - @if (count($errors) > 0) -
- Whoops! There were some problems with your input.

- -
- @endif - -
- @if(session()->has('invite_token')) - - @else - - @endif -
- -
- - -
-
- - -
-
-
-
- + -
- -
-
- - - {{-- @include('auth.partials.social_login') --}} - - I forgot my password
- Register a new account +
+ + +
+
+
+
+ +
+
+
+ +
+
+ -
+ {{-- @include('auth.partials.social_login') --}} + I forgot my password
+ @if (!empty($allowTeam) && $allowTeam) + Register a new account + @endif +
-
+
@include('layouts.partials.scripts_auth') @@ -72,6 +70,6 @@ }); }); - + @endsection diff --git a/resources/views/blocks/edit.blade.php b/resources/views/blocks/edit.blade.php index ef95391..8423fc0 100644 --- a/resources/views/blocks/edit.blade.php +++ b/resources/views/blocks/edit.blade.php @@ -34,7 +34,7 @@
@if($block->image) - + @endif {!! Form::file('image', null, ['class' => 'form-control']) !!}
diff --git a/resources/views/blocks/show.blade.php b/resources/views/blocks/show.blade.php index bc2d8f4..af43090 100644 --- a/resources/views/blocks/show.blade.php +++ b/resources/views/blocks/show.blade.php @@ -40,7 +40,7 @@
@if($poi->icon) - + @endif
diff --git a/resources/views/findable/create.blade.php b/resources/views/findable/create.blade.php index 13f4604..648f749 100644 --- a/resources/views/findable/create.blade.php +++ b/resources/views/findable/create.blade.php @@ -3,108 +3,114 @@ @section('contentheader_title', 'Create Findable') @section('breadcrumbs') - + @endsection @section('content') -
-
-
-
-

Details

-
- {!! Form::open(['route' => 'findables.store', 'method' => 'POST', 'class' => 'form-horizontal']) !!} -
- -
- {!! Form::label('name', 'Name', ['class' => 'col-sm-2 control-label']) !!} - -
- {!! Form::text('name', null, ['class' => 'form-control', 'placeholder' => 'Enter name']) !!} -
-
- -
- {!! Form::label('identifier', 'Identifier', ['class' => 'col-sm-2 control-label']) !!} - -
- {!! Form::text('identifier', null, ['class' => 'form-control', 'placeholder' => 'Enter identifier']) !!} -
-
- -
- {!! Form::label('parameter_one_name', 'Parameter One Name', ['class' => 'col-sm-2 control-label']) !!} - -
- {!! Form::text('parameter_one_name', null, ['class' => 'form-control', 'placeholder' => 'Enter parameter one name']) !!} -
-
- -
- {!! Form::label('parameter_two_name', 'Parameter Two Name', ['class' => 'col-sm-2 control-label']) !!} - -
- {!! Form::text('parameter_two_name', null, ['class' => 'form-control', 'placeholder' => 'Enter parameter two name']) !!} +
+
+
+
+

Details

+
+ {!! Form::open(['route' => 'findables.store', 'method' => 'POST', 'class' => 'form-horizontal', 'files' => true]) !!} +
+ +
+ {!! Form::label('name', 'Name', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::text('name', null, ['class' => 'form-control', 'placeholder' => 'Enter name']) !!} +
+
+ +
+ {!! Form::label('identifier', 'Identifier', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::text('identifier', null, ['class' => 'form-control', 'placeholder' => 'Enter identifier']) !!} +
+
+ +
+ {!! Form::label('parameter_one_name', 'Parameter One Name', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::text('parameter_one_name', null, ['class' => 'form-control', 'placeholder' => 'Enter parameter one name']) !!} +
+
+ +
+ {!! Form::label('parameter_two_name', 'Parameter Two Name', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::text('parameter_two_name', null, ['class' => 'form-control', 'placeholder' => 'Enter parameter two name']) !!} +
+
+ +
+ {!! Form::label('parameter_three_name', 'Parameter Three Name', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::text('parameter_three_name', null, ['class' => 'form-control', 'placeholder' => 'Enter parameter three name']) !!} +
+
+ +
+ {!! Form::label('parameter_four_name', 'Parameter Four Name', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::text('parameter_four_name', null, ['class' => 'form-control', 'placeholder' => 'Enter parameter four name']) !!} +
+
+ +
+ {!! Form::label('parameter_five_name', 'Parameter Five Name', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::text('parameter_five_name', null, ['class' => 'form-control', 'placeholder' => 'Enter parameter five name']) !!} +
+
+
+ {!! Form::label('custom_file', 'Custom Findable File', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::file('custom_file', null, ['class' => 'form-control']) !!} +
+
+ +
+ + {!! Form::close() !!}
-
- -
- {!! Form::label('parameter_three_name', 'Parameter Three Name', ['class' => 'col-sm-2 control-label']) !!} - -
- {!! Form::text('parameter_three_name', null, ['class' => 'form-control', 'placeholder' => 'Enter parameter three name']) !!} -
-
- -
- {!! Form::label('parameter_four_name', 'Parameter Four Name', ['class' => 'col-sm-2 control-label']) !!} - -
- {!! Form::text('parameter_four_name', null, ['class' => 'form-control', 'placeholder' => 'Enter parameter four name']) !!} -
-
- -
- {!! Form::label('parameter_five_name', 'Parameter Five Name', ['class' => 'col-sm-2 control-label']) !!} - -
- {!! Form::text('parameter_five_name', null, ['class' => 'form-control', 'placeholder' => 'Enter parameter five name']) !!} -
-
- -
- - {!! Form::close() !!} -
-
-
+
@endsection @section('footer') - + @endsection \ No newline at end of file diff --git a/resources/views/findable/edit.blade.php b/resources/views/findable/edit.blade.php index 6e503bc..bb30ee8 100644 --- a/resources/views/findable/edit.blade.php +++ b/resources/views/findable/edit.blade.php @@ -3,87 +3,93 @@ @section('contentheader_title', 'Edit Findable') @section('breadcrumbs') - + @endsection @section('content') -
-
-
-
-

Details

-
- {!! Form::open(['route' => ['findables.update', $findable->id], 'method' => 'PUT', 'class' => 'form-horizontal']) !!} -
+
+
+
+
+

Details

+
+ {!! Form::open(['route' => ['findables.update', $findable->id], 'method' => 'PUT', 'class' => 'form-horizontal','files' => true]) !!} +
-
- {!! Form::label('name', 'Name', ['class' => 'col-sm-2 control-label']) !!} +
+ {!! Form::label('name', 'Name', ['class' => 'col-sm-2 control-label']) !!} -
- {!! Form::text('name', $findable->name, ['class' => 'form-control', 'placeholder' => 'Enter name']) !!} -
-
+
+ {!! Form::text('name', $findable->name, ['class' => 'form-control', 'placeholder' => 'Enter name']) !!} +
+
-
- {!! Form::label('identifier', 'Identifier', ['class' => 'col-sm-2 control-label']) !!} +
+ {!! Form::label('identifier', 'Identifier', ['class' => 'col-sm-2 control-label']) !!} -
- {!! Form::text('identifier', $findable->identifier, ['class' => 'form-control', 'placeholder' => 'Enter identifier']) !!} -
-
+
+ {!! Form::text('identifier', $findable->identifier, ['class' => 'form-control', 'placeholder' => 'Enter identifier']) !!} +
+
-
- {!! Form::label('parameter_one_name', 'Parameter One Name', ['class' => 'col-sm-2 control-label']) !!} +
+ {!! Form::label('parameter_one_name', 'Parameter One Name', ['class' => 'col-sm-2 control-label']) !!} -
- {!! Form::text('parameter_one_name', $findable->parameter_one_name, ['class' => 'form-control', 'placeholder' => 'Enter parameter one name']) !!} -
-
- -
- {!! Form::label('parameter_two_name', 'Parameter Two Name', ['class' => 'col-sm-2 control-label']) !!} +
+ {!! Form::text('parameter_one_name', $findable->parameter_one_name, ['class' => 'form-control', 'placeholder' => 'Enter parameter one name']) !!} +
+
-
- {!! Form::text('parameter_two_name', $findable->parameter_two_name, ['class' => 'form-control', 'placeholder' => 'Enter parameter two name']) !!} -
-
- -
- {!! Form::label('parameter_three_name', 'Parameter Three Name', ['class' => 'col-sm-2 control-label']) !!} +
+ {!! Form::label('parameter_two_name', 'Parameter Two Name', ['class' => 'col-sm-2 control-label']) !!} -
- {!! Form::text('parameter_three_name', $findable->parameter_three_name, ['class' => 'form-control', 'placeholder' => 'Enter parameter three name']) !!} -
-
- -
- {!! Form::label('parameter_four_name', 'Parameter Four Name', ['class' => 'col-sm-2 control-label']) !!} +
+ {!! Form::text('parameter_two_name', $findable->parameter_two_name, ['class' => 'form-control', 'placeholder' => 'Enter parameter two name']) !!} +
+
-
- {!! Form::text('parameter_four_name', $findable->parameter_four_name, ['class' => 'form-control', 'placeholder' => 'Enter parameter four name']) !!} -
-
- -
- {!! Form::label('parameter_five_name', 'Parameter Five Name', ['class' => 'col-sm-2 control-label']) !!} +
+ {!! Form::label('parameter_three_name', 'Parameter Three Name', ['class' => 'col-sm-2 control-label']) !!} -
- {!! Form::text('parameter_five_name', $findable->parameter_five_name, ['class' => 'form-control', 'placeholder' => 'Enter parameter five name']) !!} -
-
+
+ {!! Form::text('parameter_three_name', $findable->parameter_three_name, ['class' => 'form-control', 'placeholder' => 'Enter parameter three name']) !!} +
+
+
+ {!! Form::label('parameter_four_name', 'Parameter Four Name', ['class' => 'col-sm-2 control-label']) !!} +
+ {!! Form::text('parameter_four_name', $findable->parameter_four_name, ['class' => 'form-control', 'placeholder' => 'Enter parameter four name']) !!} +
+
+ +
+ {!! Form::label('parameter_five_name', 'Parameter Five Name', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::text('parameter_five_name', $findable->parameter_five_name, ['class' => 'form-control', 'placeholder' => 'Enter parameter five name']) !!} +
+
+
+ {!! Form::label('custom_file', 'Custom Findable File', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::file('custom_file', null, ['class' => 'form-control']) !!} +
+
+ +
+ + {!! Form::close() !!} +
- - {!! Form::close() !!} -
-
-
+
@endsection \ No newline at end of file diff --git a/resources/views/floors/edit.blade.php b/resources/views/floors/edit.blade.php index ccbb94d..03ac1f4 100644 --- a/resources/views/floors/edit.blade.php +++ b/resources/views/floors/edit.blade.php @@ -48,7 +48,7 @@
@if($floor->image) - + @endif {!! Form::file('image', null, ['class' => 'form-control']) !!}
diff --git a/resources/views/floors/show.blade.php b/resources/views/floors/show.blade.php index 2f11302..9a9a8be 100644 --- a/resources/views/floors/show.blade.php +++ b/resources/views/floors/show.blade.php @@ -66,7 +66,7 @@ {{ $floor->map_height_in_centimeters }}cm -
+
{{ $floor->map_pixel_to_centimeter_ratio }} ratio
@@ -177,22 +177,23 @@
@if($floor->image) -
+
@foreach($floor->locations as $index => $location) @if($location->poi && $location->poi->type == 'icon' ) - - + + @elseif($location->poi && $location->poi->type == 'area' ) @elseif($location->type == 'beacon') - @elseif($location->type == 'findable') + @elseif($location->type == 'findable' && ($location->draw_type == 'point' || empty($location->draw_type))) - @endif - + @elseif($location->type == 'findable' && $location->draw_type == 'area' ) + + @endif @endforeach
@endif diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index fe2e835..b38ac75 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -44,7 +44,7 @@
- @if(count($errors)) + @if(isset($errors) && count($errors))

Whoops! There were some problems with your input.

    diff --git a/resources/views/locations/create/findable.blade.php b/resources/views/locations/create/findable.blade.php index 8cba93b..767e4dc 100644 --- a/resources/views/locations/create/findable.blade.php +++ b/resources/views/locations/create/findable.blade.php @@ -42,6 +42,14 @@
+
+ {!! Form::label('draw_type', 'Type', ['class' => 'col-sm-2 control-label']) !!} + +
+ {!! Form::select('draw_type', $types, null, ['class' => 'form-control']) !!} +
+
+