commit 646041230bbaf0ca4e720cd653994b124a0bad16 Author: Shaun Collins Date: Wed Mar 4 16:34:33 2026 +0000 Init diff --git a/app/Console/Commands/GenerateSitemap.php b/app/Console/Commands/GenerateSitemap.php new file mode 100644 index 0000000..0196618 --- /dev/null +++ b/app/Console/Commands/GenerateSitemap.php @@ -0,0 +1,37 @@ +info('Adding '.$route['path'].' to sitemap.'); + $sitemap->add(Url::create($route['path']) + ->setPriority($route['priority'] ?? static::PRIORITY) + ->setLastModificationDate($route['last_modified'] ?? now()) + ->setChangeFrequency($route['frequency'] ?? static::CHANGE_FREQUENCY)); + } + } + + $sitemap->writeToFile(public_path('sitemap.xml')); + $this->info('Sitemap has been successfully generated!'); + } +} diff --git a/app/Http/Controllers/ContactController.php b/app/Http/Controllers/ContactController.php new file mode 100644 index 0000000..865cd16 --- /dev/null +++ b/app/Http/Controllers/ContactController.php @@ -0,0 +1,78 @@ +validate([ + 'name' => 'required', + 'email' => 'required|email', + 'message' => 'required', + ]); + + $this->createRecord([ + 'name' => $request->input('name'), + 'email' => $request->input('email'), + 'subject' => self::SUBJECT, + 'message' => $request->input('message'), + ]); + + Mail::raw($this->formatMessage($request), function ($message) use ($request) { + $message->to(config('app.email'))->subject(self::SUBJECT.' from '.$request->input('email')); + $message->from(config('app.email'), $request->input('name')); + }); + + return redirect()->back()->with('success', 'Your message has been sent.'); + } + + public function trial(Request $request): RedirectResponse + { + $request->validate([ + 'name' => 'required', + 'email' => 'required|email', + ]); + + $this->createRecord([ + 'name' => $request->input('name'), + 'email' => $request->input('email'), + 'subject' => 'New Trial class request', + 'message' => 'Contact to book a trial class.', + ]); + + Mail::raw($this->formatMessage($request), function ($message) use ($request) { + $message->to(config('app.email'))->subject('New Trial class request from '.$request->input('email')); + $message->from(config('app.email'), $request->input('name')); + }); + + return redirect()->back()->with('success', "We'll be in touch to book your trial class."); + } + + public function formatMessage(Request $request): string + { + return <<input('name')} +Email: {$request->input('email')} +Message: {$request->input('message')} +EOF; + } + + private function createRecord(array $data) + { + Contact::create([ + 'name' => $data['name'] ?? '?', + 'email' => $data['email'] ?? '?', + 'subject' => $data['subject'] ?? '?', + 'message' => $data['message'] ?? null, + ]); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..8677cd5 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ +file($this->imagePath($file)); + } catch (\Exception $e) { + abort(404); + } + } + + public function subDirectory(Request $request, string $directory, string $file) + { + try { + return response()->file($this->imagePath("{$directory}/{$file}")); + } catch (\Exception $e) { + abort(404); + } + } + + private function imagePath(string $file): string + { + return resource_path('images/'.$file); + } +} diff --git a/app/Models/Blog.php b/app/Models/Blog.php new file mode 100644 index 0000000..2fa36db --- /dev/null +++ b/app/Models/Blog.php @@ -0,0 +1,28 @@ + 'blog.'.$this->slug + ); + } +} diff --git a/app/Models/Contact.php b/app/Models/Contact.php new file mode 100644 index 0000000..868986b --- /dev/null +++ b/app/Models/Contact.php @@ -0,0 +1,23 @@ +where('answered', false); + } +} diff --git a/app/Models/Faq.php b/app/Models/Faq.php new file mode 100644 index 0000000..4f3d809 --- /dev/null +++ b/app/Models/Faq.php @@ -0,0 +1,15 @@ + */ + use HasFactory, Notifiable; + + /** + * The attributes that are mass assignable. + * + * @var list + */ + protected $fillable = [ + 'name', + 'email', + 'password', + ]; + + /** + * The attributes that should be hidden for serialization. + * + * @var list + */ + protected $hidden = [ + 'password', + 'remember_token', + ]; + + /** + * Get the attributes that should be cast. + * + * @return array + */ + protected function casts(): array + { + return [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php new file mode 100644 index 0000000..452e6b6 --- /dev/null +++ b/app/Providers/AppServiceProvider.php @@ -0,0 +1,24 @@ +hideSensitiveRequestDetails(); + + $isLocal = $this->app->environment('local'); + $recordAll = config('telescope.record_all'); + + Telescope::filter(function (IncomingEntry $entry) use ($isLocal, $recordAll) { + return $isLocal || + $recordAll || + $entry->isReportableException() || + $entry->isFailedRequest() || + $entry->isFailedJob() || + $entry->isScheduledTask() || + $entry->hasMonitoredTag(); + }); + } + + /** + * Prevent sensitive request details from being logged by Telescope. + */ + protected function hideSensitiveRequestDetails(): void + { + if ($this->app->environment('local')) { + return; + } + + Telescope::hideRequestParameters(['_token']); + + Telescope::hideRequestHeaders([ + 'cookie', + 'x-csrf-token', + 'x-xsrf-token', + ]); + } + + /** + * Register the Telescope gate. + * + * This gate determines who can access Telescope in non-local environments. + */ + protected function gate(): void + { + Gate::define('viewTelescope', function ($user = null) { + $allowed = explode(',', config('telescope.allowed_ips')); + + return in_array(request()->ip(), $allowed); + }); + + } +} diff --git a/app/Traits/HasActive.php b/app/Traits/HasActive.php new file mode 100644 index 0000000..1247e58 --- /dev/null +++ b/app/Traits/HasActive.php @@ -0,0 +1,13 @@ +where('active', true); + } +} diff --git a/app/Traits/HasTableName.php b/app/Traits/HasTableName.php new file mode 100644 index 0000000..bf9c14b --- /dev/null +++ b/app/Traits/HasTableName.php @@ -0,0 +1,11 @@ +getTable(); + } +} diff --git a/app/View/Components/Footer.php b/app/View/Components/Footer.php new file mode 100644 index 0000000..94f7e01 --- /dev/null +++ b/app/View/Components/Footer.php @@ -0,0 +1,26 @@ +