1+ <?php
2+
3+ namespace App \Database ;
4+
5+ use App \Core \Database ;
6+
7+ class Migrator
8+ {
9+ private $ db ;
10+ private $ migrationsPath ;
11+ private $ seedersPath ;
12+
13+ public function __construct ()
14+ {
15+ $ this ->db = Database::getInstance ();
16+ $ this ->migrationsPath = __DIR__ . '/migrations ' ;
17+ $ this ->seedersPath = __DIR__ . '/seeders ' ;
18+ }
19+
20+ public function migrate ()
21+ {
22+ $ migrations = glob ($ this ->migrationsPath . '/*.php ' );
23+ sort ($ migrations );
24+
25+ foreach ($ migrations as $ migration ) {
26+ $ baseName = basename ($ migration , '.php ' );
27+ $ className = 'App \\Database \\Migrations \\' . substr ($ baseName , 4 ); // Remove number prefix
28+ if (strpos ($ baseName , '001_ ' ) === 0 ) $ className .= '001 ' ;
29+ elseif (strpos ($ baseName , '002_ ' ) === 0 ) $ className = 'App \\Database \\Migrations \\CreateDepartmentsTable002 ' ;
30+ elseif (strpos ($ baseName , '003_ ' ) === 0 ) $ className = 'App \\Database \\Migrations \\CreateEmployeeProfilesTable003 ' ;
31+ elseif (strpos ($ baseName , '004_ ' ) === 0 ) $ className = 'App \\Database \\Migrations \\CreateAttendanceTable004 ' ;
32+ elseif (strpos ($ baseName , '005_ ' ) === 0 ) $ className = 'App \\Database \\Migrations \\CreateLeaveTypesTable005 ' ;
33+ elseif (strpos ($ baseName , '006_ ' ) === 0 ) $ className = 'App \\Database \\Migrations \\CreateLeaveRequestsTable006 ' ;
34+ elseif (strpos ($ baseName , '007_ ' ) === 0 ) $ className = 'App \\Database \\Migrations \\CreatePayrollTable007 ' ;
35+ elseif (strpos ($ baseName , '008_ ' ) === 0 ) $ className = 'App \\Database \\Migrations \\CreatePerformanceReviewsTable008 ' ;
36+ elseif (strpos ($ baseName , '009_ ' ) === 0 ) $ className = 'App \\Database \\Migrations \\CreateTokensTable009 ' ;
37+
38+ require_once $ migration ;
39+ $ sql = $ className ::up ();
40+ $ this ->db ->exec ($ sql );
41+ echo "Migrated: " . basename ($ migration ) . "\n" ;
42+ }
43+ }
44+
45+ public function seed ()
46+ {
47+ $ seeders = glob ($ this ->seedersPath . '/*.php ' );
48+ sort ($ seeders );
49+
50+ foreach ($ seeders as $ seeder ) {
51+ $ className = 'App \\Database \\Seeders \\' . basename ($ seeder , '.php ' );
52+ require_once $ seeder ;
53+
54+ try {
55+ $ sql = $ className ::run ();
56+ $ this ->db ->exec ($ sql );
57+ echo "Seeded: " . basename ($ seeder ) . "\n" ;
58+ } catch (\PDOException $ e ) {
59+ if (strpos ($ e ->getMessage (), 'Duplicate entry ' ) !== false ) {
60+ echo "Skipped (already exists): " . basename ($ seeder ) . "\n" ;
61+ } else {
62+ throw $ e ;
63+ }
64+ }
65+ }
66+ }
67+
68+ public function rollback ()
69+ {
70+ $ migrations = glob ($ this ->migrationsPath . '/*.php ' );
71+ rsort ($ migrations );
72+
73+ foreach ($ migrations as $ migration ) {
74+ $ className = 'App \\Database \\Migrations \\' . basename ($ migration , '.php ' );
75+ require_once $ migration ;
76+
77+ $ sql = $ className ::down ();
78+ $ this ->db ->exec ($ sql );
79+ echo "Rolled back: " . basename ($ migration ) . "\n" ;
80+ }
81+ }
82+ }
0 commit comments