From ceb4f36ba139c84b5ea086e22b0e8aecf44bcbc5 Mon Sep 17 00:00:00 2001 From: Nicholas Ciechanowski Date: Tue, 10 Oct 2023 20:47:51 +1100 Subject: [PATCH] feat: logging --- app/Http/Controllers/Api/UserController.php | 25 +++++++--------- .../Controllers/Api/WebHookController.php | 19 ++++++++++-- app/Models/Log.php | 18 +++++++++++ app/Models/Quote.php | 30 +++++++++++++++++-- app/Models/RequestedQuote.php | 13 ++++++-- app/Models/User.php | 27 +++++++++++++++++ .../2023_10_10_200426_create_logs_table.php | 28 +++++++++++++++++ .../views/livewire/pages/admin/send.blade.php | 12 ++++++-- .../views/livewire/pages/auth/login.blade.php | 6 ++++ .../pages/auth/reset-password.blade.php | 6 ++++ .../profile/update-password-form.blade.php | 6 ++++ routes/api.php | 3 +- 12 files changed, 169 insertions(+), 24 deletions(-) create mode 100644 app/Models/Log.php create mode 100644 database/migrations/2023_10_10_200426_create_logs_table.php diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php index 6eb4768..73ac070 100644 --- a/app/Http/Controllers/Api/UserController.php +++ b/app/Http/Controllers/Api/UserController.php @@ -3,36 +3,33 @@ namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; -use App\Models\User; -use Illuminate\Support\Str; -use Illuminate\Http\Request; use App\Http\Requests\StoreUserRequest; -use Illuminate\Support\Facades\Validator; +use App\Models\User; +use Illuminate\Http\Request; +use Illuminate\Support\Str; +use Throwable; class UserController extends Controller { public function registerUser(StoreUserRequest $request) { + $data = $request->validated(); + $data['password'] = Str::random(8); - $validated = $request->validated(); - $validated['is_admin'] = false; - $validated['password'] = Str::random(8); - $validated['status'] = true; try { - $user = User::create($validated); - }catch (Throwable $exception){ + $user = User::create($data); + } catch (Throwable $exception) { return response() - ->json($exception); + ->json($exception); } - return response() - ->json(['message' => 'Successfully created user ' . $user->firstname]); + ->json(['message' => 'Successfully created user ' . $user->firstname]); } public function getUser(Request $request, User $user) { return response() - ->json(["status" => true]); + ->json(['status' => true]); } } diff --git a/app/Http/Controllers/Api/WebHookController.php b/app/Http/Controllers/Api/WebHookController.php index 1f81d9b..fd5761d 100644 --- a/app/Http/Controllers/Api/WebHookController.php +++ b/app/Http/Controllers/Api/WebHookController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; +use App\Models\Log; use App\Models\Quote; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; @@ -12,6 +13,7 @@ class WebHookController extends Controller { public function webHookSend(string $payload) { + // TODO: move this to a helper class so we can reuse code between API and FE $data = ['text' => $payload]; $response = Http::post(config('bot.webhook'), $data); } @@ -19,17 +21,30 @@ class WebHookController extends Controller public function sendQuote(Request $request) { $quote = $request->input('quote'); + if (empty($quote)) { return; } + Log::create([ + 'user_id' => auth()?->user()?->id, + 'content' => "Quote sent. {$quote}", + ]); + $this->webHookSend($quote); } public function sendRandomQuote() { - $quote = Quote::inRandomOrder()->first()->quote; - $this->webHookSend($quote); + $quote = Quote::inRandomOrder()->first(); + + Log::create([ + 'user_id' => auth()?->user()?->id, + 'quote_id' => $quote->id, + 'content' => 'Quote sent.', + ]); + + $this->webHookSend($quote->quote); } public function test() diff --git a/app/Models/Log.php b/app/Models/Log.php new file mode 100644 index 0000000..e0bfb0c --- /dev/null +++ b/app/Models/Log.php @@ -0,0 +1,18 @@ + auth()?->user()?->id, + 'quote_id' => $this->id, + 'content' => 'Quote requested.' + ]); + } protected $fillable = [ 'quote', ]; + + public static function boot(): void + { + parent::boot(); + + self::created(function ($model) { + Log::create([ + 'user_id' => auth()?->user()?->id, + 'quote_id' => $model->id, + 'content' => 'Quote created.' + ]); + }); + + self::deleted(function ($model) { + Log::create([ + 'user_id' => auth()?->user()?->id, + 'quote_id' => $model->id, + 'content' => 'Quote deleted.' + ]); + }); + } } diff --git a/app/Models/RequestedQuote.php b/app/Models/RequestedQuote.php index e1da899..9b758c0 100644 --- a/app/Models/RequestedQuote.php +++ b/app/Models/RequestedQuote.php @@ -19,7 +19,12 @@ class RequestedQuote extends Model public function approve(): void { - // TODO: we'll probs want to log who approved this quote + Log::create([ + 'user_id' => auth()?->user()?->id, + 'requested_quote_id' => $this->id, + 'content' => 'Quote approved.' + ]); + Quote::create([ 'quote' => $this->quote, ]); @@ -29,7 +34,11 @@ class RequestedQuote extends Model public function reject(): void { - // TODO: we'll probs want to log who reject this quote + Log::create([ + 'user_id' => auth()?->user()?->id, + 'requested_quote_id' => $this->id, + 'content' => 'Quote rejected.' + ]); $this->delete(); } diff --git a/app/Models/User.php b/app/Models/User.php index c3f3b03..7af6c1e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -14,6 +14,16 @@ class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; + /** + * The model's default values for attributes. + * + * @var array + */ + protected $attributes = [ + 'is_admin' => false, + 'status' => true, + ]; + /** * The attributes that are mass assignable. * @@ -46,6 +56,23 @@ class User extends Authenticatable * @var array */ protected $casts = [ + 'is_admin' => 'boolean', + 'status' => 'boolean', 'password' => 'hashed', ]; + + public static function boot(): void + { + parent::boot(); + + // These will only ever get created by the api/bot. + // If we want to add something like by whom later on, + // we can just append it to the content e.g auth()?->user()?->id ?? 'API'. + self::created(function ($model) { + Log::create([ + 'user_id' => $model->id, + 'content' => 'User created.' + ]); + }); + } } diff --git a/database/migrations/2023_10_10_200426_create_logs_table.php b/database/migrations/2023_10_10_200426_create_logs_table.php new file mode 100644 index 0000000..d5292b6 --- /dev/null +++ b/database/migrations/2023_10_10_200426_create_logs_table.php @@ -0,0 +1,28 @@ +id(); + $table->foreignIdFor(User::class)->nullable(); + $table->foreignIdFor(Quote::class)->nullable(); + $table->foreignIdFor(RequestedQuote::class)->nullable(); + $table->string('content'); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('logs'); + } +}; diff --git a/resources/views/livewire/pages/admin/send.blade.php b/resources/views/livewire/pages/admin/send.blade.php index 1f71114..7decace 100644 --- a/resources/views/livewire/pages/admin/send.blade.php +++ b/resources/views/livewire/pages/admin/send.blade.php @@ -1,5 +1,6 @@ validate(); + // TODO: move this to a helper class so we can reuse code between API and FE $response = Http::post(config('bot.webhook'), ['text' => $validated['quote']]); + Log::create([ + 'user_id' => auth()?->user()?->id, + 'content' => "Quote sent. {$validated['quote']}" + ]); + $this->quote = ''; } }; ?> -
{{ __('Send') }} + class="mt-4"> + {{ __('Send') }} +
diff --git a/resources/views/livewire/pages/auth/login.blade.php b/resources/views/livewire/pages/auth/login.blade.php index b16c133..be02104 100644 --- a/resources/views/livewire/pages/auth/login.blade.php +++ b/resources/views/livewire/pages/auth/login.blade.php @@ -1,5 +1,6 @@ regenerate(); + Log::create([ + 'user_id' => auth()?->user()?->id, + 'content' => "Quote sent. {$quote}" + ]); + $this->redirect( session('url.intended', RouteServiceProvider::HOME), navigate: true diff --git a/resources/views/livewire/pages/auth/reset-password.blade.php b/resources/views/livewire/pages/auth/reset-password.blade.php index 3ac0b57..3f397d2 100644 --- a/resources/views/livewire/pages/auth/reset-password.blade.php +++ b/resources/views/livewire/pages/auth/reset-password.blade.php @@ -1,5 +1,6 @@ flash('status', __($status)); + Log::create([ + 'user_id' => auth()?->user()?->id, + 'content' => "Quote sent. {$quote}" + ]); + $this->redirectRoute('login', navigate: true); } }; ?> diff --git a/resources/views/livewire/profile/update-password-form.blade.php b/resources/views/livewire/profile/update-password-form.blade.php index 480fcd2..04eee07 100644 --- a/resources/views/livewire/profile/update-password-form.blade.php +++ b/resources/views/livewire/profile/update-password-form.blade.php @@ -1,5 +1,6 @@ Hash::make($validated['password']), ]); + Log::create([ + 'user_id' => auth()?->user()?->id, + 'content' => "Quote sent. {$quote}" + ]); + $this->reset('current_password', 'password', 'password_confirmation'); $this->dispatch('password-updated'); diff --git a/routes/api.php b/routes/api.php index a73824e..c520243 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,9 +1,8 @@