mirror of
https://github.com/HolgerHatGarKeineNode/einundzwanzig-app.git
synced 2026-06-11 02:50:29 +00:00
✨ **Enhance API functionality and localizations**
- 🌐 Added API documentation annotations for multiple controllers (Meetups, Cities, Countries, Courses, Highscores, Venues), improving public and developer-facing endpoint clarity. - ➕ Integrated and configured the `dedoc/scramble` package for automated OpenAPI documentation generation. - 🔒 Excluded internal routes and actions from API documentation using `ExcludeRouteFromDocs` attributes. - 🌍 Added new localization keys for API Token features across multiple languages (`lv`, `es`, etc.). - 🛠️ Introduced `Group`, `Response`, and `QueryParameter` attributes for better request descriptions and structured documentation. - 🚀 Enhanced functionality for listing operations in controllers with filters and query parameters like `search` and `selected`.
This commit is contained in:
+10
-163
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
use App\Http\Controllers\Api\BindleController;
|
||||
use App\Http\Controllers\Api\BtcMapCommunityController;
|
||||
use App\Http\Controllers\Api\CityController;
|
||||
use App\Http\Controllers\Api\CountryController;
|
||||
use App\Http\Controllers\Api\CourseController;
|
||||
@@ -7,14 +9,11 @@ use App\Http\Controllers\Api\CourseEventController;
|
||||
use App\Http\Controllers\Api\HighscoreController;
|
||||
use App\Http\Controllers\Api\LecturerController;
|
||||
use App\Http\Controllers\Api\MeetupController;
|
||||
use App\Http\Controllers\Api\MeetupEventController;
|
||||
use App\Http\Controllers\Api\MeetupMapController;
|
||||
use App\Http\Controllers\Api\NostrPlebController;
|
||||
use App\Http\Controllers\Api\VenueController;
|
||||
use App\Http\Controllers\LnurlAuthController;
|
||||
use App\Models\LibraryItem;
|
||||
use App\Models\Meetup;
|
||||
use App\Models\MeetupEvent;
|
||||
use App\Models\User;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::middleware(['throttle:60,1'])
|
||||
@@ -32,163 +31,11 @@ Route::middleware(['throttle:60,1'])
|
||||
Route::post('highscores', [HighscoreController::class, 'store'])
|
||||
->middleware('throttle:10,1')
|
||||
->name('highscores.store');
|
||||
Route::get('nostrplebs', function () {
|
||||
return User::query()
|
||||
->select([
|
||||
'email',
|
||||
'public_key',
|
||||
'lightning_address',
|
||||
'lnurl',
|
||||
'node_id',
|
||||
'paynym',
|
||||
'lnbits',
|
||||
'nostr',
|
||||
'id',
|
||||
])
|
||||
->whereNotNull('nostr')
|
||||
->where('nostr', 'like', 'npub1%')
|
||||
->orderByDesc('id')
|
||||
->get()
|
||||
->unique('nostr')
|
||||
->pluck('nostr');
|
||||
});
|
||||
Route::get('bindles', function () {
|
||||
return LibraryItem::query()
|
||||
->where('type', 'bindle')
|
||||
->with([
|
||||
'media',
|
||||
])
|
||||
->orderByDesc('id')
|
||||
->get()
|
||||
->map(fn ($item) => [
|
||||
'id' => $item->id,
|
||||
'name' => $item->name,
|
||||
'link' => strtok($item->value, '?'),
|
||||
'image' => $item->getFirstMediaUrl('main'),
|
||||
]);
|
||||
});
|
||||
Route::get('meetups', function (Request $request) {
|
||||
return Meetup::query()
|
||||
->where('visible_on_map', true)
|
||||
->with([
|
||||
'meetupEvents',
|
||||
'city.country',
|
||||
'media',
|
||||
])
|
||||
->get()
|
||||
->map(fn ($meetup) => [
|
||||
'name' => $meetup->name,
|
||||
'portalLink' => url()->route(
|
||||
'meetups.landingpage',
|
||||
['country' => $meetup->city->country, 'meetup' => $meetup],
|
||||
),
|
||||
'url' => $meetup->telegram_link ?? $meetup->webpage,
|
||||
'top' => $meetup->github_data['top'] ?? null,
|
||||
'left' => $meetup->github_data['left'] ?? null,
|
||||
'country' => str($meetup->city->country->code)->upper(),
|
||||
'state' => $meetup->github_data['state'] ?? null,
|
||||
'city' => $meetup->city->name,
|
||||
'longitude' => (float) $meetup->city->longitude,
|
||||
'latitude' => (float) $meetup->city->latitude,
|
||||
'twitter_username' => $meetup->twitter_username,
|
||||
'website' => $meetup->webpage,
|
||||
'simplex' => $meetup->simplex,
|
||||
'signal' => $meetup->signal,
|
||||
'nostr' => $meetup->nostr,
|
||||
'next_event' => $meetup->nextEvent,
|
||||
'intro' => $request->has('withIntro') ? $meetup->intro : null,
|
||||
'logo' => $request->has('withLogos') ? $meetup->getFirstMediaUrl('logo') : null,
|
||||
]);
|
||||
});
|
||||
Route::get('meetup-events/{date?}', function ($date = null) {
|
||||
if ($date) {
|
||||
$date = Carbon::parse($date);
|
||||
}
|
||||
$events = MeetupEvent::query()
|
||||
->with([
|
||||
'meetup.city.country',
|
||||
'meetup.media',
|
||||
])
|
||||
->when(
|
||||
$date,
|
||||
fn ($query) => $query
|
||||
->where('start', '>=', $date)
|
||||
->where('start', '<=', $date->copy()->endOfMonth()),
|
||||
)
|
||||
->get();
|
||||
|
||||
return $events->map(fn ($event) => [
|
||||
'start' => $event->start->format('Y-m-d H:i'),
|
||||
'location' => $event->location,
|
||||
'description' => $event->description,
|
||||
'link' => $event->link,
|
||||
'meetup.name' => $event->meetup->name,
|
||||
'meetup.portalLink' => url()->route(
|
||||
'meetups.landingpage',
|
||||
[
|
||||
'country' => $event->meetup->city->country,
|
||||
'meetup' => $event->meetup,
|
||||
],
|
||||
),
|
||||
'meetup.url' => $event->meetup->telegram_link ?? $event->meetup->webpage,
|
||||
'meetup.country' => str($event->meetup->city->country->code)->upper(),
|
||||
'meetup.city' => $event->meetup->city->name,
|
||||
'meetup.longitude' => (float) $event->meetup->city->longitude,
|
||||
'meetup.latitude' => (float) $event->meetup->city->latitude,
|
||||
'meetup.twitter_username' => $event->meetup->twitter_username,
|
||||
'meetup.website' => $event->meetup->webpage,
|
||||
'meetup.simplex' => $event->meetup->simplex,
|
||||
'meetup.signal' => $event->meetup->signal,
|
||||
'meetup.nostr' => $event->meetup->nostr,
|
||||
'meetup.logo' => $event->meetup->getFirstMediaUrl('logo'),
|
||||
],
|
||||
);
|
||||
});
|
||||
Route::get('btc-map-communities', function () {
|
||||
return response()->json(
|
||||
Meetup::query()
|
||||
->with([
|
||||
'media',
|
||||
'city.country',
|
||||
])
|
||||
->where('community', '=', 'einundzwanzig')
|
||||
->when(
|
||||
app()->environment('production'),
|
||||
fn ($query) => $query->whereHas(
|
||||
'city',
|
||||
fn ($query) => $query
|
||||
->whereNotNull('cities.simplified_geojson')
|
||||
->whereNotNull('cities.population')
|
||||
->whereNotNull('cities.population_date'),
|
||||
),
|
||||
)
|
||||
->get()
|
||||
->map(fn ($meetup) => [
|
||||
'id' => $meetup->slug,
|
||||
'tags' => [
|
||||
'type' => 'community',
|
||||
'name' => $meetup->name,
|
||||
'continent' => 'europe',
|
||||
'icon:square' => $meetup->logoSquare,
|
||||
// 'contact:email' => null,
|
||||
'contact:twitter' => $meetup->twitter_username ? 'https://twitter.com/'.$meetup->twitter_username : null,
|
||||
'contact:website' => $meetup->webpage,
|
||||
'contact:telegram' => $meetup->telegram_link,
|
||||
'contact:nostr' => $meetup->nostr,
|
||||
// 'tips:lightning_address' => null,
|
||||
'organization' => 'einundzwanzig',
|
||||
'language' => $meetup->city->country->language_codes[0] ?? 'de',
|
||||
'geo_json' => $meetup->city->simplified_geojson,
|
||||
'population' => $meetup->city->population,
|
||||
'population:date' => $meetup->city->population_date,
|
||||
],
|
||||
])
|
||||
->toArray(),
|
||||
200,
|
||||
['Content-Type' => 'application/json;charset=UTF-8', 'Charset' => 'utf-8'],
|
||||
JSON_UNESCAPED_SLASHES,
|
||||
);
|
||||
});
|
||||
Route::get('nostrplebs', NostrPlebController::class);
|
||||
Route::get('bindles', BindleController::class);
|
||||
Route::get('meetups', MeetupMapController::class);
|
||||
Route::get('meetup-events/{date?}', MeetupEventController::class);
|
||||
Route::get('btc-map-communities', BtcMapCommunityController::class);
|
||||
});
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user