Added telescope, basic project endpoint, basic filament resources, GitHub actions

This commit is contained in:
Constantin Graf
2024-01-28 18:57:28 +01:00
parent e4f0eac834
commit e60e502612
80 changed files with 2563 additions and 135 deletions

View File

@@ -4,10 +4,16 @@ declare(strict_types=1);
namespace App\Providers;
use App\Models\Client;
use App\Models\Membership;
use App\Models\Organization;
use App\Models\OrganizationInvitation;
use App\Models\Project;
use App\Models\Tag;
use App\Models\Task;
use App\Models\TimeEntry;
use App\Models\User;
use Filament\Forms\Components\Section;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\ServiceProvider;
@@ -27,13 +33,27 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot(): void
{
if ($this->app->environment('local')) {
$this->app->register(\Laravel\Telescope\TelescopeServiceProvider::class);
$this->app->register(TelescopeServiceProvider::class);
}
Model::preventLazyLoading(! $this->app->isProduction());
Model::preventSilentlyDiscardingAttributes(! $this->app->isProduction());
Relation::enforceMorphMap([
'membership' => Membership::class,
'team' => Organization::class,
'team_invitation' => OrganizationInvitation::class,
'organization' => Organization::class,
'organization-invitation' => OrganizationInvitation::class,
'user' => User::class,
'time-entry' => TimeEntry::class,
'project' => Project::class,
'task' => Task::class,
'client' => Client::class,
'tag' => Tag::class,
]);
Model::unguard();
Section::configureUsing(function (Section $section): void {
$section->columns(1);
}, null, true);
}
}

View File

@@ -7,6 +7,7 @@ namespace App\Providers\Filament;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\DisableBladeIconComponents;
use Filament\Http\Middleware\DispatchServingFilamentEvent;
use Filament\Navigation\NavigationGroup;
use Filament\Pages;
use Filament\Panel;
use Filament\PanelProvider;
@@ -18,7 +19,9 @@ use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Session\Middleware\AuthenticateSession;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\Support\Facades\App;
use Illuminate\View\Middleware\ShareErrorsFromSession;
use pxlrbt\FilamentEnvironmentIndicator\EnvironmentIndicatorPlugin;
class AdminPanelProvider extends PanelProvider
{
@@ -40,6 +43,21 @@ class AdminPanelProvider extends PanelProvider
->widgets([
Widgets\AccountWidget::class,
])
->plugins([
EnvironmentIndicatorPlugin::make()
->color(fn () => match (App::environment()) {
'production' => null,
'staging' => Color::Orange,
default => Color::Blue,
}),
])
->navigationGroups([
NavigationGroup::make()
->label('Timetracking'),
NavigationGroup::make()
->label('Users')
->collapsed(),
])
->middleware([
EncryptCookies::class,
AddQueuedCookiesToResponse::class,

View File

@@ -49,19 +49,27 @@ class JetstreamServiceProvider extends ServiceProvider
*/
protected function configurePermissions(): void
{
Jetstream::defaultApiTokenPermissions(['read']);
Jetstream::defaultApiTokenPermissions([]);
Jetstream::role('admin', 'Administrator', [
'create',
'read',
'update',
'delete',
'projects:view',
'projects:create',
'projects:update',
'projects:delete',
])->description('Administrator users can perform any action.');
Jetstream::role('editor', 'Editor', [
'read',
'create',
'update',
Jetstream::role('manager', 'Manager', [
'projects:view',
'projects:create',
'projects:update',
'projects:delete',
])->description('Editor users have the ability to read, create, and update.');
Jetstream::role('employee', 'Employee', [
'projects:view',
'projects:create',
'projects:update',
'projects:delete',
])->description('Editor users have the ability to read, create, and update.');
}
}

View File

@@ -33,6 +33,7 @@ class RouteServiceProvider extends ServiceProvider
$this->routes(function () {
Route::middleware('api')
->prefix('api')
->name('api.')
->group(base_path('routes/api.php'));
Route::middleware('web')

View File

@@ -0,0 +1,67 @@
<?php
declare(strict_types=1);
namespace App\Providers;
use App\Models\User;
use Illuminate\Support\Facades\Gate;
use Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
use Laravel\Telescope\TelescopeApplicationServiceProvider;
class TelescopeServiceProvider extends TelescopeApplicationServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
Telescope::night();
$this->hideSensitiveRequestDetails();
Telescope::filter(function (IncomingEntry $entry) {
if ($this->app->environment('local')) {
return true;
}
return $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 $user): bool {
// Note: Telescope is only available in local environments, so this should not be relevant.
return false;
});
}
}