From d68bfdc2e07b04f70d782ab8bfec9b00cd51e267 Mon Sep 17 00:00:00 2001 From: Daniel Karbach Date: Mon, 8 Dec 2025 15:12:18 +0100 Subject: [PATCH] raceroom creation flag & lead time setting --- app/Http/Controllers/EpisodeController.php | 8 ++++ app/Models/Episode.php | 1 + app/Models/Event.php | 1 + ...5_12_08_124710_raceroom_creation_flags.php | 38 +++++++++++++++++++ docs/public-api.md | 14 +++++++ 5 files changed, 62 insertions(+) create mode 100644 database/migrations/2025_12_08_124710_raceroom_creation_flags.php diff --git a/app/Http/Controllers/EpisodeController.php b/app/Http/Controllers/EpisodeController.php index c2d9cc8..9711849 100644 --- a/app/Http/Controllers/EpisodeController.php +++ b/app/Http/Controllers/EpisodeController.php @@ -224,6 +224,7 @@ class EpisodeController extends Controller { $validatedData = $request->validate([ 'after' => 'nullable|date', 'before' => 'nullable|date', + 'create_raceroom' => 'boolean', 'event' => 'nullable|array', 'event.*' => 'numeric', 'eventInvert' => 'boolean', @@ -249,6 +250,13 @@ class EpisodeController extends Controller { if (isset($validatedData['before'])) { $episodes = $episodes->where('episodes.start', '<=', $validatedData['before']); } + if (isset($validatedData['create_raceroom'])) { + if ($validatedData['create_raceroom']) { + $episodes->where(DB::raw('COALESCE(`episodes`.`create_raceroom`, `events`.`create_raceroom`)'), '!=', '0'); + } else { + $episodes->where(DB::raw('COALESCE(`episodes`.`create_raceroom`, `events`.`create_raceroom`)'), '=', '0'); + } + } if (!$this->userMaySeeAllEvents($request)) { $privIDs = $this->getUserPrivilegedEvents($request); if (!empty($privIDs)) { diff --git a/app/Models/Episode.php b/app/Models/Episode.php index d60fd63..67114c7 100644 --- a/app/Models/Episode.php +++ b/app/Models/Episode.php @@ -174,6 +174,7 @@ class Episode extends Model protected $casts = [ 'confirmed' => 'boolean', + 'create_raceroom' => 'boolean', 'start' => 'datetime', ]; diff --git a/app/Models/Event.php b/app/Models/Event.php index 83caead..8a0d198 100644 --- a/app/Models/Event.php +++ b/app/Models/Event.php @@ -41,6 +41,7 @@ class Event extends Model } protected $casts = [ + 'create_raceroom' => 'boolean', 'end' => 'datetime', 'start' => 'datetime', 'visible' => 'boolean', diff --git a/database/migrations/2025_12_08_124710_raceroom_creation_flags.php b/database/migrations/2025_12_08_124710_raceroom_creation_flags.php new file mode 100644 index 0000000..0f44d18 --- /dev/null +++ b/database/migrations/2025_12_08_124710_raceroom_creation_flags.php @@ -0,0 +1,38 @@ +boolean('create_raceroom')->default(false); + $table->unsignedInteger('raceroom_lead_time')->default(30 * 60); + }); + Schema::table('episodes', function (Blueprint $table) { + $table->string('create_raceroom')->nullable()->default(null); + $table->string('raceroom_lead_time')->nullable()->default(null); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('events', function (Blueprint $table) { + $table->dropColumn('create_raceroom'); + $table->dropColumn('raceroom_lead_time'); + }); + Schema::table('episodes', function (Blueprint $table) { + $table->dropColumn('create_raceroom'); + $table->dropColumn('raceroom_lead_time'); + }); + } +}; diff --git a/docs/public-api.md b/docs/public-api.md index eb07312..faddadc 100644 --- a/docs/public-api.md +++ b/docs/public-api.md @@ -1,5 +1,14 @@ # Public API +GET parameters: +multivalued parameters use the PHP bracket notation, e.g. event%5B%5D=2&event%5B%5D=5 +datetime values use ISO notation, e.g. 2025-10-16T22:00:00.000000Z +booleans are encoded as "0" or "1" + +Responses: +200 Responses will have a JSON encoded Object or Array as body +other responses will communicate their intent via status code, most will also have boilerplate HTML bodies + ## Base URI https://alttp.localhorst.tv/api @@ -14,6 +23,7 @@ GET /episodes Parameters: - after: Date - before: Date +- create_raceroom: Boolean - event[]: Integer - eventInvert: Boolean; switches event[] to exclusion filter - game[]: String @@ -26,6 +36,7 @@ Response: Array of Episode objects with following fields: - channels: Array of Channel objects - comment: String; supplementary information, may be empty, not localised - confirmed: Boolean +- create_raceroom: Boolean or null; if null, use event's prop instead - crew: Array of EpisodeCrew objects - estimate: Integer; approximate runtime in seconds - event: Object of type Event @@ -34,6 +45,7 @@ Response: Array of Episode objects with following fields: - id: Integer - players: Array of EpisodePlayer objects; with user if available - raceroom: String or null; URL of race room if available +- raceroom_lead_time: Integer or null; in seconds. if null, use event's prop instead - start: Date; includes delay, if any - title: String @@ -87,12 +99,14 @@ Parameters: Response: Array of Event objects with following fields: - banner: String; host-relative URL to banner image (discord event layout) or empty - corner: String; host-relative URL to corner image (bottom left background) or empty +- create_raceroom: Boolean - description: optional object of type Content or null; only present if with[]=description was requested, may be null if event has no description - end: Date or null - external_schedule: String or null; if externally managed, this contains the reference - game: String or null - id: Integer - name: String +- raceroom_lead_time: Integer; in seconds - racetime_category: String or null - short: String; shorter version of title, may be empty - start: Date or null -- 2.47.3