Repo rebuild

This commit is contained in:
Mark Gregory
2026-09-15 12:33:28 +01:00
commit be28c4feec
5629 changed files with 317074 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
<?php
+8
View File
@@ -0,0 +1,8 @@
<?php
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
+77
View File
@@ -0,0 +1,77 @@
<?php
use Illuminate\Support\Facades\Route;
use Laravel\Jetstream\Http\Controllers\CurrentTeamController;
use Laravel\Jetstream\Http\Controllers\Inertia\ApiTokenController;
use Laravel\Jetstream\Http\Controllers\Inertia\CurrentUserController;
use Laravel\Jetstream\Http\Controllers\Inertia\OtherBrowserSessionsController;
use Laravel\Jetstream\Http\Controllers\Inertia\PrivacyPolicyController;
use Laravel\Jetstream\Http\Controllers\Inertia\ProfilePhotoController;
use Laravel\Jetstream\Http\Controllers\Inertia\TeamController;
use Laravel\Jetstream\Http\Controllers\Inertia\TeamMemberController;
use Laravel\Jetstream\Http\Controllers\Inertia\TermsOfServiceController;
use Laravel\Jetstream\Http\Controllers\Inertia\UserProfileController;
use Laravel\Jetstream\Http\Controllers\TeamInvitationController;
use Laravel\Jetstream\Jetstream;
Route::group(['middleware' => config('jetstream.middleware', ['web'])], function () {
if (Jetstream::hasTermsAndPrivacyPolicyFeature()) {
Route::get('/terms-of-service', [TermsOfServiceController::class, 'show'])->name('terms.show');
Route::get('/privacy-policy', [PrivacyPolicyController::class, 'show'])->name('policy.show');
}
$authMiddleware = config('jetstream.guard')
? 'auth:' . config('jetstream.guard')
: 'auth';
$authSessionMiddleware = config('jetstream.auth_session', false)
? config('jetstream.auth_session')
: null;
Route::group(['middleware' => array_values(array_filter([$authMiddleware, $authSessionMiddleware]))], function () {
// User & Profile...
Route::get('/user/profile', [UserProfileController::class, 'show'])
->name('profile.show');
Route::delete('/user/other-browser-sessions', [OtherBrowserSessionsController::class, 'destroy'])
->name('other-browser-sessions.destroy');
Route::delete('/user/profile-photo', [ProfilePhotoController::class, 'destroy'])
->name('current-user-photo.destroy');
if (Jetstream::hasAccountDeletionFeatures()) {
Route::delete('/user', [CurrentUserController::class, 'destroy'])
->name('current-user.destroy');
}
Route::group(['middleware' => 'verified'], function () {
// API...
if (Jetstream::hasApiFeatures()) {
Route::get('/user/api-tokens', [ApiTokenController::class, 'index'])->name('api-tokens.index');
Route::post('/user/api-tokens', [ApiTokenController::class, 'store'])->name('api-tokens.store');
Route::put('/user/api-tokens/{token}', [ApiTokenController::class, 'update'])->name('api-tokens.update');
Route::delete('/user/api-tokens/{token}', [ApiTokenController::class, 'destroy'])->name('api-tokens.destroy');
}
// Teams...
if (Jetstream::hasTeamFeatures()) {
Route::get('/teams/create', [TeamController::class, 'create'])->name('teams.create');
Route::post('/teams', [TeamController::class, 'store'])->name('teams.store');
Route::get('/teams/{team}', [TeamController::class, 'show'])->name('teams.show');
Route::put('/teams/{team}', [TeamController::class, 'update'])->name('teams.update');
Route::delete('/teams/{team}', [TeamController::class, 'destroy'])->name('teams.destroy');
Route::put('/current-team', [CurrentTeamController::class, 'update'])->name('current-team.update');
Route::post('/teams/{team}/members', [TeamMemberController::class, 'store'])->name('team-members.store');
Route::put('/teams/{team}/members/{user}', [TeamMemberController::class, 'update'])->name('team-members.update');
Route::delete('/teams/{team}/members/{user}', [TeamMemberController::class, 'destroy'])->name('team-members.destroy');
Route::get('/team-invitations/{invitation}', [TeamInvitationController::class, 'accept'])
->middleware(['signed'])
->name('team-invitations.accept');
Route::delete('/team-invitations/{invitation}', [TeamInvitationController::class, 'destroy'])
->name('team-invitations.destroy');
}
});
});
});
+22
View File
@@ -0,0 +1,22 @@
<?php
use App\Livewire\Settings\Appearance;
use App\Livewire\Settings\Profile;
use App\Livewire\Settings\Security;
use Illuminate\Support\Facades\Route;
Route::middleware(['auth'])->group(function () {
Route::redirect('settings', 'settings/profile');
Route::livewire('settings/profile', Profile::class)->name('profile.edit');
});
Route::middleware(['auth', 'verified'])->group(function () {
Route::livewire('settings/appearance', Appearance::class)->name('appearance.edit');
Route::livewire('settings/security', Security::class)
->middleware([
'password.confirm',
])
->name('security.edit');
});
+29
View File
@@ -0,0 +1,29 @@
<?php
declare(strict_types=1);
use Illuminate\Support\Facades\Route;
use Stancl\Tenancy\Middleware\InitializeTenancyByDomain;
use Stancl\Tenancy\Middleware\PreventAccessFromCentralDomains;
/*
|--------------------------------------------------------------------------
| Tenant Routes
|--------------------------------------------------------------------------
|
| Here you can register the tenant routes for your application.
| These routes are loaded by the TenantRouteServiceProvider.
|
| Feel free to customize them however you want. Good luck!
|
*/
Route::middleware([
'web',
InitializeTenancyByDomain::class,
PreventAccessFromCentralDomains::class,
])->group(function () {
Route::get('/', function () {
return 'This is your multi-tenant application. The id of the current tenant is ' . tenant('id');
});
});
+76
View File
@@ -0,0 +1,76 @@
<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Route;
use Modules\Platform\app\Http\Controllers\PlatformDashboardController;
Route::get('/', function () {
return auth()->check()
? redirect()->route('dashboard')
: redirect()->route('login');
})->name('home');
Route::get('/dashboard', PlatformDashboardController::class)
->middleware(['auth', 'verified', 'company.licensed'])
->name('dashboard');
require __DIR__ . '/settings.php';
Route::get('/api/countries/resolve/{code}', function (string $code) {
$normalised = strtoupper(trim($code));
$country = DB::table('countries')
->whereRaw('UPPER(alpha2) = ?', [$normalised])
->orWhereRaw('UPPER(alpha3) = ?', [$normalised])
->orWhere('numeric', $normalised)
->first();
abort_if($country === null, 404);
return response()->json([
'data' => [
'id' => $country->id ?? null,
'name' => $country->name ?? null,
'official_name' => $country->official_name ?? null,
'common_name' => $country->common_name ?? null,
'display_name' => $country->display_name ?? null,
'alpha2' => $country->alpha2 ?? null,
'alpha3' => $country->alpha3 ?? null,
'numeric' => $country->numeric ?? null,
'region' => $country->region ?? null,
'subregion' => $country->subregion ?? null,
'flag_emoji' => $country->flag_emoji ?? null,
'is_active' => (bool) ($country->is_active ?? true),
],
]);
})->name('countries.api.resolve.compat');
Route::get('/api/countries/{code}/subdivisions', function (string $code) {
$normalised = strtoupper(trim($code));
$country = DB::table('countries')
->whereRaw('UPPER(alpha2) = ?', [$normalised])
->orWhereRaw('UPPER(alpha3) = ?', [$normalised])
->orWhere('numeric', $normalised)
->first();
abort_if($country === null, 404);
$subdivisions = DB::table('country_subdivisions')
->where('country_id', $country->id)
->orderBy('sort_order')
->orderBy('name')
->get()
->map(fn ($subdivision) => [
'id' => $subdivision->id ?? null,
'country_id' => $subdivision->country_id ?? null,
'code' => $subdivision->code ?? null,
'name' => $subdivision->name ?? null,
'type' => $subdivision->type ?? null,
'parent_code' => $subdivision->parent_code ?? null,
'is_active' => (bool) ($subdivision->is_active ?? true),
])
->values();
return response()->json(['data' => $subdivisions]);
})->name('countries.api.subdivisions.compat');