From fffb438963d120a2cd26e5c398a157bb98ab5165 Mon Sep 17 00:00:00 2001 From: Constantin Graf Date: Wed, 16 Sep 2026 18:27:07 +0200 Subject: [PATCH] Add new extension auditing --- .github/workflows/build-onpremise.yml | 19 ++++ .github/workflows/build-private.yml | 24 +++++ app/Filament/Resources/AuditResource.php | 99 ------------------- .../AuditResource/Pages/CreateAudit.php | 13 --- .../AuditResource/Pages/ListAudits.php | 18 ---- .../AuditResource/Pages/ViewAudit.php | 13 --- e2e/admin-panel.spec.ts | 1 - extensions/manifest.json | 4 + .../Filament/Resources/AuditResourceTest.php | 59 ----------- 9 files changed, 47 insertions(+), 203 deletions(-) delete mode 100644 app/Filament/Resources/AuditResource/Pages/CreateAudit.php delete mode 100644 app/Filament/Resources/AuditResource/Pages/ListAudits.php delete mode 100644 app/Filament/Resources/AuditResource/Pages/ViewAudit.php delete mode 100644 tests/Unit/Filament/Resources/AuditResourceTest.php diff --git a/.github/workflows/build-onpremise.yml b/.github/workflows/build-onpremise.yml index ac0ab197..2b8c94f5 100644 --- a/.github/workflows/build-onpremise.yml +++ b/.github/workflows/build-onpremise.yml @@ -103,6 +103,8 @@ jobs: { echo "invoicing_repository=$(jq -r '.Invoicing.repository' extensions/manifest.json)" echo "invoicing_ref=$(jq -r '.Invoicing.ref' extensions/manifest.json)" + echo "auditing_repository=$(jq -r '.Auditing.repository' extensions/manifest.json)" + echo "auditing_ref=$(jq -r '.Auditing.ref' extensions/manifest.json)" } >> "$GITHUB_OUTPUT" - name: "Checkout invoicing extension" @@ -119,9 +121,26 @@ jobs: - name: "Install npm dependencies in invoicing extension" run: cd extensions/Invoicing && npm ci + - name: "Checkout auditing extension" + uses: actions/checkout@v7 + with: + repository: ${{ steps.extension-manifest.outputs.auditing_repository }} + ref: ${{ steps.extension-manifest.outputs.auditing_ref }} + path: extensions/Auditing + ssh-key: ${{ secrets.SSH_PRIVATE_KEY_AUDITING_EXTENSION }} + + - name: "Install composer dependencies in auditing extension" + run: cd extensions/Auditing && composer install --no-dev --no-ansi --no-interaction --prefer-dist --ignore-platform-reqs --classmap-authoritative + + - name: "Install npm dependencies in auditing extension" + run: cd extensions/Auditing && npm ci + - name: "Activate invoicing extension" run: php artisan module:enable Invoicing + - name: "Activate auditing extension" + run: php artisan module:enable Auditing + - name: "Install npm dependencies" run: npm ci diff --git a/.github/workflows/build-private.yml b/.github/workflows/build-private.yml index 108cc8e5..6a4b0319 100644 --- a/.github/workflows/build-private.yml +++ b/.github/workflows/build-private.yml @@ -84,6 +84,8 @@ jobs: echo "services_ref=$(jq -r '.Services.ref' extensions/manifest.json)" echo "invoicing_repository=$(jq -r '.Invoicing.repository' extensions/manifest.json)" echo "invoicing_ref=$(jq -r '.Invoicing.ref' extensions/manifest.json)" + echo "auditing_repository=$(jq -r '.Auditing.repository' extensions/manifest.json)" + echo "auditing_ref=$(jq -r '.Auditing.ref' extensions/manifest.json)" } >> "$GITHUB_OUTPUT" - name: "Checkout billing extension" @@ -145,6 +147,25 @@ jobs: - name: "Install npm dependencies in invoicing extension" run: cd extensions/Invoicing && npm ci + - name: "Checkout auditing extension" + uses: actions/checkout@v7 + with: + repository: ${{ steps.extension-manifest.outputs.auditing_repository }} + ref: ${{ steps.extension-manifest.outputs.auditing_ref }} + path: extensions/Auditing + ssh-key: ${{ secrets.SSH_PRIVATE_KEY_AUDITING_EXTENSION }} + + - name: "Install composer dependencies in auditing extension" + uses: php-actions/composer@v6 + with: + working_dir: "extensions/Auditing" + command: install + only_args: --no-dev --no-ansi --no-interaction --prefer-dist --ignore-platform-reqs --classmap-authoritative + php_version: 8.3 + + - name: "Install npm dependencies in auditing extension" + run: cd extensions/Auditing && npm ci + - name: "Setup PHP with PECL extension" uses: shivammathur/setup-php@v2 with: @@ -168,6 +189,9 @@ jobs: - name: "Activate invoicing extension" run: php artisan module:enable Invoicing + - name: "Activate auditing extension" + run: php artisan module:enable Auditing + - name: "Install npm dependencies" run: npm ci diff --git a/app/Filament/Resources/AuditResource.php b/app/Filament/Resources/AuditResource.php index 2b64ad50..e69de29b 100644 --- a/app/Filament/Resources/AuditResource.php +++ b/app/Filament/Resources/AuditResource.php @@ -1,99 +0,0 @@ -components([ - TextInput::make('user_type') - ->maxLength(255), - TextInput::make('user_id'), - TextInput::make('event') - ->required() - ->maxLength(255), - TextInput::make('auditable_type') - ->required() - ->maxLength(255), - TextInput::make('auditable_id') - ->required(), - PrettyJsonField::make('old_values'), - PrettyJsonField::make('new_values'), - Textarea::make('url'), - TextInput::make('ip_address'), - TextInput::make('user_agent') - ->maxLength(1023), - TextInput::make('tags') - ->maxLength(255), - ]); - } - - public static function table(Table $table): Table - { - return $table - ->columns([ - TextColumn::make('user.name'), - TextColumn::make('event'), - TextColumn::make('auditable_type'), - TextColumn::make('auditable_id'), - IconColumn::make('was_command') - ->getStateUsing(fn (Audit $record) => Str::startsWith($record->url, 'artisan ')) - ->boolean(), - TextColumn::make('created_at') - ->sortable() - ->dateTime(), - TextColumn::make('updated_at') - ->sortable() - ->dateTime(), - ]) - ->filters([ - // - ]) - ->recordActions([ - ViewAction::make(), - ]) - ->toolbarActions([ - ]) - ->defaultSort('created_at', 'desc'); - } - - public static function getRelations(): array - { - return [ - ]; - } - - public static function getPages(): array - { - return [ - 'index' => ListAudits::route('/'), - 'create' => CreateAudit::route('/create'), - 'view' => ViewAudit::route('/{record}'), - ]; - } -} diff --git a/app/Filament/Resources/AuditResource/Pages/CreateAudit.php b/app/Filament/Resources/AuditResource/Pages/CreateAudit.php deleted file mode 100644 index dd46d79d..00000000 --- a/app/Filament/Resources/AuditResource/Pages/CreateAudit.php +++ /dev/null @@ -1,13 +0,0 @@ - { diff --git a/extensions/manifest.json b/extensions/manifest.json index 8abd3f4d..d09f40c0 100644 --- a/extensions/manifest.json +++ b/extensions/manifest.json @@ -10,5 +10,9 @@ "Invoicing": { "repository": "solidtime-io/extension-invoicing", "ref": "v0.0.7" + }, + "Auditing": { + "repository": "solidtime-io/extension-auditing", + "ref": "v0.0.2" } } diff --git a/tests/Unit/Filament/Resources/AuditResourceTest.php b/tests/Unit/Filament/Resources/AuditResourceTest.php deleted file mode 100644 index 1266a72b..00000000 --- a/tests/Unit/Filament/Resources/AuditResourceTest.php +++ /dev/null @@ -1,59 +0,0 @@ -withPersonalOrganization()->create([ - 'email' => 'admin@example.com', - ]); - - $this->actingAs($user); - } - - public function test_can_list_audits(): void - { - // Arrange - $user = $this->createUserWithPermission(); - $timeEntry = TimeEntry::factory()->forMember($user->member)->create(); - DB::table((new Audit)->getTable())->delete(); - $audits = Audit::factory()->auditFor($timeEntry)->auditUser($user->user)->createMany(5); - - // Act - $response = Livewire::test(AuditResource\Pages\ListAudits::class); - - // Assert - $response->assertSuccessful(); - $response->assertCanSeeTableRecords($audits); - } - - public function test_can_see_view_page_of_audit(): void - { - // Arrange - DB::table((new Audit)->getTable())->delete(); - $audit = Audit::factory()->create(); - - // Act - $response = Livewire::test(AuditResource\Pages\ViewAudit::class, ['record' => $audit->getKey()]); - - // Assert - $response->assertSuccessful(); - } -}