From 7149647b729b2aa30d76346a7cc3da37c1c692ca Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 13 May 2019 15:50:36 +0200 Subject: Initial commit. --- app/Console/Kernel.php | 42 +++++++ app/Exceptions/Handler.php | 53 +++++++++ .../Controllers/Auth/ForgotPasswordController.php | 32 +++++ app/Http/Controllers/Auth/LoginController.php | 39 ++++++ app/Http/Controllers/Auth/RegisterController.php | 71 +++++++++++ .../Controllers/Auth/ResetPasswordController.php | 39 ++++++ app/Http/Controllers/Controller.php | 13 ++ app/Http/Controllers/IndexController.php | 40 +++++++ app/Http/Controllers/LookupController.php | 26 ++++ app/Http/Controllers/OfferController.php | 95 +++++++++++++++ app/Http/Controllers/RSSController.php | 132 +++++++++++++++++++++ app/Http/Controllers/SearchController.php | 80 +++++++++++++ app/Http/Kernel.php | 62 ++++++++++ app/Http/Middleware/EncryptCookies.php | 17 +++ app/Http/Middleware/RedirectIfAuthenticated.php | 26 ++++ app/Http/Middleware/TrimStrings.php | 18 +++ app/Http/Middleware/TrustProxies.php | 23 ++++ app/Http/Middleware/VerifyCsrfToken.php | 17 +++ app/Libraries/TemplateFunction.php | 23 ++++ app/Libraries/Utility.php | 12 ++ app/Providers/AppServiceProvider.php | 35 ++++++ app/Providers/AuthServiceProvider.php | 30 +++++ app/Providers/BroadcastServiceProvider.php | 21 ++++ app/Providers/EventServiceProvider.php | 32 +++++ app/Providers/RouteServiceProvider.php | 73 ++++++++++++ app/Shop.php | 10 ++ app/User.php | 29 +++++ 27 files changed, 1090 insertions(+) create mode 100644 app/Console/Kernel.php create mode 100644 app/Exceptions/Handler.php create mode 100644 app/Http/Controllers/Auth/ForgotPasswordController.php create mode 100644 app/Http/Controllers/Auth/LoginController.php create mode 100644 app/Http/Controllers/Auth/RegisterController.php create mode 100644 app/Http/Controllers/Auth/ResetPasswordController.php create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/IndexController.php create mode 100644 app/Http/Controllers/LookupController.php create mode 100644 app/Http/Controllers/OfferController.php create mode 100644 app/Http/Controllers/RSSController.php create mode 100644 app/Http/Controllers/SearchController.php create mode 100644 app/Http/Kernel.php create mode 100644 app/Http/Middleware/EncryptCookies.php create mode 100644 app/Http/Middleware/RedirectIfAuthenticated.php create mode 100644 app/Http/Middleware/TrimStrings.php create mode 100644 app/Http/Middleware/TrustProxies.php create mode 100644 app/Http/Middleware/VerifyCsrfToken.php create mode 100644 app/Libraries/TemplateFunction.php create mode 100644 app/Libraries/Utility.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 app/Providers/AuthServiceProvider.php create mode 100644 app/Providers/BroadcastServiceProvider.php create mode 100644 app/Providers/EventServiceProvider.php create mode 100644 app/Providers/RouteServiceProvider.php create mode 100644 app/Shop.php create mode 100644 app/User.php (limited to 'app') diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php new file mode 100644 index 0000000..a8c5158 --- /dev/null +++ b/app/Console/Kernel.php @@ -0,0 +1,42 @@ +command('inspire') + // ->hourly(); + } + + /** + * Register the commands for the application. + * + * @return void + */ + protected function commands() + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php new file mode 100644 index 0000000..7e2563a --- /dev/null +++ b/app/Exceptions/Handler.php @@ -0,0 +1,53 @@ +middleware('guest'); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php new file mode 100644 index 0000000..b2ea669 --- /dev/null +++ b/app/Http/Controllers/Auth/LoginController.php @@ -0,0 +1,39 @@ +middleware('guest')->except('logout'); + } +} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php new file mode 100644 index 0000000..f77265a --- /dev/null +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -0,0 +1,71 @@ +middleware('guest'); + } + + /** + * Get a validator for an incoming registration request. + * + * @param array $data + * @return \Illuminate\Contracts\Validation\Validator + */ + protected function validator(array $data) + { + return Validator::make($data, [ + 'name' => 'required|string|max:255', + 'email' => 'required|string|email|max:255|unique:users', + 'password' => 'required|string|min:6|confirmed', + ]); + } + + /** + * Create a new user instance after a valid registration. + * + * @param array $data + * @return \App\User + */ + protected function create(array $data) + { + return User::create([ + 'name' => $data['name'], + 'email' => $data['email'], + 'password' => bcrypt($data['password']), + ]); + } +} diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php new file mode 100644 index 0000000..cf726ee --- /dev/null +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -0,0 +1,39 @@ +middleware('guest'); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..03e02a2 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,13 @@ + 19.98 AND shop != \"Drankdozijn\" ORDER BY procent DESC LIMIT 1)"; + $query .= "(SELECT name, image_url, spirit_type, spirit_type AS url, spirit_type AS angebotsname, (SELECT MAX(procent) FROM " . $view . "_view) as procent, '' AS linktext FROM ". $view ."_view WHERE original_price > 19.98 ORDER BY procent DESC LIMIT 1)"; + } + $query .= " UNION (SELECT 'Alle Angebote' as name, 'https://angebote.fuselkoenig.de/img/feed-icon-gray.jpg' as image_url, 'RSS-Feeds' as spirit_type, 'feeds' AS url, 'RSS-Feeds' AS angebotsname, (SELECT MAX(procent) FROM all_view) as procent, 'Zu den RSS-Feeds' AS linktext FROM all_view LIMIT 1)"; + + $data = DB::select($query); + + $count = DB::select("SELECT count(*) as count FROM all_view")[0]; + #$data = DB::table('whisky_view')->orderBy('procent', 'DESC')->limit(100)->simplePaginate(20); + + #$views[] = "rss-feeds"; + + return view('fk-index', ['data' => $data, 'views' => $views, 'hits' => $count]); + } +} diff --git a/app/Http/Controllers/LookupController.php b/app/Http/Controllers/LookupController.php new file mode 100644 index 0000000..3a876a9 --- /dev/null +++ b/app/Http/Controllers/LookupController.php @@ -0,0 +1,26 @@ +select('name', 'shop', 'spirit_type')->where('url', "https://l.fuselkoenig.de/" . Input::get('short_url'))->limit(1)->get(); + + return response()->json($data); + } +} diff --git a/app/Http/Controllers/OfferController.php b/app/Http/Controllers/OfferController.php new file mode 100644 index 0000000..9182206 --- /dev/null +++ b/app/Http/Controllers/OfferController.php @@ -0,0 +1,95 @@ +input("order"); + if ( "asc" != $order_by ) { + $order_by = "desc"; + } + + /* + * Database query + */ + $view_name = \Request::route()->getName(); + #$data = DB::table($view_name . '_view')->whereNotNull('url')->orderBy($sort_by, $order_by)->simplePaginate(10); + $data = DB::table($view_name . '_view')->whereNotNull('url')->orderBy($sort_by, $order_by)->paginate(10); + $count = DB::table($view_name . '_view')->whereNotNull('url')->count(); + + $rss_feed = "/angebote/" . $view_name . "/feed/"; + $query_string = ""; + $query_params = Input::except('page'); + foreach( $query_params as $key => $value) { + $query_string .= "&" . $key . "=" . $value; + } + if ( "search" == $view_name && "" != $query_string ) { + $query_string = ltrim($query_string, "&"); + $rss_feed .= "?" . $query_string; + } + + if ( "misc" == $view_name ) { + $view_name = "Andere Angebote"; + if ( $data->count() ) { + $title = "andere Angebote"; + } else { + $title = "anderen Angebote"; + } + } else if ( "all" == $view_name ) { + $view_name = "Alle Angebote"; + if ( $data->count() ) { + $title = "alle Angebote"; + } else { + $title = "Angebote"; + } + } else { + $title = ucfirst($view_name) . "-Angebote"; + } + + return view('fk-offer', ['data' => $data, 'count' => $count, 'spirit_type' => $view_name, 'rss_feed' => $rss_feed, 'title' => $title ]); + } +} diff --git a/app/Http/Controllers/RSSController.php b/app/Http/Controllers/RSSController.php new file mode 100644 index 0000000..5c30bd9 --- /dev/null +++ b/app/Http/Controllers/RSSController.php @@ -0,0 +1,132 @@ +input("order"); + if ( "asc" != $order_by ) { + $order_by = "desc"; + } + + /* + * Database query + */ + $view_name = str_replace("_feed", "", \Request::route()->getName()); + $view_name = str_replace("/angebote/", "", $view_name); + + if ( "search" == $view_name ) { + $query = Input::get("q"); + $q = "%" . Utility::escapeLike($query) . "%"; + $data = DB::table('all_view')->whereNotNull('url')->where('name', 'like', $q)->orWhere('spirit_type', 'like', $q)->orderBy($sort_by, $order_by)->limit(20)->get(); + } else { + $data = DB::table($view_name . '_view')->orderBy($sort_by, $order_by)->limit(20)->get(); + } + + /* + * For strftime(). + */ + setlocale(LC_TIME, 'de_DE.utf8'); + + /* + if ( "" != env('PIWIK_RSS_ID') ) { + $piwik = new \PiwikTracker( env('PIWIK_RSS_ID'), env('PIWIK_RSS_URL') ); + $piwik->setTokenAuth( env('PIWIK_RSS_AUTH_TOKEN') ); + $piwik->setVisitorId( $piwik->getVisitorId() ); + $piwik->setIp( $request->header('X_REAL_IP') ); + $piwik->setUrl( $request->fullUrl() ); + + $piwik->setUrlReferrer( $request->server('HTTP_REFERER') ); + $piwik->setBrowserLanguage( $request->server('HTTP_ACCEPT_LANGUAGE') ); + $piwik->setUserAgent( $request->server('HTTP_USER_AGENT') ); + + $piwik->doTrackPageView( ucfirst($view_name) . "-Feed" ); + + if ( "" != Input::get('sort') ) { + $piwik->doTrackEvent("sort", Input::get('sort') ); + } + if ( "" != Input::get('order') ) { + $piwik->doTrackEvent("order", Input::get('order') ); + } + if ( "" != Input::get('q') ) { + $piwik->doTrackEvent("search_phrase", Input::get('q') ); + } + } + */ + + + + $feed = \App::make("feed"); + + $feed->title = "Sonderangebote"; + $feed->description = 'Finde immer die günstigsten Angebote im Bereich Spirituosen. Regelmäßig neue Schnäppchen.'; + $feed->logo = url('https://angebote.fuselkoenig.de/img/paw-400-400.png'); + $feed->link = url( $request->fullUrl() ); + $feed->setDateFormat('timestamp'); // 'datetime', 'timestamp' or 'carbon' + $feed->pubdate = $data[0]->created_at; + $feed->lang = 'de'; + $feed->setShortening(true); // true or false + $feed->setTextLimit(5000); // maximum length of description text + + foreach ( $data as $offer ) { + + # Adds campagin + $offer->url = $offer->url . "?pk_campaign=feed&pk_kwd=" . urlencode($offer->name) . "&pk_source=" . $view_name . "_feed"; + + if ( "" != env('PIWIK_RSS_ID') ) { + // $piwik->doTrackContentImpression($offer->spirit_type, $offer->name, $offer->long_url); + } + + $desc = '

'.$offer->spirit_type.'
'. $offer->name . ' gesenkt auf ' . \TF::fF($offer->discounted_price) . '€ statt ' . \TF::fF($offer->original_price) . '€ ('.$offer->procent.'% Rabatt auf '. $offer->shop .').'; + $feed->add($offer->name, $offer->shop, $offer->url, $offer->created_at, $desc, $desc); + } + + return $feed->render('atom'); + + } +} diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php new file mode 100644 index 0000000..5092f30 --- /dev/null +++ b/app/Http/Controllers/SearchController.php @@ -0,0 +1,80 @@ +input("order"); + if ( "desc" != $order_by ) { + if ( "created_at" == $sort_by &&"asc" != $order_by ) { + $order_by = "desc"; + } else { + $order_by = "asc"; + } + } + + $query = Input::get("q"); + $q = "%" . Utility::escapeLike($query) . "%"; + $data = DB::table('all_view')->whereNotNull('url')->where('name', 'like', $q)->orWhere('spirit_type', 'like', $q)->orWhere('shop', 'like', $q)->orderBy($sort_by, $order_by)->paginate(20); + $count = DB::table('all_view')->whereNotNull('url')->where('name', 'like', $q)->orWhere('spirit_type', 'like', $q)->orWhere('shop', 'like', $q); + + $query_string = ""; + $query_params = Input::except('page'); + foreach( $query_params as $key => $value) { + $query_string .= "&" . $key . "=" . $value; + } + $query_string = ltrim($query_string, "&"); + + /* + * For strftime() in view. + */ + #setlocale(LC_TIME, 'de_DE.utf8'); + + return view('fk-search', ['data' => $data, 'count' => $count, 'search_phrase' => $query, 'rss_feed' => '/angebote/search/feed/?' . $query_string ]); + } +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php new file mode 100644 index 0000000..74b1cbd --- /dev/null +++ b/app/Http/Kernel.php @@ -0,0 +1,62 @@ + [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + // \Illuminate\Session\Middleware\AuthenticateSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + 'throttle:60,1', + 'bindings', + ], + ]; + + /** + * The application's route middleware. + * + * These middleware may be assigned to groups or used individually. + * + * @var array + */ + protected $routeMiddleware = [ + 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, + 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + ]; +} diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000..033136a --- /dev/null +++ b/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ +check()) { + return redirect('/home'); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..5a50e7b --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,18 @@ + 'App\Policies\ModelPolicy', + ]; + + /** + * Register any authentication / authorization services. + * + * @return void + */ + public function boot() + { + $this->registerPolicies(); + + // + } +} diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..352cce4 --- /dev/null +++ b/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,21 @@ + [ + 'App\Listeners\EventListener', + ], + ]; + + /** + * Register any events for your application. + * + * @return void + */ + public function boot() + { + parent::boot(); + + // + } +} diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..5ea48d3 --- /dev/null +++ b/app/Providers/RouteServiceProvider.php @@ -0,0 +1,73 @@ +mapApiRoutes(); + + $this->mapWebRoutes(); + + // + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + * + * @return void + */ + protected function mapWebRoutes() + { + Route::middleware('web') + ->namespace($this->namespace) + ->group(base_path('routes/web.php')); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + * + * @return void + */ + protected function mapApiRoutes() + { + Route::prefix('api') + ->middleware('api') + ->namespace($this->namespace) + ->group(base_path('routes/api.php')); + } +} diff --git a/app/Shop.php b/app/Shop.php new file mode 100644 index 0000000..1e57060 --- /dev/null +++ b/app/Shop.php @@ -0,0 +1,10 @@ +