mirror of
https://github.com/solidtime-io/solidtime.git
synced 2026-10-13 16:23:18 +01:00
Compare commits
1 Commits
fix/api-do
...
cf83f38321
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf83f38321 |
19
.github/workflows/build-onpremise.yml
vendored
19
.github/workflows/build-onpremise.yml
vendored
@@ -103,6 +103,8 @@ jobs:
|
|||||||
{
|
{
|
||||||
echo "invoicing_repository=$(jq -r '.Invoicing.repository' extensions/manifest.json)"
|
echo "invoicing_repository=$(jq -r '.Invoicing.repository' extensions/manifest.json)"
|
||||||
echo "invoicing_ref=$(jq -r '.Invoicing.ref' 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"
|
} >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: "Checkout invoicing extension"
|
- name: "Checkout invoicing extension"
|
||||||
@@ -119,9 +121,26 @@ jobs:
|
|||||||
- name: "Install npm dependencies in invoicing extension"
|
- name: "Install npm dependencies in invoicing extension"
|
||||||
run: cd extensions/Invoicing && npm ci
|
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"
|
- name: "Activate invoicing extension"
|
||||||
run: php artisan module:enable Invoicing
|
run: php artisan module:enable Invoicing
|
||||||
|
|
||||||
|
- name: "Activate auditing extension"
|
||||||
|
run: php artisan module:enable Auditing
|
||||||
|
|
||||||
- name: "Install npm dependencies"
|
- name: "Install npm dependencies"
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
||||||
|
|||||||
24
.github/workflows/build-private.yml
vendored
24
.github/workflows/build-private.yml
vendored
@@ -84,6 +84,8 @@ jobs:
|
|||||||
echo "services_ref=$(jq -r '.Services.ref' extensions/manifest.json)"
|
echo "services_ref=$(jq -r '.Services.ref' extensions/manifest.json)"
|
||||||
echo "invoicing_repository=$(jq -r '.Invoicing.repository' extensions/manifest.json)"
|
echo "invoicing_repository=$(jq -r '.Invoicing.repository' extensions/manifest.json)"
|
||||||
echo "invoicing_ref=$(jq -r '.Invoicing.ref' 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"
|
} >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: "Checkout billing extension"
|
- name: "Checkout billing extension"
|
||||||
@@ -145,6 +147,25 @@ jobs:
|
|||||||
- name: "Install npm dependencies in invoicing extension"
|
- name: "Install npm dependencies in invoicing extension"
|
||||||
run: cd extensions/Invoicing && npm ci
|
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"
|
- name: "Setup PHP with PECL extension"
|
||||||
uses: shivammathur/setup-php@v2
|
uses: shivammathur/setup-php@v2
|
||||||
with:
|
with:
|
||||||
@@ -168,6 +189,9 @@ jobs:
|
|||||||
- name: "Activate invoicing extension"
|
- name: "Activate invoicing extension"
|
||||||
run: php artisan module:enable Invoicing
|
run: php artisan module:enable Invoicing
|
||||||
|
|
||||||
|
- name: "Activate auditing extension"
|
||||||
|
run: php artisan module:enable Auditing
|
||||||
|
|
||||||
- name: "Install npm dependencies"
|
- name: "Install npm dependencies"
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
||||||
|
|||||||
@@ -1,95 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Filament\Resources;
|
|
||||||
|
|
||||||
use App\Filament\Resources\AuditResource\Pages;
|
|
||||||
use App\Models\Audit;
|
|
||||||
use Filament\Forms;
|
|
||||||
use Filament\Forms\Form;
|
|
||||||
use Filament\Resources\Resource;
|
|
||||||
use Filament\Tables;
|
|
||||||
use Filament\Tables\Columns\IconColumn;
|
|
||||||
use Filament\Tables\Table;
|
|
||||||
use Illuminate\Support\Str;
|
|
||||||
use Novadaemon\FilamentPrettyJson\Form\PrettyJsonField;
|
|
||||||
|
|
||||||
class AuditResource extends Resource
|
|
||||||
{
|
|
||||||
protected static ?string $model = Audit::class;
|
|
||||||
|
|
||||||
protected static ?string $navigationIcon = 'heroicon-o-archive-box';
|
|
||||||
|
|
||||||
protected static ?string $navigationGroup = 'System';
|
|
||||||
|
|
||||||
public static function form(Form $form): Form
|
|
||||||
{
|
|
||||||
return $form
|
|
||||||
->schema([
|
|
||||||
Forms\Components\TextInput::make('user_type')
|
|
||||||
->maxLength(255),
|
|
||||||
Forms\Components\TextInput::make('user_id'),
|
|
||||||
Forms\Components\TextInput::make('event')
|
|
||||||
->required()
|
|
||||||
->maxLength(255),
|
|
||||||
Forms\Components\TextInput::make('auditable_type')
|
|
||||||
->required()
|
|
||||||
->maxLength(255),
|
|
||||||
Forms\Components\TextInput::make('auditable_id')
|
|
||||||
->required(),
|
|
||||||
PrettyJsonField::make('old_values'),
|
|
||||||
PrettyJsonField::make('new_values'),
|
|
||||||
Forms\Components\Textarea::make('url'),
|
|
||||||
Forms\Components\TextInput::make('ip_address'),
|
|
||||||
Forms\Components\TextInput::make('user_agent')
|
|
||||||
->maxLength(1023),
|
|
||||||
Forms\Components\TextInput::make('tags')
|
|
||||||
->maxLength(255),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function table(Table $table): Table
|
|
||||||
{
|
|
||||||
return $table
|
|
||||||
->columns([
|
|
||||||
Tables\Columns\TextColumn::make('user.name'),
|
|
||||||
Tables\Columns\TextColumn::make('event'),
|
|
||||||
Tables\Columns\TextColumn::make('auditable_type'),
|
|
||||||
Tables\Columns\TextColumn::make('auditable_id'),
|
|
||||||
IconColumn::make('was_command')
|
|
||||||
->getStateUsing(fn (Audit $record) => Str::startsWith($record->url, 'artisan '))
|
|
||||||
->boolean(),
|
|
||||||
Tables\Columns\TextColumn::make('created_at')
|
|
||||||
->sortable()
|
|
||||||
->dateTime(),
|
|
||||||
Tables\Columns\TextColumn::make('updated_at')
|
|
||||||
->sortable()
|
|
||||||
->dateTime(),
|
|
||||||
])
|
|
||||||
->filters([
|
|
||||||
//
|
|
||||||
])
|
|
||||||
->actions([
|
|
||||||
Tables\Actions\ViewAction::make(),
|
|
||||||
])
|
|
||||||
->bulkActions([
|
|
||||||
])
|
|
||||||
->defaultSort('created_at', 'desc');
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getRelations(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function getPages(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'index' => Pages\ListAudits::route('/'),
|
|
||||||
'create' => Pages\CreateAudit::route('/create'),
|
|
||||||
'view' => Pages\ViewAudit::route('/{record}'),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Filament\Resources\AuditResource\Pages;
|
|
||||||
|
|
||||||
use App\Filament\Resources\AuditResource;
|
|
||||||
use Filament\Resources\Pages\CreateRecord;
|
|
||||||
|
|
||||||
class CreateAudit extends CreateRecord
|
|
||||||
{
|
|
||||||
protected static string $resource = AuditResource::class;
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Filament\Resources\AuditResource\Pages;
|
|
||||||
|
|
||||||
use App\Filament\Resources\AuditResource;
|
|
||||||
use Filament\Resources\Pages\ListRecords;
|
|
||||||
|
|
||||||
class ListAudits extends ListRecords
|
|
||||||
{
|
|
||||||
protected static string $resource = AuditResource::class;
|
|
||||||
|
|
||||||
protected function getHeaderActions(): array
|
|
||||||
{
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Filament\Resources\AuditResource\Pages;
|
|
||||||
|
|
||||||
use App\Filament\Resources\AuditResource;
|
|
||||||
use Filament\Resources\Pages\ViewRecord;
|
|
||||||
|
|
||||||
class ViewAudit extends ViewRecord
|
|
||||||
{
|
|
||||||
protected static string $resource = AuditResource::class;
|
|
||||||
}
|
|
||||||
@@ -10,5 +10,9 @@
|
|||||||
"Invoicing": {
|
"Invoicing": {
|
||||||
"repository": "solidtime-io/extension-invoicing",
|
"repository": "solidtime-io/extension-invoicing",
|
||||||
"ref": "v0.0.6"
|
"ref": "v0.0.6"
|
||||||
|
},
|
||||||
|
"Auditing": {
|
||||||
|
"repository": "solidtime-io/extension-auditing",
|
||||||
|
"ref": "v0.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace Tests\Unit\Filament\Resources;
|
|
||||||
|
|
||||||
use App\Filament\Resources\AuditResource;
|
|
||||||
use App\Models\Audit;
|
|
||||||
use App\Models\TimeEntry;
|
|
||||||
use App\Models\User;
|
|
||||||
use Illuminate\Support\Facades\Config;
|
|
||||||
use Illuminate\Support\Facades\DB;
|
|
||||||
use Livewire\Livewire;
|
|
||||||
use PHPUnit\Framework\Attributes\UsesClass;
|
|
||||||
use Tests\Unit\Filament\FilamentTestCase;
|
|
||||||
|
|
||||||
#[UsesClass(AuditResource::class)]
|
|
||||||
class AuditResourceTest extends FilamentTestCase
|
|
||||||
{
|
|
||||||
protected function setUp(): void
|
|
||||||
{
|
|
||||||
parent::setUp();
|
|
||||||
Config::set('auth.super_admins', ['admin@example.com']);
|
|
||||||
$user = User::factory()->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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user