first commit

This commit is contained in:
2026-01-23 17:28:21 +07:00
commit 29ff8992b9
331 changed files with 30545 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class AdminUserSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$user = \App\Models\User::firstOrCreate(
['email' => 'admin@nihonbuzz.academy'],
[
'name' => 'Super Admin',
'password' => bcrypt('password'),
'email_verified_at' => now(),
]
);
$user->assignRole('super_admin');
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace Database\Seeders;
use App\Models\User;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
$this->call([
RoleSeeder::class,
PermissionSeeder::class,
LevelSeeder::class,
AdminUserSeeder::class,
VocabularySeeder::class,
TestDataSeeder::class,
]);
// User::factory(10)->create();
// User::factory()->create([
// 'name' => 'Test User',
// 'email' => 'test@example.com',
// ]);
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class EnrollmentSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
//
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class LevelSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$levels = [
['code' => 'BASIC', 'name' => 'Bahasa Jepang Dasar', 'order_index' => 0, 'description' => 'Level pengenalan hiragana, katakana, dan ungkapan dasar.'],
['code' => 'N5', 'name' => 'Beginner', 'order_index' => 1, 'description' => 'The ability to understand some basic Japanese.'],
['code' => 'N4', 'name' => 'Elementary', 'order_index' => 2, 'description' => 'The ability to understand basic Japanese.'],
['code' => 'N3', 'name' => 'Intermediate', 'order_index' => 3, 'description' => 'The ability to understand Japanese used in everyday situations to a certain degree.'],
['code' => 'N2', 'name' => 'Pre-Advanced', 'order_index' => 4, 'description' => 'The ability to understand Japanese used in everyday situations, and in a variety of circumstances to a certain degree.'],
['code' => 'N1', 'name' => 'Advanced', 'order_index' => 5, 'description' => 'The ability to understand Japanese used in a variety of circumstances.'],
];
foreach ($levels as $level) {
\App\Models\Level::firstOrCreate(['code' => $level['code']], $level);
}
}
}

View File

@@ -0,0 +1,66 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class PermissionSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
// Reset cached roles and permissions
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
// Define Permissions
$permissions = [
'manage courses',
'manage modules',
'manage lessons',
'manage vocabularies',
'manage students',
'view dashboard',
'practice srs',
];
foreach ($permissions as $permissionName) {
$permission = \App\Models\Permission::where('name', $permissionName)->where('guard_name', 'web')->first();
if (!$permission) {
\App\Models\Permission::create([
'name' => $permissionName,
'guard_name' => 'web',
]);
}
}
$assign = function($roleName, $perms) {
$role = \App\Models\Role::where('name', $roleName)->where('guard_name', 'web')->first();
if ($role) {
$role->syncPermissions($perms);
}
};
$assign('super_admin', \App\Models\Permission::all());
$assign('admin', [
'manage courses',
'manage modules',
'manage lessons',
'manage vocabularies',
'manage students',
'view dashboard',
]);
$assign('teacher', [
'manage courses',
'manage modules',
'manage lessons',
'view dashboard',
]);
$assign('student', [
'view dashboard',
'practice srs',
]);
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Role;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Carbon\Carbon;
class RoleSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
// Reset cached roles and permissions
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
$roles = [
'super_admin',
'admin',
'editor',
'treasurer',
'teacher',
'student',
'class_leader',
'alumni',
];
$now = Carbon::now();
foreach ($roles as $roleName) {
$role = Role::where('name', $roleName)->where('guard_name', 'web')->first();
if (!$role) {
Role::create([
'name' => $roleName,
'guard_name' => 'web',
]);
}
}
}
}

View File

@@ -0,0 +1,113 @@
<?php
namespace Database\Seeders;
use App\Models\Course;
use App\Models\Enrollment;
use App\Models\Level;
use App\Models\Lesson;
use App\Models\Module;
use App\Models\User;
use App\Models\UserProgress;
use Illuminate\Database\Seeder;
use Illuminate\Support\Str;
class TestDataSeeder extends Seeder
{
public function run(): void
{
$admin = User::where('email', 'admin@nihonbuzz.academy')->first();
if (!$admin) return;
$n5 = Level::where('code', 'N5')->first();
$basic = Level::where('code', 'BASIC')->first();
$n4 = Level::where('code', 'N4')->first();
// 1. Course: Mastering JLPT N5
$course1 = Course::updateOrCreate(
['slug' => 'mastering-jlpt-n5'],
[
'title' => 'Mastering JLPT N5: Dasar Bahasa Jepang',
'description' => 'Kursus lengkap untuk persiapan JLPT N5 dari nol.',
'level_id' => $n5->id,
'teacher_id' => $admin->id,
'is_published' => true,
'price' => 0,
]
);
$module1 = Module::updateOrCreate(
['course_id' => $course1->id, 'title' => 'Introduction to N5'],
['order_index' => 1]
);
$lessons1 = [
['title' => 'Selamat Datang di N5', 'slug' => 'welcome-n5', 'type' => 'video'],
['title' => 'Struktur Menulis Jepang', 'slug' => 'writing-structure', 'type' => 'text'],
['title' => 'Kata Ganti Orang', 'slug' => 'pronouns', 'type' => 'video'],
];
foreach ($lessons1 as $index => $lessonData) {
Lesson::updateOrCreate(
['module_id' => $module1->id, 'slug' => $lessonData['slug']],
['title' => $lessonData['title'], 'type' => $lessonData['type'], 'order_index' => $index + 1]
);
}
// 2. Course: Hiragana & Katakana
$course2 = Course::updateOrCreate(
['slug' => 'kana-mastery'],
[
'title' => 'Katakana & Hiragana Mastery',
'description' => 'Kuasai cara baca dan tulis Hiragana & Katakana dalam 2 minggu.',
'level_id' => $basic->id,
'teacher_id' => $admin->id,
'is_published' => true,
'price' => 0,
]
);
$module2 = Module::updateOrCreate(
['course_id' => $course2->id, 'title' => 'Hiragana Basics'],
['order_index' => 1]
);
$lessons2 = [
['title' => 'Baris A-I-U-E-O', 'slug' => 'vowels-kana', 'type' => 'video'],
['title' => 'Baris KA-KI-KU-KE-KO', 'slug' => 'ka-line', 'type' => 'video'],
];
foreach ($lessons2 as $index => $lessonData) {
Lesson::updateOrCreate(
['module_id' => $module2->id, 'slug' => $lessonData['slug']],
['title' => $lessonData['title'], 'type' => $lessonData['type'], 'order_index' => $index + 1]
);
}
// 3. Enroll Student
Enrollment::updateOrCreate(
['user_id' => $admin->id, 'course_id' => $course1->id],
['enrolled_at' => now(), 'status' => 'active']
);
Enrollment::updateOrCreate(
['user_id' => $admin->id, 'course_id' => $course2->id],
['enrolled_at' => now(), 'status' => 'active']
);
// 4. Progress
$lessonToComplete = Lesson::where('slug', 'welcome-n5')->first();
if ($lessonToComplete) {
UserProgress::updateOrCreate(
['user_id' => $admin->id, 'lesson_id' => $lessonToComplete->id],
['completed_at' => now()]
);
}
// 5. Update User Stats
$admin->update([
'xp_points' => 1250,
'current_streak' => 5,
]);
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class UserProgressSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
//
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class VocabularySeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$n5 = \App\Models\Level::where('code', 'N5')->first();
$vocabularies = [
[
'word' => '私',
'reading' => 'わたし',
'meaning_en' => 'I, me',
'level_id' => $n5?->id,
],
[
'word' => '家',
'reading' => 'いえ',
'meaning_en' => 'House, home',
'level_id' => $n5?->id,
],
[
'word' => '食べる',
'reading' => 'たべる',
'meaning_en' => 'To eat',
'level_id' => $n5?->id,
],
[
'word' => '日本語',
'reading' => 'にほんご',
'meaning_en' => 'Japanese language',
'level_id' => $n5?->id,
],
[
'word' => '勉強',
'reading' => 'べんきょう',
'meaning_en' => 'Study',
'level_id' => $n5?->id,
],
];
foreach ($vocabularies as $vocab) {
\App\Models\Vocabulary::create($vocab);
}
}
}