diff --git a/app/Http/Controllers/OTSController.php b/app/Http/Controllers/OTSController.php
index e707e4c..600c054 100644
--- a/app/Http/Controllers/OTSController.php
+++ b/app/Http/Controllers/OTSController.php
@@ -4,30 +4,54 @@ namespace App\Http\Controllers;
use App\Http\Requests\StoreOTSRequest;
use App\Models\OneTimeSecret;
+use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
+use Illuminate\Http\Request;
use Inertia\Inertia;
use Inertia\Response;
class OTSController extends Controller
{
+ public function created(Request $request)
+ {
+ $link = $request->session()->get('otsLink');
+ $request->session()->remove('otsLink');
+ if (! $link) {
+ return redirect()->route('ots.create');
+ }
+
+ return Inertia::render('ots/Created', [
+ 'otsLink' => $link,
+ ]);
+ }
+
public function store(StoreOTSRequest $request): RedirectResponse
{
$validated = $request->validated();
- OneTimeSecret::create(($validated + ['expires_at' => now()->addMinutes(30)]));
+ $ots = OneTimeSecret::create(($validated + ['expires_at' => now()->addMinutes(30)]));
+ $otsLink = route('ots.show', ['oneTimeSecret' => $ots->id]);
- return back();
+ return redirect()->route('ots.created')->with(['otsLink' => $otsLink]);
}
public function create(): Response
{
- return Inertia::render('ots/Create');
+ return Inertia::render('ots/Create', []);
}
public function show(OneTimeSecret $oneTimeSecret): Response
{
- $oneTimeSecret->delete();
+ return Inertia::render('ots/Show', ['oneTimeSecretId' => $oneTimeSecret->id]);
+ }
- return Inertia::render('ots/Show', ['oneTimeSecret' => $oneTimeSecret]);
+ public function reveal(OneTimeSecret $oneTimeSecret): JsonResponse
+ {
+ $oneTimeSecret->delete();
+ if ($oneTimeSecret->expires_at->isPast()) {
+ abort(404);
+ }
+
+ return response()->json(['secret' => $oneTimeSecret->secret]);
}
}
diff --git a/app/Http/Controllers/TeamController.php b/app/Http/Controllers/TeamController.php
index 5558553..b1d3c23 100644
--- a/app/Http/Controllers/TeamController.php
+++ b/app/Http/Controllers/TeamController.php
@@ -80,7 +80,7 @@ class TeamController extends Controller
public function create(): Response
{
- return Inertia::render('team/Create');
+ return Inertia::render('team/Create', []);
}
/**
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c733e04..af04627 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -203,6 +203,14 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
+overrides:
+ brace-expansion@>=2.0.0 <2.1.5: ^2.1.5
+ brace-expansion@>=2.0.0 <2.1.6: ^2.1.6
+ shell-quote@>=1.8.4 <1.11.0: ^1.11.0
+ source-map-js@>=1.0.0 <1.2.2: ^1.2.2
+ tinypool@<2.1.2: ^2.1.2
+ tinypool@<=2.1.0: ^2.1.1
+
importers:
.:
@@ -1359,8 +1367,8 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- brace-expansion@2.1.4:
- resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==}
+ brace-expansion@2.1.7:
+ resolution: {integrity: sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==}
chai@6.2.2:
resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
@@ -1846,8 +1854,8 @@ packages:
scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
- shell-quote@1.9.0:
- resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==}
+ shell-quote@1.12.0:
+ resolution: {integrity: sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==}
engines: {node: '>= 0.4'}
siginfo@2.0.0:
@@ -1864,8 +1872,8 @@ packages:
resolution: {integrity: sha512-SO/3iYL5S3W57LLEniscOGPZgOqZUPCx6d3dB+52B80yJ0XstzsC/eV8gnA4tM3MHDrKz+OCFSLNjswdSC+/bA==}
engines: {node: '>=22'}
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ source-map-js@1.2.2:
+ resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==}
engines: {node: '>=0.10.0'}
stack-utils@2.0.6:
@@ -1923,8 +1931,8 @@ packages:
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'}
- tinypool@2.1.0:
- resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==}
+ tinypool@2.2.0:
+ resolution: {integrity: sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==}
engines: {node: ^20.0.0 || >=22.0.0}
tinyrainbow@3.1.1:
@@ -2493,7 +2501,7 @@ snapshots:
jiti: 2.7.0
lightningcss: 1.32.0
magic-string: 0.30.21
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
tailwindcss: 4.3.3
'@tailwindcss/oxide-android-arm64@4.3.3':
@@ -2735,7 +2743,7 @@ snapshots:
'@vue/shared': 3.5.42
entities: 7.0.1
estree-walker: 2.0.2
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
'@vue/compiler-dom@3.5.42':
dependencies:
@@ -2752,7 +2760,7 @@ snapshots:
estree-walker: 2.0.2
magic-string: 0.30.21
postcss: 8.5.28
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
'@vue/compiler-ssr@3.5.42':
dependencies:
@@ -2929,7 +2937,7 @@ snapshots:
balanced-match@1.0.2: {}
- brace-expansion@2.1.4:
+ brace-expansion@2.1.7:
dependencies:
balanced-match: 1.0.2
@@ -2977,7 +2985,7 @@ snapshots:
dependencies:
chalk: 5.6.2
rxjs: 7.8.2
- shell-quote: 1.9.0
+ shell-quote: 1.12.0
supports-color: 10.2.2
tree-kill: 1.2.2
yargs: 18.0.0
@@ -3215,7 +3223,7 @@ snapshots:
minimatch@9.0.9:
dependencies:
- brace-expansion: 2.1.4
+ brace-expansion: 2.1.7
mrmime@2.0.1: {}
@@ -3234,7 +3242,7 @@ snapshots:
oxfmt@0.64.0(vite-plus@0.3.0(@types/node@22.20.2)(jiti@2.7.0)(typescript@5.9.3)(vite@8.2.2(@types/node@22.20.2)(jiti@2.7.0))):
dependencies:
- tinypool: 2.1.0
+ tinypool: 2.2.0
optionalDependencies:
'@oxfmt/binding-android-arm-eabi': 0.64.0
'@oxfmt/binding-android-arm64': 0.64.0
@@ -3309,7 +3317,7 @@ snapshots:
dependencies:
nanoid: 3.3.18
picocolors: 1.1.1
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
pretty-format@27.5.1:
dependencies:
@@ -3378,7 +3386,7 @@ snapshots:
scheduler@0.27.0:
optional: true
- shell-quote@1.9.0: {}
+ shell-quote@1.12.0: {}
siginfo@2.0.0: {}
@@ -3397,7 +3405,7 @@ snapshots:
is-fullwidth-code-point: 5.1.0
optional: true
- source-map-js@1.2.1: {}
+ source-map-js@1.2.2: {}
stack-utils@2.0.6:
dependencies:
@@ -3447,7 +3455,7 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.7)
picomatch: 4.0.7
- tinypool@2.1.0: {}
+ tinypool@2.2.0: {}
tinyrainbow@3.1.1: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index ca76b30..e2ec643 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,7 +1,15 @@
packages:
- - '.'
+ - '.'
ignoreScripts: true
+overrides:
+ brace-expansion@>=2.0.0 <2.1.5: ^2.1.5
+ brace-expansion@>=2.0.0 <2.1.6: ^2.1.6
+ shell-quote@>=1.8.4 <1.11.0: ^1.11.0
+ source-map-js@>=1.0.0 <1.2.2: ^1.2.2
+ tinypool@<2.1.2: ^2.1.2
+ tinypool@<=2.1.0: ^2.1.1
+
publicHoistPattern:
- - '@inertiajs/core'
+ - '@inertiajs/core'
diff --git a/resources/js/pages/ots/Created.vue b/resources/js/pages/ots/Created.vue
new file mode 100644
index 0000000..15fe46b
--- /dev/null
+++ b/resources/js/pages/ots/Created.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+ Erstellt!
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/pages/ots/Show.vue b/resources/js/pages/ots/Show.vue
index a154f64..d92fb4f 100644
--- a/resources/js/pages/ots/Show.vue
+++ b/resources/js/pages/ots/Show.vue
@@ -1,19 +1,46 @@
-
+
+
+
+ Möchtest du das Secret Anzeigen?
+
+
+ Nach dem Anzeigen des Secrets wird es unwiderruflich gelöscht und kann
+ nicht noch einmal angezeigt werden!
+
+
+
+
+
diff --git a/resources/js/types/models.ts b/resources/js/types/models.ts
index 025f188..c47a4e1 100644
--- a/resources/js/types/models.ts
+++ b/resources/js/types/models.ts
@@ -8,7 +8,6 @@ export interface Team {
export interface OTS {
secret: string;
- expires_at: string;
}
export type TeamMemberRole = 'owner' | 'admin' | 'member';
diff --git a/routes/web.php b/routes/web.php
index d13729b..8d71ee8 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -34,8 +34,10 @@ Route::middleware(['auth'])->group(function () {
Route::name('ots.')->prefix('ots')->group(function () {
Route::get('/', [OTSController::class, 'create'])->name('create');
+ Route::get('created', [OTSController::class, 'created'])->name('created');
Route::post('/', [OTSController::class, 'store'])->name('store');
Route::get('/{oneTimeSecret}', [OTSController::class, 'show'])->name('show');
+ Route::post('/{oneTimeSecret}', [OTSController::class, 'reveal'])->name('reveal');
});
require __DIR__.'/settings.php';