12-05-2026 Frontend dev
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (push) Waiting to run

This commit is contained in:
Kevin Adametz 2026-05-12 18:32:33 +02:00
parent 405df0a122
commit 5b8bdf4182
779 changed files with 480564 additions and 6241 deletions

View file

@ -0,0 +1,27 @@
<?php
namespace Database\Seeders;
use App\Models\AdminPreset;
use Illuminate\Database\Seeder;
class AdminPresetSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
AdminPreset::query()->updateOrCreate(
['key' => AdminPreset::PRESS_RELEASE_DELETED_PUBLISHED_TEXT],
[
'area' => 'press_releases',
'type' => 'text',
'label' => 'Ersatztext fuer geloeschte veroeffentlichte Pressemitteilungen',
'value' => "Diese Pressemitteilung wurde entfernt.\n\nDer Inhalt ist nicht mehr verfuegbar. Bitte wenden Sie sich bei Rueckfragen an den Betreiber des Presseportals.",
'payload' => null,
'is_active' => true,
],
);
}
}

View file

@ -0,0 +1,100 @@
<?php
namespace Database\Seeders;
use App\Enums\Portal;
use App\Models\Category;
use Illuminate\Database\Seeder;
class CategorySeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$categories = [
[
'key' => 'news-wirtschaft',
'portal' => Portal::Both,
'translations' => [
'de' => [
'name' => 'Wirtschaft',
'slug' => 'wirtschaft',
'description' => 'Pressemitteilungen aus Wirtschaft und Unternehmen.',
],
'en' => [
'name' => 'Business',
'slug' => 'business',
'description' => 'Press releases from business and companies.',
],
],
],
[
'key' => 'news-technologie',
'portal' => Portal::Both,
'translations' => [
'de' => [
'name' => 'Technologie',
'slug' => 'technologie',
'description' => 'News rund um Innovation, IT und digitale Themen.',
],
'en' => [
'name' => 'Technology',
'slug' => 'technology',
'description' => 'News around innovation, IT, and digital topics.',
],
],
],
[
'key' => 'news-finanzen',
'portal' => Portal::Both,
'translations' => [
'de' => [
'name' => 'Finanzen',
'slug' => 'finanzen',
'description' => 'Pressemitteilungen zu Banken, Boerse und Finanzthemen.',
],
'en' => [
'name' => 'Finance',
'slug' => 'finance',
'description' => 'Press releases about banks, stock markets, and finance topics.',
],
],
],
];
foreach ($categories as $categoryData) {
$deSlug = $categoryData['translations']['de']['slug'];
$category = Category::query()
->whereHas('translations', function ($query) use ($deSlug) {
$query->where('locale', 'de')->where('slug', $deSlug);
})
->first();
if (! $category) {
$category = Category::query()->create([
'portal' => $categoryData['portal']->value,
'is_active' => true,
]);
} else {
$category->update([
'portal' => $categoryData['portal']->value,
'is_active' => true,
]);
}
foreach ($categoryData['translations'] as $locale => $translation) {
$category->translations()->updateOrCreate(
['locale' => $locale],
[
'name' => $translation['name'],
'slug' => $translation['slug'],
'description' => $translation['description'],
]
);
}
}
}
}

View file

@ -2,22 +2,51 @@
namespace Database\Seeders;
use App\Enums\Portal;
use App\Enums\RegistrationType;
use App\Models\User;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use App\Services\Auth\UserRolePermissionSyncService;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
public function run(UserRolePermissionSyncService $rolePermissionSync): void
{
// User::factory(10)->create();
User::factory()->create([
'name' => 'Test User',
'email' => 'test@example.com',
$this->call([
RolesAndPermissionsSeeder::class,
AdminPresetSeeder::class,
PaymentOptionSeeder::class,
CategorySeeder::class,
]);
$adminUser = User::firstOrCreate([
'email' => 'admin@presseportale.test',
], [
'name' => 'Portal Admin',
'password' => Hash::make('password'),
'portal' => Portal::Both->value,
'registration_type' => RegistrationType::ExistingLegacy->value,
'language' => 'de',
'is_active' => true,
]);
$rolePermissionSync->assignRoleAndSyncPermissions($adminUser, 'admin');
$testUser = User::firstOrCreate([
'email' => 'test@example.com',
], [
'name' => 'Test User',
'password' => Hash::make('password'),
'portal' => Portal::Both->value,
'registration_type' => RegistrationType::ExistingLegacy->value,
'language' => 'de',
'is_active' => true,
]);
$rolePermissionSync->assignRoleAndSyncPermissions($testUser, 'customer');
}
}

View file

@ -0,0 +1,78 @@
<?php
namespace Database\Seeders;
use App\Enums\PaymentOptionType;
use App\Models\PaymentOption;
use Illuminate\Database\Seeder;
class PaymentOptionSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$options = [
[
'article_number' => 'PR-MONTHLY-001',
'type' => PaymentOptionType::Recurring->value,
'price_cents' => 4900,
'currency' => 'EUR',
'interval' => 'monthly',
'is_hidden' => false,
'stripe_product_id' => 'prod_placeholder_monthly',
'stripe_price_id' => 'price_placeholder_monthly',
'translations' => [
'de' => ['name' => 'Monatspaket', 'description' => 'Monatliche Veroeffentlichungen'],
'en' => ['name' => 'Monthly package', 'description' => 'Monthly publication package'],
],
],
[
'article_number' => 'PR-YEARLY-001',
'type' => PaymentOptionType::Recurring->value,
'price_cents' => 49900,
'currency' => 'EUR',
'interval' => 'yearly',
'is_hidden' => false,
'stripe_product_id' => 'prod_placeholder_yearly',
'stripe_price_id' => 'price_placeholder_yearly',
'translations' => [
'de' => ['name' => 'Jahrespaket', 'description' => 'Jaehrliche Veroeffentlichungen'],
'en' => ['name' => 'Yearly package', 'description' => 'Yearly publication package'],
],
],
[
'article_number' => 'PR-BOOST-ONCE-001',
'type' => PaymentOptionType::Onetime->value,
'price_cents' => 9900,
'currency' => 'EUR',
'interval' => 'once',
'is_hidden' => false,
'stripe_product_id' => 'prod_placeholder_onetime',
'stripe_price_id' => 'price_placeholder_onetime',
'translations' => [
'de' => ['name' => 'Reichweiten-Boost', 'description' => 'Einmaliger Promotion-Boost'],
'en' => ['name' => 'Reach boost', 'description' => 'One-time promotion boost'],
],
],
];
foreach ($options as $optionData) {
$translations = $optionData['translations'];
unset($optionData['translations']);
$option = PaymentOption::updateOrCreate(
['article_number' => $optionData['article_number']],
$optionData
);
foreach ($translations as $locale => $translation) {
$option->translations()->updateOrCreate(
['locale' => $locale],
$translation
);
}
}
}
}

View file

@ -2,11 +2,9 @@
namespace Database\Seeders;
use App\Models\User;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
class RolesAndPermissionsSeeder extends Seeder
{
@ -15,65 +13,54 @@ class RolesAndPermissionsSeeder extends Seeder
*/
public function run(): void
{
// Rollen
Role::create(['name' => 'superadmin']);
Role::create(['name' => 'admin']);
Role::create(['name' => 'trader']);
Role::create(['name' => 'customer']);
$roles = [
'admin',
'editor',
'customer',
'api-only',
];
// Beispiel-Permissions
//Trader
Permission::create(['name' => 'products_manage']);
foreach ($roles as $role) {
Role::firstOrCreate(['name' => $role]);
}
//Customer
Permission::create(['name' => 'orders_view']);
$permissions = [
'press-releases:read',
'press-releases:write',
'press-releases:publish',
'press-release-images:write',
'companies:read',
'newsletter:subscribe',
'users:manage',
'roles:manage',
];
foreach ($permissions as $permission) {
Permission::firstOrCreate(['name' => $permission]);
}
//Admin
//CMS
Permission::create(['name' => 'cms_manage']);
Permission::create(['name' => 'cms_view']);
Permission::create(['name' => 'cms_create']);
Permission::create(['name' => 'cms_delete']);
Permission::create(['name' => 'cms_list']);
//User
Permission::create(['name' => 'user_edit']);
Permission::create(['name' => 'user_view']);
Permission::create(['name' => 'user_create']);
Permission::create(['name' => 'user_delete']);
Permission::create(['name' => 'user_list']);
//Superadmin
//alles
/*Permission::create(['name' => 'products_manage']);
Permission::create(['name' => 'orders_view']);
Permission::create(['name' => 'user_settings']);
Permission::create(['name' => 'system_settings']);
Permission::create(['name' => 'user_manage']);
Permission::create(['name' => 'order_manage']);
Permission::create(['name' => 'product_manage']);
Permission::create(['name' => 'user_view']);
Permission::create(['name' => 'order_view']);
Permission::create(['name' => 'product_view']);
Permission::create(['name' => 'system_view']);
Permission::create(['name' => 'user_create']);
Permission::create(['name' => 'order_create']);
Permission::create(['name' => 'product_create']);
Permission::create(['name' => 'system_create']);
Permission::create(['name' => 'order_edit']);
Permission::create(['name' => 'product_edit']);
Permission::create(['name' => 'system_edit']);
Permission::create(['name' => 'user_delete']);
Permission::create(['name' => 'order_delete']);
Permission::create(['name' => 'product_delete']);
Permission::create(['name' => 'system_delete']);
Permission::create(['name' => 'user_list']);
Permission::create(['name' => 'order_list']);
Permission::create(['name' => 'product_list']);
Permission::create(['name' => 'system_list']);*/
Role::findByName('admin')->syncPermissions($permissions);
Role::findByName('editor')->syncPermissions([
'press-releases:read',
'press-releases:write',
'press-releases:publish',
'press-release-images:write',
'companies:read',
'newsletter:subscribe',
]);
Role::findByName('customer')->syncPermissions([
'press-releases:read',
'press-releases:write',
'press-release-images:write',
'companies:read',
'newsletter:subscribe',
]);
Role::findByName('api-only')->syncPermissions([
'press-releases:read',
'press-releases:write',
'press-release-images:write',
'companies:read',
'newsletter:subscribe',
]);
}
}