mirror of
https://github.com/HolgerHatGarKeineNode/einundzwanzig-app.git
synced 2025-12-15 12:16:47 +00:00
✨ Add storage configuration, localization updates, and feed generation
- Added `publicDisk` configuration to `filesystems.php`. - Expanded locale translations in `es.json` and `de.json`. - Implemented RSS, Atom, and JSON feed views. - Added `feed.php` configuration for feed generation. - Introduced `ImageController` for image handling. - Updated application routing to include `api.php`.
This commit is contained in:
72
app/Http/Controllers/Api/CityController.php
Normal file
72
app/Http/Controllers/Api/CityController.php
Normal file
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\City;
|
||||
use App\Models\Lecturer;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CityController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
return City::query()
|
||||
->with(['country:id,name'])
|
||||
->select('id', 'name','country_id')
|
||||
->orderBy('name')
|
||||
->when(
|
||||
$request->search,
|
||||
fn(Builder $query) => $query
|
||||
->where('name', 'ilike', "%{$request->search}%")
|
||||
)
|
||||
->when(
|
||||
$request->exists('selected'),
|
||||
fn(Builder $query) => $query->whereIn('id',
|
||||
$request->input('selected', [])),
|
||||
fn(Builder $query) => $query->limit(10)
|
||||
)
|
||||
->get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(Lecturer $lecturer)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(Request $request, Lecturer $lecturer)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy(Lecturer $lecturer)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
76
app/Http/Controllers/Api/CountryController.php
Normal file
76
app/Http/Controllers/Api/CountryController.php
Normal file
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Country;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CountryController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
return Country::query()
|
||||
->select('id', 'name', 'code')
|
||||
->orderBy('name')
|
||||
->when(
|
||||
$request->search,
|
||||
fn(Builder $query)
|
||||
=> $query
|
||||
->where('name', 'ilike', "%{$request->search}%")
|
||||
->orWhere('code', 'ilike', "%{$request->search}%"),
|
||||
)
|
||||
->when(
|
||||
$request->exists('selected'),
|
||||
fn(Builder $query)
|
||||
=> $query
|
||||
->whereIn('code', $request->input('selected', []))
|
||||
->orWhereIn('id',
|
||||
$request->input('selected', [])),
|
||||
fn(Builder $query) => $query->limit(10),
|
||||
)
|
||||
->get()
|
||||
->map(function (Country $country) {
|
||||
$country->flag = asset('vendor/blade-country-flags/4x3-'.$country->code.'.svg');
|
||||
|
||||
return $country;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(Country $country)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(Request $request, Country $country)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy(Country $country)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
74
app/Http/Controllers/Api/CourseController.php
Normal file
74
app/Http/Controllers/Api/CourseController.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Course;
|
||||
use App\Models\Lecturer;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CourseController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
return Course::query()
|
||||
->select('id', 'name', )
|
||||
->orderBy('name')
|
||||
->when($request->has('user_id'),
|
||||
fn(Builder $query) => $query->where('created_by', $request->user_id))
|
||||
->when(
|
||||
$request->search,
|
||||
fn (Builder $query) => $query
|
||||
->where('name', 'ilike', "%{$request->search}%")
|
||||
)
|
||||
->when(
|
||||
$request->exists('selected'),
|
||||
fn (Builder $query) => $query->whereIn('id',
|
||||
$request->input('selected', [])),
|
||||
fn (Builder $query) => $query->limit(10)
|
||||
)
|
||||
->get()
|
||||
->map(function (Course $course) {
|
||||
$course->image = $course->getFirstMediaUrl('logo',
|
||||
'thumb');
|
||||
|
||||
return $course;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(Course $course)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, Course $course)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(Course $course)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
15
app/Http/Controllers/Api/EmailCampaignController.php
Normal file
15
app/Http/Controllers/Api/EmailCampaignController.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\EmailCampaign;
|
||||
|
||||
class EmailCampaignController extends Controller
|
||||
{
|
||||
public function __invoke()
|
||||
{
|
||||
return EmailCampaign::query()->get();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\EmailTexts;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class EmailCampaignGeneratorController extends Controller
|
||||
{
|
||||
public function __construct(public $model = 'openai/gpt-4', public $maxTokens = 8191)
|
||||
{
|
||||
}
|
||||
|
||||
public function __invoke(Request $request)
|
||||
{
|
||||
$campaignId = $request->get('id');
|
||||
$md5 = $request->get('md5');
|
||||
|
||||
$campaign = \App\Models\EmailCampaign::query()->find($campaignId);
|
||||
|
||||
$subject = $this->generateSubject($campaign);
|
||||
//check if subject exists in database
|
||||
$subjectExists = EmailTexts::query()->where('subject', $subject)->exists();
|
||||
// loop until subject is unique
|
||||
while ($subjectExists) {
|
||||
$subject = $this->generateSubject($campaign);
|
||||
$subjectExists = EmailTexts::query()->where('subject', $subject)->exists();
|
||||
}
|
||||
|
||||
$text = $this->generateText($campaign);
|
||||
|
||||
$emailText = EmailTexts::query()->create([
|
||||
'email_campaign_id' => $campaign->id,
|
||||
'sender_md5' => $md5,
|
||||
'subject' => $subject,
|
||||
'text' => $text,
|
||||
]);
|
||||
$emailText->load('emailCampaign');
|
||||
|
||||
return $emailText;
|
||||
}
|
||||
|
||||
public function generateSubject(\Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Builder|array|null $campaign): string
|
||||
{
|
||||
$result = Http::timeout(120)->withHeaders([
|
||||
'Authorization' => 'Bearer ' . config('openai.api_key'),
|
||||
'HTTP-Referer' => 'http://localhost',
|
||||
])->post('https://openrouter.ai/api/v1/chat/completions', [
|
||||
'model' => $this->model,
|
||||
'max_tokens' => 50,
|
||||
'temperature' => 1,
|
||||
'messages' => [
|
||||
['role' => 'user', 'content' => $campaign->subject_prompt],
|
||||
],
|
||||
]);
|
||||
|
||||
if ($result->failed()) {
|
||||
Log::error($result->json());
|
||||
abort(500, 'OpenAI API failed');
|
||||
}
|
||||
|
||||
return $result->json()['choices'][0]['message']['content'];
|
||||
}
|
||||
|
||||
public function generateText(\Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Builder|array|null $campaign): mixed
|
||||
{
|
||||
$result = Http::timeout(120)->withHeaders([
|
||||
'Authorization' => 'Bearer ' . config('openai.api_key'),
|
||||
'HTTP-Referer' => 'http://localhost',
|
||||
])->post('https://openrouter.ai/api/v1/chat/completions', [
|
||||
'model' => $this->model,
|
||||
'max_tokens' => $this->maxTokens,
|
||||
'temperature' => 1,
|
||||
'messages' => [
|
||||
['role' => 'user', 'content' => $campaign->text_prompt],
|
||||
],
|
||||
]);
|
||||
|
||||
if ($result->failed()) {
|
||||
Log::error($result->json());
|
||||
abort(500, 'OpenAI API failed');
|
||||
}
|
||||
|
||||
return $result->json()['choices'][0]['message']['content'];
|
||||
}
|
||||
|
||||
}
|
||||
103
app/Http/Controllers/Api/LanguageController.php
Normal file
103
app/Http/Controllers/Api/LanguageController.php
Normal file
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use JoeDixon\Translation\Language;
|
||||
use JoeDixon\Translation\Translation;
|
||||
|
||||
class LanguageController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$array = Language::query()
|
||||
->select('id', 'name', 'language')
|
||||
->orderBy('name')
|
||||
->when(
|
||||
$request->search,
|
||||
fn(Builder $query)
|
||||
=> $query
|
||||
->where('name', 'ilike', "%{$request->search}%")
|
||||
->orWhere('language', 'ilike', "%{$request->search}%"),
|
||||
)
|
||||
->when(
|
||||
$request->exists('selected'),
|
||||
fn(Builder $query) => $query->whereIn('language', $request->input('selected', [])),
|
||||
fn(Builder $query) => $query->limit(10),
|
||||
)
|
||||
->get()
|
||||
->map(function ($language) {
|
||||
$language->translatedCount = Translation::query()
|
||||
->where('language_id', $language['id'])
|
||||
->whereNotNull('value')
|
||||
->where('value', '<>', '')
|
||||
->count();
|
||||
$language->toTranslate = Translation::query()
|
||||
->where('language_id', $language['id'])
|
||||
->count();
|
||||
|
||||
return $language;
|
||||
})
|
||||
->toArray();
|
||||
foreach ($array as $key => $item) {
|
||||
$translated = $item['translatedCount'] > 0 ? $item['translatedCount'] : 1;
|
||||
$itemToTranslate = $item['toTranslate'] > 0 ? $item['toTranslate'] : 1;
|
||||
|
||||
$array[$key]['name'] = empty($item['name']) ? $item['language'] : $item['name'];
|
||||
$array[$key]['description'] = $item['language'] === 'en'
|
||||
? '100% translated'
|
||||
: round($translated / $itemToTranslate * 100).'% translated';
|
||||
}
|
||||
|
||||
return response()->json($array);
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @param $language
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(Language $language)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @param $language
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(Request $request, Language $language)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @param $language
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy(Language $language)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
83
app/Http/Controllers/Api/LecturerController.php
Normal file
83
app/Http/Controllers/Api/LecturerController.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Lecturer;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class LecturerController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
return Lecturer::query()
|
||||
->select('id', 'name', )
|
||||
->orderBy('name')
|
||||
// ->when($request->has('user_id'),
|
||||
// fn(Builder $query) => $query->where('created_by', $request->user_id))
|
||||
->when(
|
||||
$request->search,
|
||||
fn (Builder $query) => $query
|
||||
->where('name', 'ilike', "%{$request->search}%")
|
||||
)
|
||||
->when(
|
||||
$request->exists('selected'),
|
||||
fn (Builder $query) => $query->whereIn('id',
|
||||
$request->input('selected', [])),
|
||||
fn (Builder $query) => $query->limit(10)
|
||||
)
|
||||
->get()
|
||||
->map(function (Lecturer $lecturer) {
|
||||
$lecturer->image = $lecturer->getFirstMediaUrl('avatar',
|
||||
'thumb');
|
||||
|
||||
return $lecturer;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(Lecturer $lecturer)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(Request $request, Lecturer $lecturer)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy(Lecturer $lecturer)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
84
app/Http/Controllers/Api/MeetupController.php
Normal file
84
app/Http/Controllers/Api/MeetupController.php
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\meetup;
|
||||
use App\Models\User;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class MeetupController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$myMeetupIds = User::query()->find($request->input('user_id'))->meetups->pluck('id');
|
||||
|
||||
return Meetup::query()
|
||||
->select('id', 'name', 'city_id', 'slug')
|
||||
->with([
|
||||
'city.country',
|
||||
])
|
||||
->whereIn('id', $myMeetupIds->toArray())
|
||||
->orderBy('name')
|
||||
->when(
|
||||
$request->search,
|
||||
fn(Builder $query)
|
||||
=> $query
|
||||
->where('name', 'like', "%{$request->search}%")
|
||||
->orWhereHas('city',
|
||||
fn(Builder $query) => $query->where('cities.name', 'ilike', "%{$request->search}%")),
|
||||
)
|
||||
->when(
|
||||
$request->exists('selected'),
|
||||
fn(Builder $query) => $query->whereIn('id', $request->input('selected', [])),
|
||||
fn(Builder $query) => $query->limit(10),
|
||||
)
|
||||
->get()
|
||||
->map(function (Meetup $meetup) {
|
||||
$meetup->profile_image = $meetup->getFirstMediaUrl('logo', 'thumb');
|
||||
|
||||
return $meetup;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(meetup $meetup)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(Request $request, meetup $meetup)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy(meetup $meetup)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
78
app/Http/Controllers/Api/VenueController.php
Normal file
78
app/Http/Controllers/Api/VenueController.php
Normal file
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Lecturer;
|
||||
use App\Models\Venue;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class VenueController extends Controller
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
return Venue::query()
|
||||
->with(['city:id,name,country_id', 'city.country:id,name,code'])
|
||||
->select('id', 'name', 'city_id')
|
||||
->orderBy('name')
|
||||
->when(
|
||||
$request->search,
|
||||
fn(Builder $query) => $query
|
||||
->where('name', 'ilike', "%{$request->search}%")
|
||||
)
|
||||
->when(
|
||||
$request->exists('selected'),
|
||||
fn(Builder $query) => $query->whereIn('id',
|
||||
$request->input('selected', [])),
|
||||
fn(Builder $query) => $query->limit(10)
|
||||
)
|
||||
->get()
|
||||
->map(function (Venue $venue) {
|
||||
$venue->flag = asset('vendor/blade-country-flags/4x3-' . $venue->city->country->code . '.svg');
|
||||
$venue->description = $venue->city->name . ', ' . $venue->street;
|
||||
|
||||
return $venue;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function show(Lecturer $lecturer)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function update(Request $request, Lecturer $lecturer)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function destroy(Lecturer $lecturer)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user