Muhammad Ainurrofiq Anwar Buhang hace 5 meses
padre
commit
2163e74fb4
Se han modificado 100 ficheros con 15127 adiciones y 0 borrados
  1. 18
    0
      .editorconfig
  2. 11
    0
      .gitattributes
  3. 21
    0
      .gitignore
  4. 1
    0
      .vercelignore
  5. 3
    0
      .vite/deps_temp_90aa3e9d/package.json
  6. 3
    0
      api/index.php
  7. 27
    0
      app/Console/Kernel.php
  8. 30
    0
      app/Exceptions/Handler.php
  9. 51
    0
      app/Http/Controllers/AdminController.php
  10. 60
    0
      app/Http/Controllers/Api/APIController.php
  11. 168
    0
      app/Http/Controllers/ApresiasiController.php
  12. 48
    0
      app/Http/Controllers/Auth/AuthenticatedSessionController.php
  13. 41
    0
      app/Http/Controllers/Auth/ConfirmablePasswordController.php
  14. 25
    0
      app/Http/Controllers/Auth/EmailVerificationNotificationController.php
  15. 22
    0
      app/Http/Controllers/Auth/EmailVerificationPromptController.php
  16. 61
    0
      app/Http/Controllers/Auth/NewPasswordController.php
  17. 29
    0
      app/Http/Controllers/Auth/PasswordController.php
  18. 44
    0
      app/Http/Controllers/Auth/PasswordResetLinkController.php
  19. 51
    0
      app/Http/Controllers/Auth/RegisteredUserController.php
  20. 28
    0
      app/Http/Controllers/Auth/VerifyEmailController.php
  21. 12
    0
      app/Http/Controllers/Controller.php
  22. 45
    0
      app/Http/Controllers/DashboardController.php
  23. 166
    0
      app/Http/Controllers/InformasiController.php
  24. 24
    0
      app/Http/Controllers/PanduanController.php
  25. 130
    0
      app/Http/Controllers/PelaporanController.php
  26. 46
    0
      app/Http/Controllers/ProfileController.php
  27. 73
    0
      app/Http/Controllers/RiwayatLaporanController.php
  28. 260
    0
      app/Http/Controllers/SessionController.php
  29. 79
    0
      app/Http/Controllers/TindakanController.php
  30. 131
    0
      app/Http/Controllers/UsersController.php
  31. 71
    0
      app/Http/Kernel.php
  32. 17
    0
      app/Http/Middleware/Authenticate.php
  33. 33
    0
      app/Http/Middleware/CheckRole.php
  34. 17
    0
      app/Http/Middleware/EncryptCookies.php
  35. 17
    0
      app/Http/Middleware/PreventRequestsDuringMaintenance.php
  36. 30
    0
      app/Http/Middleware/RedirectIfAuthenticated.php
  37. 19
    0
      app/Http/Middleware/TrimStrings.php
  38. 20
    0
      app/Http/Middleware/TrustHosts.php
  39. 28
    0
      app/Http/Middleware/TrustProxies.php
  40. 22
    0
      app/Http/Middleware/ValidateSignature.php
  41. 17
    0
      app/Http/Middleware/VerifyCsrfToken.php
  42. 85
    0
      app/Http/Requests/Auth/LoginRequest.php
  43. 23
    0
      app/Http/Requests/ProfileUpdateRequest.php
  44. 58
    0
      app/Mail/ResetPasswordMail.php
  45. 23
    0
      app/Models/Apresiasi.php
  46. 16
    0
      app/Models/Informasi.php
  47. 17
    0
      app/Models/PasswordReset.php
  48. 33
    0
      app/Models/Pelaporan.php
  49. 15
    0
      app/Models/RiwayatLaporan.php
  50. 11
    0
      app/Models/Session.php
  51. 18
    0
      app/Models/Tindakan.php
  52. 61
    0
      app/Models/User.php
  53. 24
    0
      app/Providers/AppServiceProvider.php
  54. 26
    0
      app/Providers/AuthServiceProvider.php
  55. 19
    0
      app/Providers/BroadcastServiceProvider.php
  56. 38
    0
      app/Providers/EventServiceProvider.php
  57. 40
    0
      app/Providers/RouteServiceProvider.php
  58. 17
    0
      app/View/Components/AppLayout.php
  59. 17
    0
      app/View/Components/GuestLayout.php
  60. 53
    0
      artisan
  61. 56
    0
      bootstrap/app.php
  62. 2
    0
      bootstrap/cache/.gitignore
  63. 68
    0
      composer.json
  64. 8587
    0
      composer.lock
  65. 193
    0
      config/app.php
  66. 115
    0
      config/auth.php
  67. 71
    0
      config/broadcasting.php
  68. 111
    0
      config/cache.php
  69. 34
    0
      config/cors.php
  70. 151
    0
      config/database.php
  71. 76
    0
      config/filesystems.php
  72. 54
    0
      config/hashing.php
  73. 131
    0
      config/logging.php
  74. 134
    0
      config/mail.php
  75. 109
    0
      config/queue.php
  76. 83
    0
      config/sanctum.php
  77. 34
    0
      config/services.php
  78. 214
    0
      config/session.php
  79. 269
    0
      config/sweetalert.php
  80. 36
    0
      config/view.php
  81. 1
    0
      database/.gitignore
  82. 44
    0
      database/factories/UserFactory.php
  83. 34
    0
      database/migrations/2014_10_12_000000_create_users_table.php
  84. 28
    0
      database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php
  85. 32
    0
      database/migrations/2014_10_12_100000_create_password_resets_table.php
  86. 32
    0
      database/migrations/2019_08_19_000000_create_failed_jobs_table.php
  87. 33
    0
      database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php
  88. 35
    0
      database/migrations/2023_03_25_111825_create_tindakans_table.php
  89. 27
    0
      database/migrations/2024_03_20_022810_create_sessions_table.php
  90. 48
    0
      database/migrations/2024_03_24_124009_create_pelaporans_table.php
  91. 27
    0
      database/migrations/2024_03_25_065447_create_riwayat_laporans_table.php
  92. 30
    0
      database/migrations/2024_04_26_072052_create_informasis_table.php
  93. 35
    0
      database/migrations/2024_05_17_010509_create_apresiasis_table.php
  94. 34
    0
      database/seeders/DatabaseSeeder.php
  95. 28
    0
      database/seeders/StatusSeeder.php
  96. 36
    0
      database/seeders/UserDummySeeder.php
  97. 1454
    0
      package-lock.json
  98. 16
    0
      package.json
  99. 32
    0
      phpunit.xml
  100. 0
    0
      public/.htaccess

+ 18
- 0
.editorconfig Ver fichero

@@ -0,0 +1,18 @@
1
+root = true
2
+
3
+[*]
4
+charset = utf-8
5
+end_of_line = lf
6
+indent_size = 4
7
+indent_style = space
8
+insert_final_newline = true
9
+trim_trailing_whitespace = true
10
+
11
+[*.md]
12
+trim_trailing_whitespace = false
13
+
14
+[*.{yml,yaml}]
15
+indent_size = 2
16
+
17
+[docker-compose.yml]
18
+indent_size = 4

+ 11
- 0
.gitattributes Ver fichero

@@ -0,0 +1,11 @@
1
+* text=auto eol=lf
2
+
3
+*.blade.php diff=html
4
+*.css diff=css
5
+*.html diff=html
6
+*.md diff=markdown
7
+*.php diff=php
8
+
9
+/.github export-ignore
10
+CHANGELOG.md export-ignore
11
+.styleci.yml export-ignore

+ 21
- 0
.gitignore Ver fichero

@@ -0,0 +1,21 @@
1
+/.phpunit.cache
2
+/node_modules
3
+/public/build
4
+/public/hot
5
+/public/storage
6
+/storage/*.key
7
+/vendor
8
+.env
9
+.env.backup
10
+.env.production
11
+.phpunit.result.cache
12
+Homestead.json
13
+Homestead.yaml
14
+auth.json
15
+npm-debug.log
16
+yarn-error.log
17
+/.fleet
18
+/.idea
19
+/.vscode
20
+
21
+.vercel

+ 1
- 0
.vercelignore Ver fichero

@@ -0,0 +1 @@
1
+/vendor

+ 3
- 0
.vite/deps_temp_90aa3e9d/package.json Ver fichero

@@ -0,0 +1,3 @@
1
+{
2
+  "type": "module"
3
+}

+ 3
- 0
api/index.php Ver fichero

@@ -0,0 +1,3 @@
1
+<?php
2
+require __DIR__ ."/../public/index.php";
3
+

+ 27
- 0
app/Console/Kernel.php Ver fichero

@@ -0,0 +1,27 @@
1
+<?php
2
+
3
+namespace App\Console;
4
+
5
+use Illuminate\Console\Scheduling\Schedule;
6
+use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
7
+
8
+class Kernel extends ConsoleKernel
9
+{
10
+    /**
11
+     * Define the application's command schedule.
12
+     */
13
+    protected function schedule(Schedule $schedule): void
14
+    {
15
+        // $schedule->command('inspire')->hourly();
16
+    }
17
+
18
+    /**
19
+     * Register the commands for the application.
20
+     */
21
+    protected function commands(): void
22
+    {
23
+        $this->load(__DIR__.'/Commands');
24
+
25
+        require base_path('routes/console.php');
26
+    }
27
+}

+ 30
- 0
app/Exceptions/Handler.php Ver fichero

@@ -0,0 +1,30 @@
1
+<?php
2
+
3
+namespace App\Exceptions;
4
+
5
+use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
6
+use Throwable;
7
+
8
+class Handler extends ExceptionHandler
9
+{
10
+    /**
11
+     * The list of the inputs that are never flashed to the session on validation exceptions.
12
+     *
13
+     * @var array<int, string>
14
+     */
15
+    protected $dontFlash = [
16
+        'current_password',
17
+        'password',
18
+        'password_confirmation',
19
+    ];
20
+
21
+    /**
22
+     * Register the exception handling callbacks for the application.
23
+     */
24
+    public function register(): void
25
+    {
26
+        $this->reportable(function (Throwable $e) {
27
+            //
28
+        });
29
+    }
30
+}

+ 51
- 0
app/Http/Controllers/AdminController.php Ver fichero

@@ -0,0 +1,51 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Models\Apresiasi;
6
+use App\Models\Pelaporan;
7
+use Illuminate\Http\Request;
8
+use Illuminate\Support\Facades\DB;
9
+use Carbon\Carbon;
10
+
11
+
12
+class AdminController extends Controller
13
+{
14
+
15
+
16
+    public function index(Request $request){
17
+
18
+        $today = Carbon::now();
19
+        $startOfWeek = $today->startOfWeek()->toDateString();
20
+        $endOfWeek = $today->endOfWeek()->toDateString();
21
+        $user = $request->user();
22
+        if ($user->role == 'admin') {
23
+            $laporan = Pelaporan::with('tindakan','user')->get();
24
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
25
+            $laporan = Pelaporan::with('tindakan','user')->get();
26
+            $total = Pelaporan::where('tindakan_id', 1)->count();
27
+            $tot = Pelaporan::where('tindakan_id', 2)->count();
28
+            $tots = Pelaporan::where('tindakan_id', 3)->count();
29
+            $totals = Pelaporan::where('tindakan_id', 4)->count();
30
+
31
+        } elseif ($user->role == 'user') {
32
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
33
+            $laporan = Pelaporan::where('user_id', $user->id)->get();
34
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
35
+            $count = $laporan->count();
36
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
37
+            $total = $laporan->where('tindakan_id', 1)->count();
38
+            // Menghitung total berdasarkan tindakan_id dari riwayat pelaporan pengguna
39
+            $tot = $laporan->where('tindakan_id', 2)->count();
40
+            $tots = $laporan->where('tindakan_id', 3)->count();
41
+            $totals = $laporan->where('tindakan_id', 4)->count();
42
+        }
43
+        $pelaporans = Pelaporan::all();
44
+        $apresiasi = Apresiasi::all();
45
+
46
+        return view('admin.dashboards', compact('laporan','apresiasi','pelaporans','total', 'tot', 'tots', 'totals'));
47
+    }
48
+
49
+
50
+
51
+}

+ 60
- 0
app/Http/Controllers/Api/APIController.php Ver fichero

@@ -0,0 +1,60 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Api;
4
+
5
+use App\Http\Controllers\Controller;
6
+use App\Models\User;
7
+use GuzzleHttp\Psr7\Response;
8
+use Illuminate\Http\Request;
9
+
10
+class APIController extends Controller
11
+{
12
+    /**
13
+     * Display a listing of the resource.
14
+     */
15
+    public function index()
16
+    {
17
+        try {
18
+            $users = User::all();
19
+            return response()->json($users, 200); // Menggunakan kode status 200 langsung
20
+        } catch (\Exception $e) {
21
+            $error = [
22
+                'error' => $e->getMessage()
23
+            ];
24
+            return response()->json($error, 500); // Menggunakan kode status 500 untuk kesalahan server
25
+        }
26
+    }
27
+
28
+
29
+    /**
30
+     * Store a newly created resource in storage.
31
+     */
32
+    public function store(Request $request)
33
+    {
34
+        //
35
+    }
36
+
37
+    /**
38
+     * Display the specified resource.
39
+     */
40
+    public function show(string $id)
41
+    {
42
+        //
43
+    }
44
+
45
+    /**
46
+     * Update the specified resource in storage.
47
+     */
48
+    public function update(Request $request, string $id)
49
+    {
50
+        //
51
+    }
52
+
53
+    /**
54
+     * Remove the specified resource from storage.
55
+     */
56
+    public function destroy(string $id)
57
+    {
58
+        //
59
+    }
60
+}

+ 168
- 0
app/Http/Controllers/ApresiasiController.php Ver fichero

@@ -0,0 +1,168 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Models\Apresiasi;
6
+use App\Models\Pelaporan;
7
+use Illuminate\Http\Request;
8
+use Illuminate\Support\Facades\Auth;
9
+
10
+class ApresiasiController extends Controller
11
+{
12
+    public function userIndex(Request $request){
13
+        $user = $request->user();
14
+        if ($user->role == 'admin') {
15
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
16
+            $laporan = Pelaporan::with('tindakan','user')->get();
17
+
18
+        } elseif ($user->role == 'user') {
19
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
20
+            $laporan = Pelaporan::where('user_id', $user->id)->get();
21
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
22
+            $count = $laporan->count();
23
+        }
24
+
25
+        $apresiasi = Apresiasi::query();
26
+
27
+        if ($request->has('search')) {
28
+            $apresiasi->where('judul', 'LIKE', '%' . $request->search . '%');
29
+        }
30
+
31
+        $apresiasi = $apresiasi->get();
32
+        return view('users.apresiasi.index', compact('laporan', 'apresiasi'));
33
+    }
34
+
35
+    public function userCreate()
36
+    {
37
+        $laporan = Pelaporan::with('tindakan','user')->get();
38
+
39
+        return view('users.apresiasi.create',compact('laporan'));
40
+    }
41
+    public function userStore(Request $request)
42
+    {
43
+        $request->validate([
44
+            'judul' => 'required',
45
+            'deskripsi' => 'required',
46
+            'lokasi' => 'required',
47
+            'tanggal' => 'required',
48
+            'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif,pdf',
49
+        ],[
50
+            'judul.required' => 'Judul Wajib Diisi',
51
+            'deskripsi.required' => 'Deskripsi Wajib Diisi',
52
+            'lokasi.required' => 'Lokasi Wajib Diisi',
53
+            'tanggal.required' => 'Tanggal Wajib Diisi',
54
+            'foto.nullable' => 'Foto Tidak Boleh Kosong',
55
+            'foto.image' => 'Foto Harus Berupa Image ',
56
+            'foto.mimes' => 'Foto Harus JPEG, PNG, JPG, GIF, PDF',
57
+        ]);
58
+
59
+        $apresiasi = new Apresiasi();
60
+        $apresiasi->judul = $request->input('judul');
61
+        $apresiasi->deskripsi = $request->input('deskripsi');
62
+        $apresiasi->tanggal = $request->input('tanggal');
63
+        $apresiasi->lokasi = $request->input('lokasi');
64
+        $apresiasi->user_id = Auth::id(); // Set the authenticated user's ID
65
+
66
+        if ($request->hasFile('foto')) {
67
+            $fotos = time() . '.' . $request->foto->extension();
68
+            $request->foto->move(public_path('foto'), $fotos);
69
+            $apresiasi->foto = $fotos;
70
+        }
71
+
72
+        $apresiasi->save();
73
+
74
+        return redirect()->route('apresiasi.userIndex')->with('success', 'Pelaporan Apresiasi berhasil disimpan.');
75
+    }
76
+
77
+    public function userEdit($id)
78
+    {
79
+        $laporan = Pelaporan::with('tindakan','user')->get();
80
+        $apresiasi = Apresiasi::find($id);
81
+        return view('users.apresiasi.update', compact('apresiasi', 'laporan'));
82
+    }
83
+
84
+    public function userUpdate(Request $request, $id)
85
+    {
86
+        $request->validate([
87
+            'judul' => 'required',
88
+            'deskripsi' => 'required',
89
+            'lokasi' => 'required',
90
+            'tanggal' => 'required',
91
+            'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif,pdf',
92
+        ],[
93
+            'judul.required' => 'Judul Wajib Diisi',
94
+            'deskripsi.required' => 'Deskripsi Wajib Diisi',
95
+            'lokasi.required' => 'Lokasi Wajib Diisi',
96
+            'tanggal.required' => 'Tanggal Wajib Diisi',
97
+            'foto.nullable' => 'Foto Tidak Boleh Kosong',
98
+            'foto.image' => 'Foto Harus Berupa Image ',
99
+            'foto.mimes' => 'Foto Harus JPEG, PNG, JPG, GIF, PDF',
100
+        ]);
101
+
102
+        $apresiasi = Apresiasi::find($id);
103
+        $apresiasi->update($request->all());
104
+
105
+        if ($request->hasFile('foto')) {
106
+            $fotoPath = $request->file('foto')->store('uploads');
107
+            $apresiasi->foto = $fotoPath;
108
+            $apresiasi->save();
109
+        }
110
+
111
+        return redirect()->route('apresiasi.userIndex')->with('success', 'Pelaporan Apresiasi berhasil diperbarui.');
112
+    }
113
+
114
+    public function userDestroy($id)
115
+    {
116
+        $apresiasi = Apresiasi::find($id);
117
+        $apresiasi->delete();
118
+
119
+        return redirect()->route('apresiasi.userIndex')->with('success', 'Pelaporan Apresiasi berhasil dihapus.');
120
+    }
121
+
122
+    public function userShow(Request $request, $id){
123
+        $laporan = Pelaporan::with('tindakan','user')->get();
124
+        $apresiasi = Apresiasi::find($id);
125
+        return view('users.apresiasi.show', compact( 'apresiasi','laporan'));
126
+    }
127
+
128
+    public function adminIndex(Request $request)
129
+    {
130
+        $user = $request->user();
131
+        if ($user->role == 'admin') {
132
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
133
+            $laporan = Pelaporan::with('tindakan','user')->get();
134
+
135
+        } elseif ($user->role == 'user') {
136
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
137
+            $laporan = Pelaporan::where('user_id', $user->id)->get();
138
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
139
+            $count = $laporan->count();
140
+        }
141
+
142
+        $apresiasi = Apresiasi::query();
143
+
144
+        if ($request->has('search')) {
145
+            $apresiasi->where('judul', 'LIKE', '%' . $request->search . '%');
146
+        }
147
+
148
+        $apresiasi = $apresiasi->get();
149
+        return view('admin.apresiasi.index', compact('laporan', 'apresiasi'));
150
+    }
151
+
152
+    public function adminShow(Request $request, $id){
153
+        $laporan = Pelaporan::with('tindakan','user')->get();
154
+        $apresiasi = Apresiasi::find($id);
155
+        return view('admin.apresiasi.show', compact( 'apresiasi','laporan'));
156
+    }
157
+
158
+    public function adminDestroy($id)
159
+    {
160
+        $apresiasi = Apresiasi::find($id);
161
+        $apresiasi->delete();
162
+
163
+        return redirect()->route('apresiasi.adminIndex')->with('success', 'Pelaporan Apresiasi berhasil dihapus.');
164
+    }
165
+
166
+
167
+
168
+}

+ 48
- 0
app/Http/Controllers/Auth/AuthenticatedSessionController.php Ver fichero

@@ -0,0 +1,48 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Auth;
4
+
5
+use App\Http\Controllers\Controller;
6
+use App\Http\Requests\Auth\LoginRequest;
7
+use App\Providers\RouteServiceProvider;
8
+use Illuminate\Http\RedirectResponse;
9
+use Illuminate\Http\Request;
10
+use Illuminate\Support\Facades\Auth;
11
+use Illuminate\View\View;
12
+
13
+class AuthenticatedSessionController extends Controller
14
+{
15
+    /**
16
+     * Display the login view.
17
+     */
18
+    public function create(): View
19
+    {
20
+        return view('auth.login');
21
+    }
22
+
23
+    /**
24
+     * Handle an incoming authentication request.
25
+     */
26
+    public function store(LoginRequest $request): RedirectResponse
27
+    {
28
+        $request->authenticate();
29
+
30
+        $request->session()->regenerate();
31
+
32
+        return redirect()->intended(RouteServiceProvider::HOME);
33
+    }
34
+
35
+    /**
36
+     * Destroy an authenticated session.
37
+     */
38
+    public function destroy(Request $request): RedirectResponse
39
+    {
40
+        Auth::guard('web')->logout();
41
+
42
+        $request->session()->invalidate();
43
+
44
+        $request->session()->regenerateToken();
45
+
46
+        return redirect('/');
47
+    }
48
+}

+ 41
- 0
app/Http/Controllers/Auth/ConfirmablePasswordController.php Ver fichero

@@ -0,0 +1,41 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Auth;
4
+
5
+use App\Http\Controllers\Controller;
6
+use App\Providers\RouteServiceProvider;
7
+use Illuminate\Http\RedirectResponse;
8
+use Illuminate\Http\Request;
9
+use Illuminate\Support\Facades\Auth;
10
+use Illuminate\Validation\ValidationException;
11
+use Illuminate\View\View;
12
+
13
+class ConfirmablePasswordController extends Controller
14
+{
15
+    /**
16
+     * Show the confirm password view.
17
+     */
18
+    public function show(): View
19
+    {
20
+        return view('auth.confirm-password');
21
+    }
22
+
23
+    /**
24
+     * Confirm the user's password.
25
+     */
26
+    public function store(Request $request): RedirectResponse
27
+    {
28
+        if (! Auth::guard('web')->validate([
29
+            'email' => $request->user()->email,
30
+            'password' => $request->password,
31
+        ])) {
32
+            throw ValidationException::withMessages([
33
+                'password' => __('auth.password'),
34
+            ]);
35
+        }
36
+
37
+        $request->session()->put('auth.password_confirmed_at', time());
38
+
39
+        return redirect()->intended(RouteServiceProvider::HOME);
40
+    }
41
+}

+ 25
- 0
app/Http/Controllers/Auth/EmailVerificationNotificationController.php Ver fichero

@@ -0,0 +1,25 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Auth;
4
+
5
+use App\Http\Controllers\Controller;
6
+use App\Providers\RouteServiceProvider;
7
+use Illuminate\Http\RedirectResponse;
8
+use Illuminate\Http\Request;
9
+
10
+class EmailVerificationNotificationController extends Controller
11
+{
12
+    /**
13
+     * Send a new email verification notification.
14
+     */
15
+    public function store(Request $request): RedirectResponse
16
+    {
17
+        if ($request->user()->hasVerifiedEmail()) {
18
+            return redirect()->intended(RouteServiceProvider::HOME);
19
+        }
20
+
21
+        $request->user()->sendEmailVerificationNotification();
22
+
23
+        return back()->with('status', 'verification-link-sent');
24
+    }
25
+}

+ 22
- 0
app/Http/Controllers/Auth/EmailVerificationPromptController.php Ver fichero

@@ -0,0 +1,22 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Auth;
4
+
5
+use App\Http\Controllers\Controller;
6
+use App\Providers\RouteServiceProvider;
7
+use Illuminate\Http\RedirectResponse;
8
+use Illuminate\Http\Request;
9
+use Illuminate\View\View;
10
+
11
+class EmailVerificationPromptController extends Controller
12
+{
13
+    /**
14
+     * Display the email verification prompt.
15
+     */
16
+    public function __invoke(Request $request): RedirectResponse|View
17
+    {
18
+        return $request->user()->hasVerifiedEmail()
19
+                    ? redirect()->intended(RouteServiceProvider::HOME)
20
+                    : view('auth.verify-email');
21
+    }
22
+}

+ 61
- 0
app/Http/Controllers/Auth/NewPasswordController.php Ver fichero

@@ -0,0 +1,61 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Auth;
4
+
5
+use App\Http\Controllers\Controller;
6
+use Illuminate\Auth\Events\PasswordReset;
7
+use Illuminate\Http\RedirectResponse;
8
+use Illuminate\Http\Request;
9
+use Illuminate\Support\Facades\Hash;
10
+use Illuminate\Support\Facades\Password;
11
+use Illuminate\Support\Str;
12
+use Illuminate\Validation\Rules;
13
+use Illuminate\View\View;
14
+
15
+class NewPasswordController extends Controller
16
+{
17
+    /**
18
+     * Display the password reset view.
19
+     */
20
+    public function create(Request $request): View
21
+    {
22
+        return view('auth.reset-password', ['request' => $request]);
23
+    }
24
+
25
+    /**
26
+     * Handle an incoming new password request.
27
+     *
28
+     * @throws \Illuminate\Validation\ValidationException
29
+     */
30
+    public function store(Request $request): RedirectResponse
31
+    {
32
+        $request->validate([
33
+            'token' => ['required'],
34
+            'email' => ['required', 'email'],
35
+            'password' => ['required', 'confirmed', Rules\Password::defaults()],
36
+        ]);
37
+
38
+        // Here we will attempt to reset the user's password. If it is successful we
39
+        // will update the password on an actual user model and persist it to the
40
+        // database. Otherwise we will parse the error and return the response.
41
+        $status = Password::reset(
42
+            $request->only('email', 'password', 'password_confirmation', 'token'),
43
+            function ($user) use ($request) {
44
+                $user->forceFill([
45
+                    'password' => Hash::make($request->password),
46
+                    'remember_token' => Str::random(60),
47
+                ])->save();
48
+
49
+                event(new PasswordReset($user));
50
+            }
51
+        );
52
+
53
+        // If the password was successfully reset, we will redirect the user back to
54
+        // the application's home authenticated view. If there is an error we can
55
+        // redirect them back to where they came from with their error message.
56
+        return $status == Password::PASSWORD_RESET
57
+                    ? redirect()->route('login')->with('status', __($status))
58
+                    : back()->withInput($request->only('email'))
59
+                            ->withErrors(['email' => __($status)]);
60
+    }
61
+}

+ 29
- 0
app/Http/Controllers/Auth/PasswordController.php Ver fichero

@@ -0,0 +1,29 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Auth;
4
+
5
+use App\Http\Controllers\Controller;
6
+use Illuminate\Http\RedirectResponse;
7
+use Illuminate\Http\Request;
8
+use Illuminate\Support\Facades\Hash;
9
+use Illuminate\Validation\Rules\Password;
10
+
11
+class PasswordController extends Controller
12
+{
13
+    /**
14
+     * Update the user's password.
15
+     */
16
+    public function update(Request $request): RedirectResponse
17
+    {
18
+        $validated = $request->validateWithBag('updatePassword', [
19
+            'current_password' => ['required', 'current_password'],
20
+            'password' => ['required', Password::defaults(), 'confirmed'],
21
+        ]);
22
+
23
+        $request->user()->update([
24
+            'password' => Hash::make($validated['password']),
25
+        ]);
26
+
27
+        return back()->with('status', 'password-updated');
28
+    }
29
+}

+ 44
- 0
app/Http/Controllers/Auth/PasswordResetLinkController.php Ver fichero

@@ -0,0 +1,44 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Auth;
4
+
5
+use App\Http\Controllers\Controller;
6
+use Illuminate\Http\RedirectResponse;
7
+use Illuminate\Http\Request;
8
+use Illuminate\Support\Facades\Password;
9
+use Illuminate\View\View;
10
+
11
+class PasswordResetLinkController extends Controller
12
+{
13
+    /**
14
+     * Display the password reset link request view.
15
+     */
16
+    public function create(): View
17
+    {
18
+        return view('auth.forgot-password');
19
+    }
20
+
21
+    /**
22
+     * Handle an incoming password reset link request.
23
+     *
24
+     * @throws \Illuminate\Validation\ValidationException
25
+     */
26
+    public function store(Request $request): RedirectResponse
27
+    {
28
+        $request->validate([
29
+            'email' => ['required', 'email'],
30
+        ]);
31
+
32
+        // We will send the password reset link to this user. Once we have attempted
33
+        // to send the link, we will examine the response then see the message we
34
+        // need to show to the user. Finally, we'll send out a proper response.
35
+        $status = Password::sendResetLink(
36
+            $request->only('email')
37
+        );
38
+
39
+        return $status == Password::RESET_LINK_SENT
40
+                    ? back()->with('status', __($status))
41
+                    : back()->withInput($request->only('email'))
42
+                            ->withErrors(['email' => __($status)]);
43
+    }
44
+}

+ 51
- 0
app/Http/Controllers/Auth/RegisteredUserController.php Ver fichero

@@ -0,0 +1,51 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Auth;
4
+
5
+use App\Http\Controllers\Controller;
6
+use App\Models\User;
7
+use App\Providers\RouteServiceProvider;
8
+use Illuminate\Auth\Events\Registered;
9
+use Illuminate\Http\RedirectResponse;
10
+use Illuminate\Http\Request;
11
+use Illuminate\Support\Facades\Auth;
12
+use Illuminate\Support\Facades\Hash;
13
+use Illuminate\Validation\Rules;
14
+use Illuminate\View\View;
15
+
16
+class RegisteredUserController extends Controller
17
+{
18
+    /**
19
+     * Display the registration view.
20
+     */
21
+    public function create(): View
22
+    {
23
+        return view('auth.register');
24
+    }
25
+
26
+    /**
27
+     * Handle an incoming registration request.
28
+     *
29
+     * @throws \Illuminate\Validation\ValidationException
30
+     */
31
+    public function store(Request $request): RedirectResponse
32
+    {
33
+        $request->validate([
34
+            'name' => ['required', 'string', 'max:255'],
35
+            'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class],
36
+            'password' => ['required', 'confirmed', Rules\Password::defaults()],
37
+        ]);
38
+
39
+        $user = User::create([
40
+            'name' => $request->name,
41
+            'email' => $request->email,
42
+            'password' => Hash::make($request->password),
43
+        ]);
44
+
45
+        event(new Registered($user));
46
+
47
+        Auth::login($user);
48
+
49
+        return redirect(RouteServiceProvider::HOME);
50
+    }
51
+}

+ 28
- 0
app/Http/Controllers/Auth/VerifyEmailController.php Ver fichero

@@ -0,0 +1,28 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers\Auth;
4
+
5
+use App\Http\Controllers\Controller;
6
+use App\Providers\RouteServiceProvider;
7
+use Illuminate\Auth\Events\Verified;
8
+use Illuminate\Foundation\Auth\EmailVerificationRequest;
9
+use Illuminate\Http\RedirectResponse;
10
+
11
+class VerifyEmailController extends Controller
12
+{
13
+    /**
14
+     * Mark the authenticated user's email address as verified.
15
+     */
16
+    public function __invoke(EmailVerificationRequest $request): RedirectResponse
17
+    {
18
+        if ($request->user()->hasVerifiedEmail()) {
19
+            return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
20
+        }
21
+
22
+        if ($request->user()->markEmailAsVerified()) {
23
+            event(new Verified($request->user()));
24
+        }
25
+
26
+        return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
27
+    }
28
+}

+ 12
- 0
app/Http/Controllers/Controller.php Ver fichero

@@ -0,0 +1,12 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
6
+use Illuminate\Foundation\Validation\ValidatesRequests;
7
+use Illuminate\Routing\Controller as BaseController;
8
+
9
+class Controller extends BaseController
10
+{
11
+    use AuthorizesRequests, ValidatesRequests;
12
+}

+ 45
- 0
app/Http/Controllers/DashboardController.php Ver fichero

@@ -0,0 +1,45 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Models\Apresiasi;
6
+use App\Models\Pelaporan;
7
+use Illuminate\Http\Request;
8
+use Illuminate\Support\Facades\DB;
9
+
10
+class DashboardController extends Controller
11
+{
12
+    // public function index(Request $request){
13
+    //     return view('/dashboard')->with('success','Success login');
14
+    // }
15
+
16
+
17
+    public function index(Request $request){
18
+        $laporan = Pelaporan::with('tindakan','user')->get();
19
+        $user = $request->user();
20
+
21
+        if ($user->role == 'admin') {
22
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
23
+            $laporan = Pelaporan::with('tindakan','user')->get();
24
+            $total = Pelaporan::where('tindakan_id', 1)->count();
25
+            $tot = Pelaporan::where('tindakan_id', 2)->count();
26
+            $tots = Pelaporan::where('tindakan_id', 3)->count();
27
+            $totals = Pelaporan::where('tindakan_id', 4)->count();
28
+        } elseif ($user->role == 'user') {
29
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
30
+            $riwayatPelaporan = Pelaporan::where('user_id', $user->id)->get();
31
+            $laporan = $riwayatPelaporan->with('tindakan','user')->count();
32
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
33
+            $total = $riwayatPelaporan->where('tindakan_id', 1)->count();
34
+            // Menghitung total berdasarkan tindakan_id dari riwayat pelaporan pengguna
35
+            $tot = $riwayatPelaporan->where('tindakan_id', 2)->count();
36
+            $tots = $riwayatPelaporan->where('tindakan_id', 3)->count();
37
+            $totals = $riwayatPelaporan->where('tindakan_id', 4)->count();
38
+        }
39
+
40
+        $pelaporans = Pelaporan::all();
41
+        $apresiasi = Apresiasi::all();
42
+
43
+        return view('users.dashboard', compact('laporan','apresiasi','pelaporans','total', 'tot', 'tots', 'totals'));
44
+    }
45
+}

+ 166
- 0
app/Http/Controllers/InformasiController.php Ver fichero

@@ -0,0 +1,166 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Models\Informasi;
6
+use App\Models\Pelaporan;
7
+use Illuminate\Http\Request;
8
+
9
+class InformasiController extends Controller
10
+{
11
+    public function adminIndex(Request $request){
12
+        $user = $request->user();
13
+        if ($user->role == 'admin') {
14
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
15
+            $laporan = Pelaporan::with('tindakan','user')->get();
16
+
17
+        } elseif ($user->role == 'user') {
18
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
19
+            $laporan = Pelaporan::where('user_id', $user->id)->get();
20
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
21
+            $count = $laporan->count();
22
+        }
23
+
24
+        $informasis = Informasi::query();
25
+
26
+        if ($request->has('search')) {
27
+            $informasis->where('kategori', 'LIKE', '%' . $request->search . '%');
28
+        }
29
+
30
+        $informasis = $informasis->get();
31
+        return view('admin.informasi.index', compact('laporan', 'informasis'));
32
+    }
33
+
34
+    public function adminCreate()
35
+    {
36
+        $laporan = Pelaporan::with('tindakan','user')->get();
37
+
38
+        return view('admin.informasi.create',compact('laporan'));
39
+    }
40
+    public function adminStore(Request $request)
41
+    {
42
+        $request->validate([
43
+            'judul' => 'required',
44
+            'kategori' => 'required',
45
+            'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif,pdf',
46
+        ],[
47
+            'judul.Required'=>'Judul Wajib Diisi',
48
+            'kategori.Required'=>'Kategori Wajib Diisi',
49
+            'foto.nullable'=>'Foto Tidak Boleh Kosong',
50
+            'foto.image'=>'Foto Harus Berupa Image ',
51
+            'foto.mimes'=>'Foto Harus JPEG,PNG,JPG,GIF,PDF',
52
+        ]);
53
+
54
+        $informasi = new Informasi();
55
+        $informasi->judul = $request->input('judul');
56
+        $informasi->kategori = $request->input('kategori');
57
+        if ($request->hasFile('foto')) {
58
+            $fotos = time().'.'.$request->foto->extension();
59
+            $request->foto->move(public_path('foto'), $fotos);
60
+            $informasi->foto = $fotos;
61
+        }
62
+
63
+        $informasi->save();
64
+
65
+        return redirect()->route('informasi.adminIndex')->with('success', 'Informasi berhasil disimpan.');
66
+    }
67
+
68
+    public function adminEdit($id)
69
+    {
70
+        $laporan = Pelaporan::with('tindakan','user')->get();
71
+        $informasis = Informasi::find($id);
72
+        return view('admin.informasi.update', compact('informasis', 'laporan'));
73
+    }
74
+
75
+    public function adminUpdate(Request $request, $id)
76
+    {
77
+        $request->validate([
78
+            'judul' => 'required',
79
+            'kategori' => 'required',
80
+            'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif,pdf',
81
+        ],[
82
+            'judul.Required'=>'Judul Wajib Diisi',
83
+            'kategori.Required'=>'Kategori Wajib Diisi',
84
+            'foto.nullable'=>'Foto Tidak Boleh Kosong',
85
+            'foto.image'=>'Foto Harus Berupa Image ',
86
+            'foto.mimes'=>'Foto Harus JPEG,PNG,JPG,GIF,PDF',
87
+        ]);
88
+
89
+        $informasis = Informasi::find($id);
90
+
91
+        if (!$informasis) {
92
+            return redirect()->route('informasi.adminIndex')->with('error', 'Informasi tidak ditemukan.');
93
+        }
94
+
95
+        $informasis->update($request->all());
96
+
97
+        if ($request->hasFile('foto')) {
98
+            $fotoPath = $request->file('foto')->store('uploads');
99
+            $informasis->foto = $fotoPath;
100
+            $informasis->save();
101
+        }
102
+
103
+        return redirect()->route('informasi.adminIndex')->with('success', 'Informasi berhasil diperbarui.');
104
+    }
105
+ 
106
+    public function adminDestroy($id)
107
+    {
108
+        $informasis = Informasi::find($id);
109
+
110
+        if ($informasis) {
111
+            $informasis->delete();
112
+            return redirect()->route('informasi.adminIndex')->with('success', 'Informasi berhasil dihapus.');
113
+        } else {
114
+            return redirect()->route('informasi.adminIndex')->with('error', 'Informasi tidak ditemukan.');
115
+        }
116
+    }
117
+
118
+    public function userIndex(Request $request)
119
+    {
120
+        $user = $request->user();
121
+        if ($user->role == 'admin') {
122
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
123
+            $laporan = Pelaporan::with('tindakan','user')->get();
124
+        } elseif ($user->role == 'user') {
125
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
126
+            $laporan = Pelaporan::where('user_id', $user->id)->get();
127
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
128
+            $count = $laporan->count();
129
+        }
130
+
131
+        // Menggunakan kueri baru untuk mengambil data dari model Informasi
132
+        $informasis = Informasi::query();
133
+
134
+        if ($request->has('search')) {
135
+            $informasis->where('kategori', 'LIKE', '%' . $request->search . '%');
136
+        }
137
+
138
+        // Mengambil hasil kueri dari model Informasi
139
+        $informasis = $informasis->get();
140
+
141
+        return view('users.informasi.index', compact('laporan', 'informasis'));
142
+    }
143
+
144
+
145
+    public function userShow(Request $request, $id)
146
+{
147
+    $user = $request->user();
148
+    if ($user->role == 'admin') {
149
+        // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
150
+        $laporan = Pelaporan::with('tindakan', 'user')->get();
151
+    } elseif ($user->role == 'user') {
152
+        // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
153
+        $laporan = Pelaporan::where('user_id', $user->id)->get();
154
+        // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
155
+        $count = $laporan->count();
156
+    }
157
+
158
+    // Menggunakan kueri baru untuk mengambil data dari model Informasi berdasarkan ID
159
+    $informasis = Informasi::findOrFail($id);
160
+    return view('users.informasi.show', compact('laporan', 'informasis'));
161
+}
162
+
163
+
164
+
165
+
166
+}

+ 24
- 0
app/Http/Controllers/PanduanController.php Ver fichero

@@ -0,0 +1,24 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Models\Pelaporan;
6
+use Illuminate\Http\Request;
7
+
8
+class PanduanController extends Controller
9
+{
10
+    public function index(Request $request){
11
+        $user = $request->user();
12
+        if ($user->role == 'admin') {
13
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
14
+            $laporan = Pelaporan::with('tindakan','user')->get();
15
+
16
+        } elseif ($user->role == 'user') {
17
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
18
+            $laporan = Pelaporan::where('user_id', $user->id)->get();
19
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
20
+            $count = $laporan->count();
21
+        }
22
+        return view('umum.panduan.index', compact('laporan'));
23
+    }
24
+}

+ 130
- 0
app/Http/Controllers/PelaporanController.php Ver fichero

@@ -0,0 +1,130 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Models\Pelaporan;
6
+use Illuminate\Http\Request;
7
+
8
+class PelaporanController extends Controller
9
+{
10
+    public function index(Request $request)
11
+    {
12
+        $user = $request->user(); // Ambil data pengguna dari request
13
+        if ($user->role == 'admin') {
14
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
15
+            $laporan = Pelaporan::with('tindakan','user')->get();
16
+
17
+        } elseif ($user->role == 'user') {
18
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
19
+            $laporan = Pelaporan::where('user_id', $user->id)->get();
20
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
21
+            $count = $laporan->count();
22
+        }
23
+        $pelaporan = Pelaporan::query();
24
+        if ($user->role == 'user') {
25
+            $pelaporan->where('user_id', $user->id); // Filter berdasarkan user_id jika pengguna adalah user
26
+        }
27
+        if ($request->has('search')) {
28
+            $pelaporan->where('judul', 'LIKE', '%' . $request->search . '%');
29
+        }
30
+        $pelaporan = $pelaporan->get(); // atau paginate() tergantung kebutuhan Anda
31
+
32
+        return view('users.pelaporan.index', compact('pelaporan','laporan'));
33
+    }
34
+
35
+
36
+    public function create()
37
+    {
38
+        $laporan = Pelaporan::with('tindakan','user')->get();
39
+        return view('users.pelaporan.create', compact('laporan',));
40
+    }
41
+
42
+    public function store(Request $request)
43
+    {
44
+        $request->validate([
45
+            'judul' => 'required',
46
+            'keterangan' => 'required',
47
+            'tanggal' => 'required',
48
+            'lokasi' => 'required',
49
+            'status' => 'required',
50
+            'saran' => 'required',
51
+            'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif',
52
+        ],[
53
+            'judul.Required'=>'Judul Wajib Diisi',
54
+            'keterangan.Required'=>'Keterangan Wajib Diisi',
55
+            'tanggal.Required'=>'Tanggal Wajib Diisi',
56
+            'lokasi.Required'=>'Lokasi Wajib Diisi',
57
+            'status.Required'=>'Status Wajib Diisi',
58
+            'saran.Required' => 'Saran Wajib Diisi',
59
+            'foto.nullable'=>'Foto Tidak Boleh Kosong',
60
+            'foto.image'=>'Foto Harus Berupa Image ',
61
+            'foto.mimes'=>'Foto Harus JPEG,PNG,JPG,GIF',
62
+        ]);
63
+
64
+        $pelaporan = new Pelaporan();
65
+        $pelaporan->judul = $request->input('judul');
66
+        $pelaporan->keterangan = $request->input('keterangan');
67
+        $pelaporan->tanggal = $request->input('tanggal');
68
+        $pelaporan->lokasi = $request->input('lokasi');
69
+        $pelaporan->saran = $request->input('saran');
70
+        $pelaporan->status = $request->input('status');
71
+        $pelaporan->user_id = auth()->id();
72
+        if ($request->hasFile('foto')) {
73
+            $fotos = time().'.'.$request->foto->extension();
74
+            $request->foto->move(public_path('foto'), $fotos);
75
+            $pelaporan->foto = $fotos;
76
+        }
77
+
78
+        $pelaporan->save();
79
+
80
+        return redirect()->route('pelaporan.index')->with('success', 'Pelaporan berhasil disimpan.');
81
+    }
82
+
83
+
84
+    public function edit($id)
85
+    {
86
+        $laporan = Pelaporan::with('tindakan','user')->get();
87
+        $pelaporans = Pelaporan::find($id);
88
+        return view('users.pelaporan.update', compact('pelaporans', 'laporan'));
89
+    }
90
+
91
+    public function update(Request $request, $id)
92
+    {
93
+        $request->validate([
94
+            'judul' => 'required',
95
+            'keterangan' => 'required',
96
+            'tanggal' => 'required',
97
+            'lokasi' => 'required',
98
+            'status' => 'required',
99
+            'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif',
100
+        ],[
101
+            'judul.Required'=>'Judul Wajib Diisi',
102
+            'keterangan.Required'=>'Keterangan Wajib Diisi',
103
+            'tanggal.Required'=>'Tanggal Wajib Diisi',
104
+            'lokasi.Required'=>'Lokasi Wajib Diisi',
105
+            'status.Required'=>'Status Wajib Diisi',
106
+            'foto.nullable'=>'Foto Tidak Boleh Kosong',
107
+            'foto.image'=>'Foto Harus Berupa Image ',
108
+            'foto.mimes'=>'Foto Harus JPEG,PNG,JPG,GIF',
109
+        ]);
110
+
111
+        $pelaporan = Pelaporan::find($id);
112
+        $pelaporan->update($request->all());
113
+
114
+        if ($request->hasFile('foto')) {
115
+            $fotoPath = $request->file('foto')->store('uploads');
116
+            $pelaporan->foto = $fotoPath;
117
+            $pelaporan->save();
118
+        }
119
+
120
+        return redirect()->route('pelaporan.index')->with('success', 'Pelaporan berhasil diperbarui.');
121
+    }
122
+
123
+    public function destroy($id)
124
+    {
125
+        $pelaporan = Pelaporan::find($id);
126
+        $pelaporan->delete();
127
+
128
+        return redirect()->route('pelaporan.index')->with('success', 'Pelaporan berhasil dihapus.');
129
+    }
130
+}

+ 46
- 0
app/Http/Controllers/ProfileController.php Ver fichero

@@ -0,0 +1,46 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Models\Pelaporan;
6
+use App\Models\User;
7
+use Illuminate\Http\Request;
8
+use Illuminate\Support\Facades\Auth;
9
+
10
+class ProfileController extends Controller
11
+{
12
+    public function index(Request $request){
13
+        $user = $request->user();
14
+        $laporan = Pelaporan::with('tindakan','user')->get();
15
+        $profile  = User::where('id', $user->id)->get();
16
+
17
+        return view('umum.profile.index', compact('user','laporan', 'profile'));
18
+    }
19
+
20
+    public function update(Request $request, $id)
21
+    {
22
+        $request->validate([
23
+            'foto' => 'nullable|image|mimes:jpeg,png,jpg,gif',
24
+        ],[
25
+            'foto.nullable' => 'Foto Tidak Boleh Kosong',
26
+            'foto.image' => 'Foto Harus Berupa Image ',
27
+            'foto.mimes' => 'Foto Harus JPEG, PNG, JPG, GIF',
28
+        ]);
29
+
30
+        $user = User::findOrFail($id);
31
+
32
+        // Perbarui data pengguna
33
+        $user->update($request->all());
34
+
35
+        if ($request->hasFile('foto')) {
36
+            // Simpan foto baru dan perbarui kolom foto di database
37
+            $fotoPath = $request->file('foto')->store('uploads');
38
+            $user->foto = $fotoPath;
39
+            $user->save();
40
+        }
41
+
42
+        return redirect()->back()->with('success', 'Foto profil berhasil diperbarui');
43
+    }
44
+
45
+
46
+}

+ 73
- 0
app/Http/Controllers/RiwayatLaporanController.php Ver fichero

@@ -0,0 +1,73 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Models\Pelaporan;
6
+use App\Models\RiwayatLaporan;
7
+use App\Models\User;
8
+use Illuminate\Http\Request;
9
+
10
+class RiwayatLaporanController extends Controller
11
+{
12
+    public function index(Request $request)
13
+    {
14
+        // Ambil data pengguna dari request
15
+        $user = $request->user();
16
+        if ($user->role == 'admin') {
17
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
18
+            $laporan = Pelaporan::with('tindakan','user')->get();
19
+
20
+        } elseif ($user->role == 'user') {
21
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
22
+            $laporan = Pelaporan::where('user_id', $user->id)->get();
23
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
24
+            $count = $laporan->count();
25
+        }
26
+        // Inisialisasi query builder untuk riwayat pelaporan
27
+        $riwayatPelaporan = Pelaporan::query();
28
+
29
+        // Filter berdasarkan pencarian jika ada
30
+        if ($request->has('search')) {
31
+            $searchTerm = $request->search;
32
+            $riwayatPelaporan->where('judul', 'LIKE', '%' . $searchTerm . '%');
33
+        }
34
+
35
+        if ($request->has('startDate') && $request->has('endDate')) {
36
+            $startDate = $request->startDate;
37
+            $endDate = $request->endDate;
38
+
39
+            $riwayatPelaporan->whereBetween('tanggal', [$startDate, $endDate]);
40
+        }
41
+        // Filter berdasarkan peran pengguna
42
+        if ($user->role == 'admin') {
43
+            // Jika pengguna adalah admin, ambil semua riwayat pelaporan
44
+            $riwayatPelaporan = $riwayatPelaporan->get();
45
+        } elseif ($user->role == 'user') {
46
+            // Jika pengguna adalah pengguna biasa, ambil riwayat pelaporan milik pengguna tersebut
47
+            $riwayatPelaporan = $riwayatPelaporan->where('user_id', $user->id)->get();
48
+        }
49
+
50
+        // Kembalikan data sebagai response JSON
51
+        return view('umum.riwayat.index', ['riwayatPelaporan' => $riwayatPelaporan], compact('laporan'));
52
+    }
53
+
54
+    public function cetak(Request $request){
55
+        $user = $request->user();
56
+
57
+        // Inisialisasi query builder untuk riwayat pelaporan
58
+        $riwayatPelaporan = Pelaporan::query();
59
+        // Filter berdasarkan peran pengguna
60
+        if ($user->role == 'admin') {
61
+            // Jika pengguna adalah admin, ambil semua riwayat pelaporan
62
+            $riwayatPelaporan = $riwayatPelaporan->get();
63
+        } elseif ($user->role == 'user') {
64
+            // Jika pengguna adalah pengguna biasa, ambil riwayat pelaporan milik pengguna tersebut
65
+            $riwayatPelaporan = $riwayatPelaporan->where('user_id', $user->id)->get();
66
+        }
67
+
68
+        return view('umum.riwayat.cetak', ['riwayatPelaporan' => $riwayatPelaporan]);
69
+    }
70
+
71
+
72
+
73
+}

+ 260
- 0
app/Http/Controllers/SessionController.php Ver fichero

@@ -0,0 +1,260 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Mail\ResetPasswordMail;
6
+use App\Models\PasswordReset;
7
+use App\Models\Pelaporan;
8
+use Illuminate\Http\Request;
9
+use Illuminate\Support\Facades\Auth;
10
+use Illuminate\Support\Facades\Redirect;
11
+use Illuminate\Support\Facades\Validator;
12
+use App\Models\User;
13
+use Carbon\Carbon;
14
+use Illuminate\Support\Facades\DB;
15
+use Illuminate\Support\Str;
16
+use Illuminate\Support\Facades\Session;
17
+use Illuminate\Support\Facades\Hash;
18
+use Illuminate\Support\Facades\Mail;
19
+use RealRashid\SweetAlert\Facedes\Alert;
20
+
21
+class SessionController extends Controller
22
+{
23
+    function index(){
24
+        $users = User::all();
25
+        return view("/Auth/login", compact('users'));
26
+
27
+    }
28
+
29
+    public function login(Request $request)
30
+    {
31
+        // Validasi input dari form
32
+        $request->validate([
33
+            'email' => 'required|email',
34
+            'password' => 'required',
35
+        ],[
36
+            'name.Required'=>'Name Wajib Diisi',
37
+            'email.Required'=>'Email Wajib Diisi',
38
+            'email.email'=>'Silahkan Masukkan Email Yang Valid',
39
+        ]);
40
+
41
+        $infologin =[
42
+                    'email' =>$request->email,
43
+                    'password' => $request->password
44
+                ];
45
+        // Coba melakukan proses autentikasi
46
+        if (Auth::attempt($infologin)) {
47
+            if (Auth::user()->role == 'admin') { // Menggunakan peran untuk memeriksa apakah pengguna adalah admin
48
+                // Jika pengguna adalah admin, redirect ke dashboard admin
49
+                return redirect()->route('admin.dashboards')->withSuccess(Auth::user()->name . ' Berhasil Login');
50
+            } elseif (Auth::user()->role == 'user')  {
51
+                // Jika pengguna adalah pengguna biasa, redirect ke dashboard pengguna
52
+                return redirect()->route('users.dashboard')->withSuccess(Auth::user()->name . ' Berhasil Login');
53
+            }
54
+        }else{
55
+
56
+            // Jika autentikasi gagal, redirect kembali ke halaman login dengan pesan error
57
+            return redirect()->route('index.login')->with('error', 'Invalid credentials');
58
+        }
59
+    }
60
+
61
+    // public function login(Request $request)
62
+    // {
63
+    //     // Validasi input dari form
64
+    //     $request->validate([
65
+    //         'email' => 'required|email',
66
+    //         'password' => 'required',
67
+    //     ],[
68
+    //         'name.required'=>'Name Wajib Diisi',
69
+    //         'email.required'=>'Email Wajib Diisi',
70
+    //         'email.email'=>'Silahkan Masukkan Email Yang Valid',
71
+    //     ]);
72
+
73
+    //     $infologin = [
74
+    //         'email' => $request->email,
75
+    //         'password' => $request->password
76
+    //     ];
77
+
78
+    //     // Coba melakukan proses autentikasi
79
+    //     if (Auth::attempt($infologin)) {
80
+    //         if (Auth::user()->role == 'admin') {
81
+    //             // Jika pengguna adalah admin, kirim respons JSON dengan informasi berhasil login
82
+    //             return response()->json(['message' => Auth::user()->name . ' Berhasil Login', 'role' => 'admin']);
83
+
84
+    //         } elseif (Auth::user()->role == 'user') {
85
+    //             // Jika pengguna adalah pengguna biasa, kirim respons JSON dengan informasi berhasil login
86
+    //             return response()->json(['message' => Auth::user()->name . ' Berhasil Login', 'role' => 'user']);
87
+    //         }
88
+    //     } else {
89
+    //         // Jika autentikasi gagal, kirim respons JSON dengan informasi credentials invalid
90
+    //         return response()->json(['error' => 'Invalid credentials'], 401);
91
+    //     }
92
+    // }
93
+
94
+
95
+    public function showRegistrationForm()
96
+    {
97
+        return view('auth.register');
98
+    }
99
+
100
+    function signup(Request $request){
101
+        Session::flash('name', $request->name);
102
+        Session::flash('email', $request->email);
103
+        if (config('services.recaptcha.key') && env('RECAPTCHA_ENABLED') == true){
104
+            $request->validate([
105
+                'name'=>'required',
106
+                'email'=>'required|email|unique:users',
107
+                'password'=> 'required|min:8|confirmed',
108
+                'g-recaptcha-response' =>'required|recaptcha'
109
+            ],[
110
+                'name.Required'=>'Name Wajib Diisi',
111
+                'email.Required'=>'Email Wajib Diisi',
112
+                'email.email'=>'Silahkan Masukkan Email Yang Valid',
113
+                'email.unique'=>'Email Sudah Pernah Digunakan, Silahkan Pilih Email Yang Lain',
114
+                'password.Required'=>'Password Wajib Diisi',
115
+                'password.min'=>'Minimum Password Yang Diizinkan 8 Karakter',
116
+                'g-recaptcha-response.recaptcha'=>'Captcha Verification Failed',
117
+                'g-recaptcha-response.required'=>'Please Complete the Captcha',
118
+                'password.confirmed' => 'Konfirmasi password tidak sesuai dengan password',
119
+            ]);
120
+        }else {
121
+            // Jika reCAPTCHA dimatikan, validasi tanpa reCAPTCHA
122
+            $request->validate([
123
+                'name'=>'required',
124
+                'email'=>'required|email|unique:users',
125
+                'password'=> 'required|min:8|confirmed',
126
+            ],[
127
+                'name.Required'=>'Name Wajib Diisi',
128
+                'email.Required'=>'Email Wajib Diisi',
129
+                'email.email'=>'Silahkan Masukkan Email Yang Valid',
130
+                'email.unique'=>'Email Sudah Pernah Digunakan, Silahkan Pilih Email Yang Lain',
131
+                'password.Required'=>'Password Wajib Diisi',
132
+                'password.min'=>'Minimum Password Yang Diizinkan 8 Karakter',
133
+                'password.confirmed' => 'Konfirmasi password tidak sesuai dengan password',
134
+            ]);
135
+        }
136
+
137
+        $data = [
138
+            'name' =>$request->name,
139
+            'email' =>$request->email,
140
+            'password' => Hash::make($request->password)
141
+        ];
142
+
143
+        User::create($data);
144
+
145
+        $infologin =[
146
+            'email' =>$request->email,
147
+            'password' => $request->password
148
+        ];
149
+
150
+        if(Auth::attempt($infologin)){
151
+            // jika otentikasi sukses masuk
152
+
153
+            return redirect()->route('users.dashboard')->withSuccess(Auth::user()->name . ' Berhasil Login');
154
+        }else{
155
+            // kalau gagal masuk sini
156
+            return redirect('/')->withErrors('Email dan Password Tidak Valid');
157
+        }
158
+
159
+    }
160
+
161
+    function logout(){
162
+        Auth::logout();
163
+        return redirect('/')->withSuccess('Berhasil Logout');
164
+    }
165
+
166
+    function forgot(){
167
+
168
+        return view('auth.forgot-password');
169
+    }
170
+
171
+    public function sendResetLink(Request $request)
172
+    {
173
+        // Validasi input
174
+        $request->validate([
175
+            'email' => 'required|email',
176
+        ], [
177
+            'email.required' => 'Email Wajib Diisi',
178
+            'email.email' => 'Silahkan Masukkan Email Yang Valid',
179
+        ]);
180
+
181
+        // Cek apakah email terdaftar dalam database
182
+        $user = User::where('email', $request->email)->first();
183
+
184
+        if ($user) {
185
+            // Generate token
186
+            $token = Str::random(60);
187
+
188
+            // Set waktu kadaluarsa token
189
+            $expires_at = now()->addMinutes(1); // Token berlaku selama 1 menit
190
+
191
+            // Simpan token dan waktu kadaluarsa ke dalam tabel password_resets
192
+            PasswordReset::updateOrCreate(
193
+                ['email' => $request->email],
194
+                ['email' => $request->email, 'token' => $token, 'created_at' => now(), 'expires_at' => $expires_at]
195
+            );
196
+
197
+            // Kirim email reset password
198
+            Mail::to($user->email)->send(new ResetPasswordMail($token));
199
+
200
+            return redirect()->route('sendResetLink')->with('success', 'Reset link has been sent to your email.');
201
+        } else {
202
+            return redirect()->back()->withErrors(['email' => 'Email tidak terdaftar.'])->withInput();
203
+        }
204
+    }
205
+
206
+    public function showResetForm($token)
207
+    {
208
+        // Logika untuk menampilkan halaman reset password dengan menggunakan token
209
+        return view('auth.reset', ['token' => $token]);
210
+    }
211
+
212
+    public function resetPassword(Request $request)
213
+    {
214
+        // Validasi input
215
+        $request->validate([
216
+            'password' => 'required|min:8|confirmed',
217
+        ],[
218
+            'password.required' => 'Password Harus Diisi',
219
+            'password.min' => 'Minimum Password Yang Diizinkan 8 Karakter',
220
+            'password.confirmed' => 'Konfirmasi password tidak sesuai dengan password',
221
+        ]);
222
+
223
+        // Cek apakah pengguna sudah login
224
+        if (Auth::check()) {
225
+            // Reset password pengguna yang sudah login
226
+            $user = Auth::user();
227
+
228
+        } else {
229
+            // Cek apakah token reset password valid
230
+            $token = $request->route('token');
231
+            // Anda perlu membuat kolom 'password_resets' jika belum ada
232
+            $reset = DB::table('password_resets')->where('token', $token)->first();
233
+
234
+            if (!$reset) {
235
+                return redirect()->route('index.login')->withErrors(['error' => 'Invalid token.']);
236
+            }
237
+
238
+            // Cek apakah token masih berlaku
239
+            $tokenCreatedAt = Carbon::parse($reset->created_at);
240
+            if (now()->diffInMinutes($tokenCreatedAt) > 1) {
241
+                return redirect()->route('index.login')->withErrors(['error' => 'Token expired.']);
242
+            }
243
+
244
+            // Reset password
245
+            $user = User::where('email', $reset->email)->first();
246
+            if (!$user) {
247
+                return redirect()->route('index.login')->withErrors(['error' => 'User not found.']);
248
+            }
249
+            $user->password = Hash::make($request->password);
250
+            $user->save();
251
+
252
+            // Hapus token reset password yang sudah digunakan
253
+            DB::table('password_resets')->where('token', $token)->delete();
254
+        }
255
+
256
+        // Redirect ke halaman login dengan pesan sukses
257
+        return redirect()->route('index.login')->with('success', 'Password has been reset successfully.');
258
+    }
259
+
260
+}

+ 79
- 0
app/Http/Controllers/TindakanController.php Ver fichero

@@ -0,0 +1,79 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Models\Pelaporan;
6
+use App\Models\Tindakan;
7
+use Illuminate\Http\Request;
8
+
9
+class TindakanController extends Controller
10
+{
11
+    public function index(Request $request)
12
+    {
13
+        $user = $request->user();
14
+        if ($user->role == 'admin') {
15
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
16
+            $laporan = Pelaporan::with('tindakan','user')->get();
17
+
18
+        } elseif ($user->role == 'user') {
19
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
20
+            $riwayat = Pelaporan::where('user_id', $user->id)->get();
21
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
22
+            $laporan = $riwayat->with('tindakan','user')->count();
23
+        }
24
+            $pelaporans = Pelaporan::query();
25
+
26
+            if ($request->has('search')) {
27
+                $pelaporans->where('judul', 'LIKE', '%' . $request->search . '%');
28
+            }
29
+
30
+            $pelaporans = $pelaporans->get();
31
+
32
+            return view('admin.tindakan.index', compact('pelaporans', 'laporan'));
33
+
34
+    }
35
+
36
+    public function edit($id){
37
+        $laporan = Pelaporan::with('tindakan','user')->get();
38
+        $pelaporans = Pelaporan::find($id);
39
+
40
+        $tindakans = Tindakan::all();
41
+        return view('admin.tindakan.update', compact('pelaporans', 'tindakans','laporan'));
42
+    }
43
+
44
+    public function update(Request $request, $id){
45
+        $request->validate([
46
+            'tindakan_id' => 'required', // Sesuaikan aturan validasi sesuai kebutuhan
47
+        ]);
48
+
49
+        $pelaporans = Pelaporan::find($id);
50
+        // dd($request->all(), $pelaporans);
51
+        $pelaporans->tindakan_id = $request->tindakan_id;
52
+        $pelaporans->save();
53
+
54
+        return redirect()->route('tindakan.index')->with('success', 'Tindakan berhasil diperbarui.');
55
+    }
56
+
57
+    public function show(Request $request, $id){
58
+        $laporan = Pelaporan::with('tindakan','user')->get();
59
+        $pelaporans = Pelaporan::find($id);
60
+
61
+        $tindakans = Tindakan::all();
62
+        return view('admin.tindakan.show', compact('pelaporans', 'tindakans','laporan'));
63
+
64
+    }
65
+
66
+    public function destroy($id)
67
+    {
68
+        $pelaporan = Pelaporan::find($id);
69
+
70
+        if ($pelaporan) {
71
+            $pelaporan->delete();
72
+            return redirect()->route('tindakan.index')->with('success', 'Tindakan berhasil dihapus.');
73
+        } else {
74
+            return redirect()->route('tindakan.index')->with('error', 'Tindakan tidak ditemukan.');
75
+        }
76
+    }
77
+
78
+
79
+}

+ 131
- 0
app/Http/Controllers/UsersController.php Ver fichero

@@ -0,0 +1,131 @@
1
+<?php
2
+
3
+namespace App\Http\Controllers;
4
+
5
+use App\Models\Pelaporan;
6
+use App\Models\User;
7
+use Illuminate\Http\Request;
8
+use Illuminate\Support\Facades\Hash;
9
+
10
+class UsersController extends Controller
11
+{
12
+    public function index(Request $request)
13
+    {
14
+        // $users = User::all();
15
+        $user = $request->user();
16
+        if ($user->role == 'admin') {
17
+            // Jika pengguna adalah admin, hitung total berdasarkan tindakan_id
18
+            $laporan = Pelaporan::with('tindakan','user')->get();
19
+
20
+        } elseif ($user->role == 'user') {
21
+            // Jika pengguna adalah pengguna biasa, hitung riwayat pelaporan milik pengguna tersebut
22
+            $riwayat = Pelaporan::where('user_id', $user->id)->get();
23
+            // Menghitung total riwayat pelaporan yang dimiliki oleh pengguna
24
+            $laporan = $riwayat->with('tindakan','user')->count();
25
+        }
26
+        $users = User::query();
27
+
28
+        if ($request->has('search')) {
29
+            $users->where('name', 'LIKE', '%' . $request->search . '%');
30
+        }
31
+
32
+        $users = $users->get();
33
+        return view('admin.user.index', compact('users', 'laporan'));
34
+    }
35
+
36
+    public function create()
37
+    {
38
+        $laporan = Pelaporan::with('tindakan','user')->get();
39
+
40
+        return view('admin.user.create',compact('laporan'));
41
+    }
42
+
43
+    public function store(Request $request)
44
+    {
45
+        $request->validate([
46
+            'name' => 'required',
47
+            'email' => 'required|email|unique:users',
48
+            'password' => 'required|min:8|confirmed', // Menambahkan aturan confirmed untuk konfirmasi password
49
+            'role' => 'required',
50
+        ], [
51
+            'name.required' => 'Nama wajib diisi',
52
+            'email.required' => 'Email wajib diisi',
53
+            'email.email' => 'Silahkan masukkan email yang valid',
54
+            'email.unique' => 'Email sudah pernah digunakan, silahkan pilih email yang lain',
55
+            'password.required' => 'Password wajib diisi',
56
+            'password.min' => 'Minimum password yang diizinkan 8 karakter',
57
+            'password.confirmed' => 'Konfirmasi password tidak sesuai dengan password',
58
+            'role.required' => 'Role wajib diisi',
59
+        ]);
60
+
61
+        $data = [
62
+            'name' =>$request->name,
63
+            'email' =>$request->email,
64
+            'role' =>$request->role,
65
+            'password' => Hash::make($request->password)
66
+        ];
67
+
68
+        User::create($data);
69
+
70
+        return redirect()->route('user.index')->with('success', 'User berhasil ditambahkan.');
71
+    }
72
+
73
+
74
+    public function edit($id)
75
+    {
76
+        $laporan = Pelaporan::with('tindakan','user')->get();
77
+        $users = User::find($id);
78
+        return view('admin.user.update', compact('users', 'laporan'));
79
+    }
80
+
81
+    public function update(Request $request, $id)
82
+    {
83
+        $request->validate([
84
+            'name' => 'required',
85
+            'email' => 'required|email|unique:users,email,' . $id,
86
+            'role' => 'required',
87
+        ], [
88
+            'name.required' => 'Nama wajib diisi',
89
+            'email.required' => 'Email wajib diisi',
90
+            'email.email' => 'Silahkan masukkan email yang valid',
91
+            'email.unique' => 'Email sudah pernah digunakan, silahkan pilih email yang lain',
92
+            'role.required' => 'Role wajib diisi',
93
+        ]);
94
+
95
+        $user = User::find($id);
96
+
97
+        if (!$user) {
98
+            return redirect()->route('user.index')->with('error', 'User tidak ditemukan.');
99
+        }
100
+
101
+        $user->name = $request->name;
102
+        $user->email = $request->email;
103
+        $user->role = $request->role;
104
+
105
+        // Periksa apakah password diisi sebelum diupdate
106
+        if ($request->filled('password')) {
107
+            $request->validate([
108
+                'password' => 'required|min:8|confirmed',
109
+            ], [
110
+                'password.required' => 'Password wajib diisi',
111
+                'password.min' => 'Minimum password yang diizinkan 8 karakter',
112
+                'password.confirmed' => 'Konfirmasi password tidak sesuai dengan password',
113
+            ]);
114
+
115
+            $user->password = Hash::make($request->password); // Gunakan Hash::make untuk mengenkripsi password baru
116
+        }
117
+
118
+        $user->save();
119
+
120
+        return redirect()->route('user.index')->with('success', 'User berhasil diperbarui.');
121
+    }
122
+
123
+
124
+    public function destroy($id)
125
+    {
126
+        $user = User::find($id);
127
+        $user->delete();
128
+
129
+        return redirect()->route('user.index')->with('success', 'User berhasil dihapus.');
130
+    }
131
+}

+ 71
- 0
app/Http/Kernel.php Ver fichero

@@ -0,0 +1,71 @@
1
+<?php
2
+
3
+namespace App\Http;
4
+
5
+use Illuminate\Foundation\Http\Kernel as HttpKernel;
6
+
7
+class Kernel extends HttpKernel
8
+{
9
+    /**
10
+     * The application's global HTTP middleware stack.
11
+     *
12
+     * These middleware are run during every request to your application.
13
+     *
14
+     * @var array<int, class-string|string>
15
+     */
16
+    protected $middleware = [
17
+        // \App\Http\Middleware\TrustHosts::class,
18
+        \App\Http\Middleware\TrustProxies::class,
19
+        \Illuminate\Http\Middleware\HandleCors::class,
20
+        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
21
+        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
22
+        \App\Http\Middleware\TrimStrings::class,
23
+        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
24
+    ];
25
+
26
+    /**
27
+     * The application's route middleware groups.
28
+     *
29
+     * @var array<string, array<int, class-string|string>>
30
+     */
31
+    protected $middlewareGroups = [
32
+        'web' => [
33
+            \App\Http\Middleware\EncryptCookies::class,
34
+            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
35
+            \Illuminate\Session\Middleware\StartSession::class,
36
+            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
37
+            \App\Http\Middleware\VerifyCsrfToken::class,
38
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
39
+            \RealRashid\SweetAlert\ToSweetAlert::class,
40
+
41
+        ],
42
+
43
+        'api' => [
44
+            // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
45
+            \Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
46
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
47
+        ],
48
+    ];
49
+
50
+    /**
51
+     * The application's middleware aliases.
52
+     *
53
+     * Aliases may be used instead of class names to conveniently assign middleware to routes and groups.
54
+     *
55
+     * @var array<string, class-string|string>
56
+     */
57
+    protected $middlewareAliases = [
58
+        'auth' => \App\Http\Middleware\Authenticate::class,
59
+        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
60
+        'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,
61
+        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
62
+        'can' => \Illuminate\Auth\Middleware\Authorize::class,
63
+        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
64
+        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
65
+        'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
66
+        'signed' => \App\Http\Middleware\ValidateSignature::class,
67
+        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
68
+        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
69
+        'check.role' => \App\Http\Middleware\CheckRole::class,
70
+    ];
71
+}

+ 17
- 0
app/Http/Middleware/Authenticate.php Ver fichero

@@ -0,0 +1,17 @@
1
+<?php
2
+
3
+namespace App\Http\Middleware;
4
+
5
+use Illuminate\Auth\Middleware\Authenticate as Middleware;
6
+use Illuminate\Http\Request;
7
+
8
+class Authenticate extends Middleware
9
+{
10
+    /**
11
+     * Get the path the user should be redirected to when they are not authenticated.
12
+     */
13
+    protected function redirectTo(Request $request): ?string
14
+    {
15
+        return $request->expectsJson() ? null : route('login');
16
+    }
17
+}

+ 33
- 0
app/Http/Middleware/CheckRole.php Ver fichero

@@ -0,0 +1,33 @@
1
+<?php
2
+
3
+namespace App\Http\Middleware;
4
+
5
+use Closure;
6
+use Illuminate\Http\Request;
7
+use Symfony\Component\HttpFoundation\Response;
8
+
9
+class CheckRole
10
+{
11
+    /**
12
+     * Handle an incoming request.
13
+     *
14
+     * @param  \Illuminate\Http\Request  $request
15
+     * @param  \Closure  $next
16
+     * @param  string  ...$roles
17
+     * @return mixed
18
+     */
19
+    public function handle(Request $request, Closure $next, ...$roles)
20
+    {
21
+        // Periksa apakah pengguna sedang login
22
+        if (!$request->user()) {
23
+            abort(401, 'Unauthorized action.');
24
+        }
25
+
26
+        // Periksa apakah peran pengguna sesuai dengan yang diizinkan
27
+        if (!in_array($request->user()->role, $roles)) {
28
+            abort(403, 'Unauthorized action.');
29
+        }
30
+
31
+        return $next($request);
32
+    }
33
+}

+ 17
- 0
app/Http/Middleware/EncryptCookies.php Ver fichero

@@ -0,0 +1,17 @@
1
+<?php
2
+
3
+namespace App\Http\Middleware;
4
+
5
+use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
6
+
7
+class EncryptCookies extends Middleware
8
+{
9
+    /**
10
+     * The names of the cookies that should not be encrypted.
11
+     *
12
+     * @var array<int, string>
13
+     */
14
+    protected $except = [
15
+        //
16
+    ];
17
+}

+ 17
- 0
app/Http/Middleware/PreventRequestsDuringMaintenance.php Ver fichero

@@ -0,0 +1,17 @@
1
+<?php
2
+
3
+namespace App\Http\Middleware;
4
+
5
+use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;
6
+
7
+class PreventRequestsDuringMaintenance extends Middleware
8
+{
9
+    /**
10
+     * The URIs that should be reachable while maintenance mode is enabled.
11
+     *
12
+     * @var array<int, string>
13
+     */
14
+    protected $except = [
15
+        //
16
+    ];
17
+}

+ 30
- 0
app/Http/Middleware/RedirectIfAuthenticated.php Ver fichero

@@ -0,0 +1,30 @@
1
+<?php
2
+
3
+namespace App\Http\Middleware;
4
+
5
+use App\Providers\RouteServiceProvider;
6
+use Closure;
7
+use Illuminate\Http\Request;
8
+use Illuminate\Support\Facades\Auth;
9
+use Symfony\Component\HttpFoundation\Response;
10
+
11
+class RedirectIfAuthenticated
12
+{
13
+    /**
14
+     * Handle an incoming request.
15
+     *
16
+     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
17
+     */
18
+    public function handle(Request $request, Closure $next, string ...$guards): Response
19
+    {
20
+        $guards = empty($guards) ? [null] : $guards;
21
+
22
+        foreach ($guards as $guard) {
23
+            if (Auth::guard($guard)->check()) {
24
+                return redirect(RouteServiceProvider::HOME);
25
+            }
26
+        }
27
+
28
+        return $next($request);
29
+    }
30
+}

+ 19
- 0
app/Http/Middleware/TrimStrings.php Ver fichero

@@ -0,0 +1,19 @@
1
+<?php
2
+
3
+namespace App\Http\Middleware;
4
+
5
+use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
6
+
7
+class TrimStrings extends Middleware
8
+{
9
+    /**
10
+     * The names of the attributes that should not be trimmed.
11
+     *
12
+     * @var array<int, string>
13
+     */
14
+    protected $except = [
15
+        'current_password',
16
+        'password',
17
+        'password_confirmation',
18
+    ];
19
+}

+ 20
- 0
app/Http/Middleware/TrustHosts.php Ver fichero

@@ -0,0 +1,20 @@
1
+<?php
2
+
3
+namespace App\Http\Middleware;
4
+
5
+use Illuminate\Http\Middleware\TrustHosts as Middleware;
6
+
7
+class TrustHosts extends Middleware
8
+{
9
+    /**
10
+     * Get the host patterns that should be trusted.
11
+     *
12
+     * @return array<int, string|null>
13
+     */
14
+    public function hosts(): array
15
+    {
16
+        return [
17
+            $this->allSubdomainsOfApplicationUrl(),
18
+        ];
19
+    }
20
+}

+ 28
- 0
app/Http/Middleware/TrustProxies.php Ver fichero

@@ -0,0 +1,28 @@
1
+<?php
2
+
3
+namespace App\Http\Middleware;
4
+
5
+use Illuminate\Http\Middleware\TrustProxies as Middleware;
6
+use Illuminate\Http\Request;
7
+
8
+class TrustProxies extends Middleware
9
+{
10
+    /**
11
+     * The trusted proxies for this application.
12
+     *
13
+     * @var array<int, string>|string|null
14
+     */
15
+    protected $proxies;
16
+
17
+    /**
18
+     * The headers that should be used to detect proxies.
19
+     *
20
+     * @var int
21
+     */
22
+    protected $headers =
23
+        Request::HEADER_X_FORWARDED_FOR |
24
+        Request::HEADER_X_FORWARDED_HOST |
25
+        Request::HEADER_X_FORWARDED_PORT |
26
+        Request::HEADER_X_FORWARDED_PROTO |
27
+        Request::HEADER_X_FORWARDED_AWS_ELB;
28
+}

+ 22
- 0
app/Http/Middleware/ValidateSignature.php Ver fichero

@@ -0,0 +1,22 @@
1
+<?php
2
+
3
+namespace App\Http\Middleware;
4
+
5
+use Illuminate\Routing\Middleware\ValidateSignature as Middleware;
6
+
7
+class ValidateSignature extends Middleware
8
+{
9
+    /**
10
+     * The names of the query string parameters that should be ignored.
11
+     *
12
+     * @var array<int, string>
13
+     */
14
+    protected $except = [
15
+        // 'fbclid',
16
+        // 'utm_campaign',
17
+        // 'utm_content',
18
+        // 'utm_medium',
19
+        // 'utm_source',
20
+        // 'utm_term',
21
+    ];
22
+}

+ 17
- 0
app/Http/Middleware/VerifyCsrfToken.php Ver fichero

@@ -0,0 +1,17 @@
1
+<?php
2
+
3
+namespace App\Http\Middleware;
4
+
5
+use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
6
+
7
+class VerifyCsrfToken extends Middleware
8
+{
9
+    /**
10
+     * The URIs that should be excluded from CSRF verification.
11
+     *
12
+     * @var array<int, string>
13
+     */
14
+    protected $except = [
15
+        //
16
+    ];
17
+}

+ 85
- 0
app/Http/Requests/Auth/LoginRequest.php Ver fichero

@@ -0,0 +1,85 @@
1
+<?php
2
+
3
+namespace App\Http\Requests\Auth;
4
+
5
+use Illuminate\Auth\Events\Lockout;
6
+use Illuminate\Foundation\Http\FormRequest;
7
+use Illuminate\Support\Facades\Auth;
8
+use Illuminate\Support\Facades\RateLimiter;
9
+use Illuminate\Support\Str;
10
+use Illuminate\Validation\ValidationException;
11
+
12
+class LoginRequest extends FormRequest
13
+{
14
+    /**
15
+     * Determine if the user is authorized to make this request.
16
+     */
17
+    public function authorize(): bool
18
+    {
19
+        return true;
20
+    }
21
+
22
+    /**
23
+     * Get the validation rules that apply to the request.
24
+     *
25
+     * @return array<string, \Illuminate\Contracts\Validation\Rule|array|string>
26
+     */
27
+    public function rules(): array
28
+    {
29
+        return [
30
+            'email' => ['required', 'string', 'email'],
31
+            'password' => ['required', 'string'],
32
+        ];
33
+    }
34
+
35
+    /**
36
+     * Attempt to authenticate the request's credentials.
37
+     *
38
+     * @throws \Illuminate\Validation\ValidationException
39
+     */
40
+    public function authenticate(): void
41
+    {
42
+        $this->ensureIsNotRateLimited();
43
+
44
+        if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
45
+            RateLimiter::hit($this->throttleKey());
46
+
47
+            throw ValidationException::withMessages([
48
+                'email' => trans('auth.failed'),
49
+            ]);
50
+        }
51
+
52
+        RateLimiter::clear($this->throttleKey());
53
+    }
54
+
55
+    /**
56
+     * Ensure the login request is not rate limited.
57
+     *
58
+     * @throws \Illuminate\Validation\ValidationException
59
+     */
60
+    public function ensureIsNotRateLimited(): void
61
+    {
62
+        if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
63
+            return;
64
+        }
65
+
66
+        event(new Lockout($this));
67
+
68
+        $seconds = RateLimiter::availableIn($this->throttleKey());
69
+
70
+        throw ValidationException::withMessages([
71
+            'email' => trans('auth.throttle', [
72
+                'seconds' => $seconds,
73
+                'minutes' => ceil($seconds / 60),
74
+            ]),
75
+        ]);
76
+    }
77
+
78
+    /**
79
+     * Get the rate limiting throttle key for the request.
80
+     */
81
+    public function throttleKey(): string
82
+    {
83
+        return Str::transliterate(Str::lower($this->string('email')).'|'.$this->ip());
84
+    }
85
+}

+ 23
- 0
app/Http/Requests/ProfileUpdateRequest.php Ver fichero

@@ -0,0 +1,23 @@
1
+<?php
2
+
3
+namespace App\Http\Requests;
4
+
5
+use App\Models\User;
6
+use Illuminate\Foundation\Http\FormRequest;
7
+use Illuminate\Validation\Rule;
8
+
9
+class ProfileUpdateRequest extends FormRequest
10
+{
11
+    /**
12
+     * Get the validation rules that apply to the request.
13
+     *
14
+     * @return array<string, \Illuminate\Contracts\Validation\Rule|array|string>
15
+     */
16
+    public function rules(): array
17
+    {
18
+        return [
19
+            'name' => ['required', 'string', 'max:255'],
20
+            'email' => ['required', 'string', 'lowercase', 'email', 'max:255', Rule::unique(User::class)->ignore($this->user()->id)],
21
+        ];
22
+    }
23
+}

+ 58
- 0
app/Mail/ResetPasswordMail.php Ver fichero

@@ -0,0 +1,58 @@
1
+<?php
2
+
3
+namespace App\Mail;
4
+
5
+use Illuminate\Bus\Queueable;
6
+use Illuminate\Contracts\Queue\ShouldQueue;
7
+use Illuminate\Mail\Mailable;
8
+use Illuminate\Mail\Mailables\Content;
9
+use Illuminate\Mail\Mailables\Envelope;
10
+use Illuminate\Queue\SerializesModels;
11
+
12
+class ResetPasswordMail extends Mailable
13
+{
14
+        use Queueable, SerializesModels;
15
+
16
+        public $token;
17
+
18
+        public function __construct($token)
19
+        {
20
+            $this->token = $token;
21
+        }
22
+
23
+        public function build()
24
+        {
25
+            return $this->subject('Reset Password')->view('auth.reset_password', ['token' => $this->token]);
26
+        }
27
+
28
+
29
+    /**
30
+     * Get the message envelope.
31
+     */
32
+    public function envelope(): Envelope
33
+    {
34
+        return new Envelope(
35
+            subject: 'Reset Password Mail',
36
+        );
37
+    }
38
+
39
+    /**
40
+     * Get the message content definition.
41
+     */
42
+    public function content(): Content
43
+    {
44
+        return new Content(
45
+            view: 'auth.reset_password',
46
+        );
47
+    }
48
+
49
+    /**
50
+     * Get the attachments for the message.
51
+     *
52
+     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
53
+     */
54
+    public function attachments(): array
55
+    {
56
+        return [];
57
+    }
58
+}

+ 23
- 0
app/Models/Apresiasi.php Ver fichero

@@ -0,0 +1,23 @@
1
+<?php
2
+
3
+namespace App\Models;
4
+
5
+use Illuminate\Database\Eloquent\Factories\HasFactory;
6
+use Illuminate\Database\Eloquent\Model;
7
+
8
+class Apresiasi extends Model
9
+{
10
+    use HasFactory;
11
+    protected $fillable = [
12
+        'judul',
13
+        'user_id',
14
+        'deskripsi',
15
+        'lokasi',
16
+        'tanggal',
17
+        'foto',
18
+    ];
19
+
20
+    public function user() {
21
+        return $this->belongsTo(User::class);
22
+    }
23
+}

+ 16
- 0
app/Models/Informasi.php Ver fichero

@@ -0,0 +1,16 @@
1
+<?php
2
+
3
+namespace App\Models;
4
+
5
+use Illuminate\Database\Eloquent\Factories\HasFactory;
6
+use Illuminate\Database\Eloquent\Model;
7
+
8
+class Informasi extends Model
9
+{
10
+    use HasFactory;
11
+    protected $fillable = [
12
+        'judul',
13
+        'kategori',
14
+        'foto',
15
+    ];
16
+}

+ 17
- 0
app/Models/PasswordReset.php Ver fichero

@@ -0,0 +1,17 @@
1
+<?php
2
+
3
+namespace App\Models;
4
+
5
+use Illuminate\Database\Eloquent\Factories\HasFactory;
6
+use Illuminate\Database\Eloquent\Model;
7
+
8
+class PasswordReset extends Model
9
+{
10
+    protected $primaryKey = 'email'; // Menggunakan 'email' sebagai primary key
11
+
12
+    protected $fillable = [
13
+        'email', 'token'
14
+    ];
15
+
16
+    public $timestamps = false;
17
+}

+ 33
- 0
app/Models/Pelaporan.php Ver fichero

@@ -0,0 +1,33 @@
1
+<?php
2
+
3
+namespace App\Models;
4
+
5
+use Illuminate\Database\Eloquent\Factories\HasFactory;
6
+use Illuminate\Database\Eloquent\Model;
7
+
8
+class Pelaporan extends Model
9
+{
10
+    use HasFactory;
11
+    protected $fillable = [
12
+        'judul',
13
+        'keterangan',
14
+        'tanggal',
15
+        'lokasi',
16
+        'status',
17
+        'saran',
18
+        'foto',
19
+        'user_id',
20
+        'tindakan_id',
21
+    ];
22
+
23
+    public function tindakan(){
24
+        return $this->belongsTo(Tindakan::class,'tindakan_id');
25
+    }
26
+
27
+    public function user(){
28
+        return $this->belongsTo(User::class,'user_id');
29
+    }
30
+
31
+
32
+
33
+}

+ 15
- 0
app/Models/RiwayatLaporan.php Ver fichero

@@ -0,0 +1,15 @@
1
+<?php
2
+
3
+namespace App\Models;
4
+
5
+use Illuminate\Database\Eloquent\Factories\HasFactory;
6
+use Illuminate\Database\Eloquent\Model;
7
+
8
+class RiwayatLaporan extends Model
9
+{
10
+    use HasFactory;
11
+    protected $fillable = [
12
+       'email',
13
+       'token',
14
+    ];
15
+}

+ 11
- 0
app/Models/Session.php Ver fichero

@@ -0,0 +1,11 @@
1
+<?php
2
+
3
+namespace App\Models;
4
+
5
+use Illuminate\Database\Eloquent\Factories\HasFactory;
6
+use Illuminate\Database\Eloquent\Model;
7
+
8
+class Session extends Model
9
+{
10
+    use HasFactory;
11
+}

+ 18
- 0
app/Models/Tindakan.php Ver fichero

@@ -0,0 +1,18 @@
1
+<?php
2
+
3
+namespace App\Models;
4
+
5
+use Illuminate\Database\Eloquent\Factories\HasFactory;
6
+use Illuminate\Database\Eloquent\Model;
7
+
8
+class Tindakan extends Model
9
+{
10
+    use HasFactory;
11
+    protected $fillable = [
12
+        'statusTindakan'
13
+    ];
14
+
15
+    public function pelaporan(){
16
+        return $this->hasMany(Pelaporan::class);
17
+    }
18
+}

+ 61
- 0
app/Models/User.php Ver fichero

@@ -0,0 +1,61 @@
1
+<?php
2
+
3
+namespace App\Models;
4
+
5
+// use Illuminate\Contracts\Auth\MustVerifyEmail;
6
+
7
+use Illuminate\Auth\Passwords\CanResetPassword;
8
+use Illuminate\Database\Eloquent\Factories\HasFactory;
9
+use Illuminate\Foundation\Auth\User as Authenticatable;
10
+use Illuminate\Notifications\Notifiable;
11
+use Laravel\Sanctum\HasApiTokens;
12
+
13
+class User extends Authenticatable
14
+{
15
+    use HasApiTokens, HasFactory, Notifiable, CanResetPassword;
16
+
17
+    /**
18
+     * The attributes that are mass assignable.
19
+     *
20
+     * @var array<int, string>
21
+     */
22
+
23
+     public function hasRole($role)
24
+    {
25
+        return $this->role === $role;
26
+    }
27
+
28
+    protected $fillable = [
29
+        'name',
30
+        'email',
31
+        'password',
32
+        'role',
33
+        'foto',
34
+    ];
35
+
36
+    public function pelaporan(){
37
+        return $this->hasMany(Pelaporan::class);
38
+    }
39
+
40
+
41
+    /**
42
+     * The attributes that should be hidden for serialization.
43
+     *
44
+     * @var array<int, string>
45
+     */
46
+    protected $hidden = [
47
+        'password',
48
+        'remember_token',
49
+    ];
50
+
51
+    /**
52
+     * The attributes that should be cast.
53
+     *
54
+     * @var array<string, string>
55
+     */
56
+    protected $casts = [
57
+        'email_verified_at' => 'datetime',
58
+        'password' => 'hashed',
59
+    ];
60
+
61
+}

+ 24
- 0
app/Providers/AppServiceProvider.php Ver fichero

@@ -0,0 +1,24 @@
1
+<?php
2
+
3
+namespace App\Providers;
4
+
5
+use Illuminate\Support\ServiceProvider;
6
+
7
+class AppServiceProvider extends ServiceProvider
8
+{
9
+    /**
10
+     * Register any application services.
11
+     */
12
+    public function register(): void
13
+    {
14
+        //
15
+    }
16
+
17
+    /**
18
+     * Bootstrap any application services.
19
+     */
20
+    public function boot(): void
21
+    {
22
+        //
23
+    }
24
+}

+ 26
- 0
app/Providers/AuthServiceProvider.php Ver fichero

@@ -0,0 +1,26 @@
1
+<?php
2
+
3
+namespace App\Providers;
4
+
5
+// use Illuminate\Support\Facades\Gate;
6
+use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
7
+
8
+class AuthServiceProvider extends ServiceProvider
9
+{
10
+    /**
11
+     * The model to policy mappings for the application.
12
+     *
13
+     * @var array<class-string, class-string>
14
+     */
15
+    protected $policies = [
16
+        //
17
+    ];
18
+
19
+    /**
20
+     * Register any authentication / authorization services.
21
+     */
22
+    public function boot(): void
23
+    {
24
+        //
25
+    }
26
+}

+ 19
- 0
app/Providers/BroadcastServiceProvider.php Ver fichero

@@ -0,0 +1,19 @@
1
+<?php
2
+
3
+namespace App\Providers;
4
+
5
+use Illuminate\Support\Facades\Broadcast;
6
+use Illuminate\Support\ServiceProvider;
7
+
8
+class BroadcastServiceProvider extends ServiceProvider
9
+{
10
+    /**
11
+     * Bootstrap any application services.
12
+     */
13
+    public function boot(): void
14
+    {
15
+        Broadcast::routes();
16
+
17
+        require base_path('routes/channels.php');
18
+    }
19
+}

+ 38
- 0
app/Providers/EventServiceProvider.php Ver fichero

@@ -0,0 +1,38 @@
1
+<?php
2
+
3
+namespace App\Providers;
4
+
5
+use Illuminate\Auth\Events\Registered;
6
+use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
7
+use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
8
+use Illuminate\Support\Facades\Event;
9
+
10
+class EventServiceProvider extends ServiceProvider
11
+{
12
+    /**
13
+     * The event to listener mappings for the application.
14
+     *
15
+     * @var array<class-string, array<int, class-string>>
16
+     */
17
+    protected $listen = [
18
+        Registered::class => [
19
+            SendEmailVerificationNotification::class,
20
+        ],
21
+    ];
22
+
23
+    /**
24
+     * Register any events for your application.
25
+     */
26
+    public function boot(): void
27
+    {
28
+        //
29
+    }
30
+
31
+    /**
32
+     * Determine if events and listeners should be automatically discovered.
33
+     */
34
+    public function shouldDiscoverEvents(): bool
35
+    {
36
+        return false;
37
+    }
38
+}

+ 40
- 0
app/Providers/RouteServiceProvider.php Ver fichero

@@ -0,0 +1,40 @@
1
+<?php
2
+
3
+namespace App\Providers;
4
+
5
+use Illuminate\Cache\RateLimiting\Limit;
6
+use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
7
+use Illuminate\Http\Request;
8
+use Illuminate\Support\Facades\RateLimiter;
9
+use Illuminate\Support\Facades\Route;
10
+
11
+class RouteServiceProvider extends ServiceProvider
12
+{
13
+    /**
14
+     * The path to your application's "home" route.
15
+     *
16
+     * Typically, users are redirected here after authentication.
17
+     *
18
+     * @var string
19
+     */
20
+    public const HOME = '/home';
21
+
22
+    /**
23
+     * Define your route model bindings, pattern filters, and other route configuration.
24
+     */
25
+    public function boot(): void
26
+    {
27
+        RateLimiter::for('api', function (Request $request) {
28
+            return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
29
+        });
30
+
31
+        $this->routes(function () {
32
+            Route::middleware('api')
33
+                ->prefix('api')
34
+                ->group(base_path('routes/api.php'));
35
+
36
+            Route::middleware('web')
37
+                ->group(base_path('routes/web.php'));
38
+        });
39
+    }
40
+}

+ 17
- 0
app/View/Components/AppLayout.php Ver fichero

@@ -0,0 +1,17 @@
1
+<?php
2
+
3
+namespace App\View\Components;
4
+
5
+use Illuminate\View\Component;
6
+use Illuminate\View\View;
7
+
8
+class AppLayout extends Component
9
+{
10
+    /**
11
+     * Get the view / contents that represents the component.
12
+     */
13
+    public function render(): View
14
+    {
15
+        return view('layouts.app');
16
+    }
17
+}

+ 17
- 0
app/View/Components/GuestLayout.php Ver fichero

@@ -0,0 +1,17 @@
1
+<?php
2
+
3
+namespace App\View\Components;
4
+
5
+use Illuminate\View\Component;
6
+use Illuminate\View\View;
7
+
8
+class GuestLayout extends Component
9
+{
10
+    /**
11
+     * Get the view / contents that represents the component.
12
+     */
13
+    public function render(): View
14
+    {
15
+        return view('layouts.guest');
16
+    }
17
+}

+ 53
- 0
artisan Ver fichero

@@ -0,0 +1,53 @@
1
+#!/usr/bin/env php
2
+<?php
3
+
4
+define('LARAVEL_START', microtime(true));
5
+
6
+/*
7
+|--------------------------------------------------------------------------
8
+| Register The Auto Loader
9
+|--------------------------------------------------------------------------
10
+|
11
+| Composer provides a convenient, automatically generated class loader
12
+| for our application. We just need to utilize it! We'll require it
13
+| into the script here so that we do not have to worry about the
14
+| loading of any of our classes manually. It's great to relax.
15
+|
16
+*/
17
+
18
+require __DIR__.'/vendor/autoload.php';
19
+
20
+$app = require_once __DIR__.'/bootstrap/app.php';
21
+
22
+/*
23
+|--------------------------------------------------------------------------
24
+| Run The Artisan Application
25
+|--------------------------------------------------------------------------
26
+|
27
+| When we run the console application, the current CLI command will be
28
+| executed in this console and the response sent back to a terminal
29
+| or another output device for the developers. Here goes nothing!
30
+|
31
+*/
32
+
33
+$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
34
+
35
+$status = $kernel->handle(
36
+    $input = new Symfony\Component\Console\Input\ArgvInput,
37
+    new Symfony\Component\Console\Output\ConsoleOutput
38
+);
39
+
40
+/*
41
+|--------------------------------------------------------------------------
42
+| Shutdown The Application
43
+|--------------------------------------------------------------------------
44
+|
45
+| Once Artisan has finished running, we will fire off the shutdown events
46
+| so that any final work may be done by the application before we shut
47
+| down the process. This is the last thing to happen to the request.
48
+|
49
+*/
50
+
51
+$kernel->terminate($input, $status);
52
+
53
+exit($status);

+ 56
- 0
bootstrap/app.php Ver fichero

@@ -0,0 +1,56 @@
1
+<?php
2
+
3
+/*
4
+|--------------------------------------------------------------------------
5
+| Create The Application
6
+|--------------------------------------------------------------------------
7
+|
8
+| The first thing we will do is create a new Laravel application instance
9
+| which serves as the "glue" for all the components of Laravel, and is
10
+| the IoC container for the system binding all of the various parts.
11
+|
12
+*/
13
+
14
+$app = new Illuminate\Foundation\Application(
15
+    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
16
+);
17
+
18
+/*
19
+|--------------------------------------------------------------------------
20
+| Bind Important Interfaces
21
+|--------------------------------------------------------------------------
22
+|
23
+| Next, we need to bind some important interfaces into the container so
24
+| we will be able to resolve them when needed. The kernels serve the
25
+| incoming requests to this application from both the web and CLI.
26
+|
27
+*/
28
+
29
+$app->singleton(
30
+    Illuminate\Contracts\Http\Kernel::class,
31
+    App\Http\Kernel::class
32
+);
33
+
34
+$app->singleton(
35
+    Illuminate\Contracts\Console\Kernel::class,
36
+    App\Console\Kernel::class
37
+);
38
+
39
+$app->singleton(
40
+    Illuminate\Contracts\Debug\ExceptionHandler::class,
41
+    App\Exceptions\Handler::class
42
+);
43
+
44
+
45
+/*
46
+|--------------------------------------------------------------------------
47
+| Return The Application
48
+|--------------------------------------------------------------------------
49
+|
50
+| This script returns the application instance. The instance is given to
51
+| the calling script so we can separate the building of the instances
52
+| from the actual running of the application and sending responses.
53
+|
54
+*/
55
+
56
+return $app;

+ 2
- 0
bootstrap/cache/.gitignore Ver fichero

@@ -0,0 +1,2 @@
1
+*
2
+!.gitignore

+ 68
- 0
composer.json Ver fichero

@@ -0,0 +1,68 @@
1
+{
2
+    "name": "laravel/laravel",
3
+    "type": "project",
4
+    "description": "The skeleton application for the Laravel framework.",
5
+    "keywords": ["laravel", "framework"],
6
+    "license": "MIT",
7
+    "require": {
8
+        "php": "^8.1",
9
+        "barryvdh/laravel-dompdf": "^2.1",
10
+        "guzzlehttp/guzzle": "^7.2",
11
+        "laravel/framework": "^10.10",
12
+        "laravel/sanctum": "^3.3",
13
+        "laravel/tinker": "^2.8",
14
+        "realrashid/sweet-alert": "^7.1"
15
+    },
16
+    "require-dev": {
17
+        "fakerphp/faker": "^1.9.1",
18
+        "laravel/pint": "^1.0",
19
+        "laravel/sail": "^1.18",
20
+        "mockery/mockery": "^1.4.4",
21
+        "nunomaduro/collision": "^7.0",
22
+        "phpunit/phpunit": "^10.1",
23
+        "spatie/laravel-ignition": "^2.0"
24
+    },
25
+    "autoload": {
26
+        "psr-4": {
27
+            "App\\": "app/",
28
+            "Database\\Factories\\": "database/factories/",
29
+            "Database\\Seeders\\": "database/seeders/"
30
+        }
31
+    },
32
+    "autoload-dev": {
33
+        "psr-4": {
34
+            "Tests\\": "tests/"
35
+        }
36
+    },
37
+    "scripts": {
38
+        "post-autoload-dump": [
39
+            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
40
+            "@php artisan package:discover --ansi"
41
+        ],
42
+        "post-update-cmd": [
43
+            "@php artisan vendor:publish --tag=laravel-assets --ansi --force"
44
+        ],
45
+        "post-root-package-install": [
46
+            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
47
+        ],
48
+        "post-create-project-cmd": [
49
+            "@php artisan key:generate --ansi"
50
+        ]
51
+    },
52
+    "extra": {
53
+        "laravel": {
54
+            "dont-discover": []
55
+        }
56
+    },
57
+    "config": {
58
+        "optimize-autoloader": true,
59
+        "preferred-install": "dist",
60
+        "sort-packages": true,
61
+        "allow-plugins": {
62
+            "pestphp/pest-plugin": true,
63
+            "php-http/discovery": true
64
+        }
65
+    },
66
+    "minimum-stability": "stable",
67
+    "prefer-stable": true
68
+}

+ 8587
- 0
composer.lock
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 193
- 0
config/app.php Ver fichero

@@ -0,0 +1,193 @@
1
+<?php
2
+
3
+use Illuminate\Support\Facades\Facade;
4
+use Illuminate\Support\ServiceProvider;
5
+
6
+return [
7
+
8
+    /*
9
+    |--------------------------------------------------------------------------
10
+    | Application Name
11
+    |--------------------------------------------------------------------------
12
+    |
13
+    | This value is the name of your application. This value is used when the
14
+    | framework needs to place the application's name in a notification or
15
+    | any other location as required by the application or its packages.
16
+    |
17
+    */
18
+
19
+    'name' => env('APP_NAME', 'Laravel'),
20
+
21
+    /*
22
+    |--------------------------------------------------------------------------
23
+    | Application Environment
24
+    |--------------------------------------------------------------------------
25
+    |
26
+    | This value determines the "environment" your application is currently
27
+    | running in. This may determine how you prefer to configure various
28
+    | services the application utilizes. Set this in your ".env" file.
29
+    |
30
+    */
31
+
32
+    'env' => env('APP_ENV', 'production'),
33
+
34
+    /*
35
+    |--------------------------------------------------------------------------
36
+    | Application Debug Mode
37
+    |--------------------------------------------------------------------------
38
+    |
39
+    | When your application is in debug mode, detailed error messages with
40
+    | stack traces will be shown on every error that occurs within your
41
+    | application. If disabled, a simple generic error page is shown.
42
+    |
43
+    */
44
+
45
+    'debug' => (bool) env('APP_DEBUG', false),
46
+
47
+    /*
48
+    |--------------------------------------------------------------------------
49
+    | Application URL
50
+    |--------------------------------------------------------------------------
51
+    |
52
+    | This URL is used by the console to properly generate URLs when using
53
+    | the Artisan command line tool. You should set this to the root of
54
+    | your application so that it is used when running Artisan tasks.
55
+    |
56
+    */
57
+
58
+    'url' => env('APP_URL', 'http://localhost'),
59
+
60
+    'asset_url' => env('ASSET_URL'),
61
+
62
+    /*
63
+    |--------------------------------------------------------------------------
64
+    | Application Timezone
65
+    |--------------------------------------------------------------------------
66
+    |
67
+    | Here you may specify the default timezone for your application, which
68
+    | will be used by the PHP date and date-time functions. We have gone
69
+    | ahead and set this to a sensible default for you out of the box.
70
+    |
71
+    */
72
+
73
+    'timezone' => 'UTC',
74
+
75
+    /*
76
+    |--------------------------------------------------------------------------
77
+    | Application Locale Configuration
78
+    |--------------------------------------------------------------------------
79
+    |
80
+    | The application locale determines the default locale that will be used
81
+    | by the translation service provider. You are free to set this value
82
+    | to any of the locales which will be supported by the application.
83
+    |
84
+    */
85
+
86
+    'locale' => 'en',
87
+
88
+    /*
89
+    |--------------------------------------------------------------------------
90
+    | Application Fallback Locale
91
+    |--------------------------------------------------------------------------
92
+    |
93
+    | The fallback locale determines the locale to use when the current one
94
+    | is not available. You may change the value to correspond to any of
95
+    | the language folders that are provided through your application.
96
+    |
97
+    */
98
+
99
+    'fallback_locale' => 'en',
100
+
101
+    /*
102
+    |--------------------------------------------------------------------------
103
+    | Faker Locale
104
+    |--------------------------------------------------------------------------
105
+    |
106
+    | This locale will be used by the Faker PHP library when generating fake
107
+    | data for your database seeds. For example, this will be used to get
108
+    | localized telephone numbers, street address information and more.
109
+    |
110
+    */
111
+
112
+    'faker_locale' => 'en_US',
113
+
114
+    /*
115
+    |--------------------------------------------------------------------------
116
+    | Encryption Key
117
+    |--------------------------------------------------------------------------
118
+    |
119
+    | This key is used by the Illuminate encrypter service and should be set
120
+    | to a random, 32 character string, otherwise these encrypted strings
121
+    | will not be safe. Please do this before deploying an application!
122
+    |
123
+    */
124
+
125
+    'key' => env('APP_KEY'),
126
+
127
+    'cipher' => 'AES-256-CBC',
128
+
129
+    /*
130
+    |--------------------------------------------------------------------------
131
+    | Maintenance Mode Driver
132
+    |--------------------------------------------------------------------------
133
+    |
134
+    | These configuration options determine the driver used to determine and
135
+    | manage Laravel's "maintenance mode" status. The "cache" driver will
136
+    | allow maintenance mode to be controlled across multiple machines.
137
+    |
138
+    | Supported drivers: "file", "cache"
139
+    |
140
+    */
141
+
142
+    'maintenance' => [
143
+        'driver' => 'file',
144
+        // 'store' => 'redis',
145
+    ],
146
+
147
+    /*
148
+    |--------------------------------------------------------------------------
149
+    | Autoloaded Service Providers
150
+    |--------------------------------------------------------------------------
151
+    |
152
+    | The service providers listed here will be automatically loaded on the
153
+    | request to your application. Feel free to add your own services to
154
+    | this array to grant expanded functionality to your applications.
155
+    |
156
+    */
157
+
158
+    'providers' => ServiceProvider::defaultProviders()->merge([
159
+        /*
160
+         * Package Service Providers...
161
+         */
162
+
163
+        /*
164
+         * Application Service Providers...
165
+         */
166
+        App\Providers\AppServiceProvider::class,
167
+        App\Providers\AuthServiceProvider::class,
168
+        // App\Providers\BroadcastServiceProvider::class,
169
+        App\Providers\EventServiceProvider::class,
170
+        App\Providers\RouteServiceProvider::class,
171
+        RealRashid\SweetAlert\SweetAlertServiceProvider::class,
172
+        Barryvdh\DomPDF\ServiceProvider::class,
173
+
174
+    ])->toArray(),
175
+
176
+    /*
177
+    |--------------------------------------------------------------------------
178
+    | Class Aliases
179
+    |--------------------------------------------------------------------------
180
+    |
181
+    | This array of class aliases will be registered when this application
182
+    | is started. However, feel free to register as many as you wish as
183
+    | the aliases are "lazy" loaded so they don't hinder performance.
184
+    |
185
+    */
186
+
187
+    'aliases' => Facade::defaultAliases()->merge([
188
+        // 'Example' => App\Facades\Example::class,
189
+        'Alert' => RealRashid\SweetAlert\Facades\Alert::class,
190
+        
191
+    ])->toArray(),
192
+
193
+];

+ 115
- 0
config/auth.php Ver fichero

@@ -0,0 +1,115 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Authentication Defaults
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | This option controls the default authentication "guard" and password
11
+    | reset options for your application. You may change these defaults
12
+    | as required, but they're a perfect start for most applications.
13
+    |
14
+    */
15
+
16
+    'defaults' => [
17
+        'guard' => 'web',
18
+        'passwords' => 'users',
19
+    ],
20
+
21
+    /*
22
+    |--------------------------------------------------------------------------
23
+    | Authentication Guards
24
+    |--------------------------------------------------------------------------
25
+    |
26
+    | Next, you may define every authentication guard for your application.
27
+    | Of course, a great default configuration has been defined for you
28
+    | here which uses session storage and the Eloquent user provider.
29
+    |
30
+    | All authentication drivers have a user provider. This defines how the
31
+    | users are actually retrieved out of your database or other storage
32
+    | mechanisms used by this application to persist your user's data.
33
+    |
34
+    | Supported: "session"
35
+    |
36
+    */
37
+
38
+    'guards' => [
39
+        'web' => [
40
+            'driver' => 'session',
41
+            'provider' => 'users',
42
+        ],
43
+    ],
44
+
45
+    /*
46
+    |--------------------------------------------------------------------------
47
+    | User Providers
48
+    |--------------------------------------------------------------------------
49
+    |
50
+    | All authentication drivers have a user provider. This defines how the
51
+    | users are actually retrieved out of your database or other storage
52
+    | mechanisms used by this application to persist your user's data.
53
+    |
54
+    | If you have multiple user tables or models you may configure multiple
55
+    | sources which represent each model / table. These sources may then
56
+    | be assigned to any extra authentication guards you have defined.
57
+    |
58
+    | Supported: "database", "eloquent"
59
+    |
60
+    */
61
+
62
+    'providers' => [
63
+        'users' => [
64
+            'driver' => 'eloquent',
65
+            'model' => App\Models\User::class,
66
+        ],
67
+
68
+        // 'users' => [
69
+        //     'driver' => 'database',
70
+        //     'table' => 'users',
71
+        // ],
72
+    ],
73
+
74
+    /*
75
+    |--------------------------------------------------------------------------
76
+    | Resetting Passwords
77
+    |--------------------------------------------------------------------------
78
+    |
79
+    | You may specify multiple password reset configurations if you have more
80
+    | than one user table or model in the application and you want to have
81
+    | separate password reset settings based on the specific user types.
82
+    |
83
+    | The expiry time is the number of minutes that each reset token will be
84
+    | considered valid. This security feature keeps tokens short-lived so
85
+    | they have less time to be guessed. You may change this as needed.
86
+    |
87
+    | The throttle setting is the number of seconds a user must wait before
88
+    | generating more password reset tokens. This prevents the user from
89
+    | quickly generating a very large amount of password reset tokens.
90
+    |
91
+    */
92
+
93
+    'passwords' => [
94
+        'users' => [
95
+            'provider' => 'users',
96
+            'table' => 'password_reset_tokens',
97
+            'expire' => 60,
98
+            'throttle' => 60,
99
+        ],
100
+    ],
101
+
102
+    /*
103
+    |--------------------------------------------------------------------------
104
+    | Password Confirmation Timeout
105
+    |--------------------------------------------------------------------------
106
+    |
107
+    | Here you may define the amount of seconds before a password confirmation
108
+    | times out and the user is prompted to re-enter their password via the
109
+    | confirmation screen. By default, the timeout lasts for three hours.
110
+    |
111
+    */
112
+
113
+    'password_timeout' => 10800,
114
+
115
+];

+ 71
- 0
config/broadcasting.php Ver fichero

@@ -0,0 +1,71 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Default Broadcaster
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | This option controls the default broadcaster that will be used by the
11
+    | framework when an event needs to be broadcast. You may set this to
12
+    | any of the connections defined in the "connections" array below.
13
+    |
14
+    | Supported: "pusher", "ably", "redis", "log", "null"
15
+    |
16
+    */
17
+
18
+    'default' => env('BROADCAST_DRIVER', 'null'),
19
+
20
+    /*
21
+    |--------------------------------------------------------------------------
22
+    | Broadcast Connections
23
+    |--------------------------------------------------------------------------
24
+    |
25
+    | Here you may define all of the broadcast connections that will be used
26
+    | to broadcast events to other systems or over websockets. Samples of
27
+    | each available type of connection are provided inside this array.
28
+    |
29
+    */
30
+
31
+    'connections' => [
32
+
33
+        'pusher' => [
34
+            'driver' => 'pusher',
35
+            'key' => env('PUSHER_APP_KEY'),
36
+            'secret' => env('PUSHER_APP_SECRET'),
37
+            'app_id' => env('PUSHER_APP_ID'),
38
+            'options' => [
39
+                'cluster' => env('PUSHER_APP_CLUSTER'),
40
+                'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',
41
+                'port' => env('PUSHER_PORT', 443),
42
+                'scheme' => env('PUSHER_SCHEME', 'https'),
43
+                'encrypted' => true,
44
+                'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
45
+            ],
46
+            'client_options' => [
47
+                // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
48
+            ],
49
+        ],
50
+
51
+        'ably' => [
52
+            'driver' => 'ably',
53
+            'key' => env('ABLY_KEY'),
54
+        ],
55
+
56
+        'redis' => [
57
+            'driver' => 'redis',
58
+            'connection' => 'default',
59
+        ],
60
+
61
+        'log' => [
62
+            'driver' => 'log',
63
+        ],
64
+
65
+        'null' => [
66
+            'driver' => 'null',
67
+        ],
68
+
69
+    ],
70
+
71
+];

+ 111
- 0
config/cache.php Ver fichero

@@ -0,0 +1,111 @@
1
+<?php
2
+
3
+use Illuminate\Support\Str;
4
+
5
+return [
6
+
7
+    /*
8
+    |--------------------------------------------------------------------------
9
+    | Default Cache Store
10
+    |--------------------------------------------------------------------------
11
+    |
12
+    | This option controls the default cache connection that gets used while
13
+    | using this caching library. This connection is used when another is
14
+    | not explicitly specified when executing a given caching function.
15
+    |
16
+    */
17
+
18
+    'default' => env('CACHE_DRIVER', 'file'),
19
+
20
+    /*
21
+    |--------------------------------------------------------------------------
22
+    | Cache Stores
23
+    |--------------------------------------------------------------------------
24
+    |
25
+    | Here you may define all of the cache "stores" for your application as
26
+    | well as their drivers. You may even define multiple stores for the
27
+    | same cache driver to group types of items stored in your caches.
28
+    |
29
+    | Supported drivers: "apc", "array", "database", "file",
30
+    |         "memcached", "redis", "dynamodb", "octane", "null"
31
+    |
32
+    */
33
+
34
+    'stores' => [
35
+
36
+        'apc' => [
37
+            'driver' => 'apc',
38
+        ],
39
+
40
+        'array' => [
41
+            'driver' => 'array',
42
+            'serialize' => false,
43
+        ],
44
+
45
+        'database' => [
46
+            'driver' => 'database',
47
+            'table' => 'cache',
48
+            'connection' => null,
49
+            'lock_connection' => null,
50
+        ],
51
+
52
+        'file' => [
53
+            'driver' => 'file',
54
+            'path' => storage_path('framework/cache/data'),
55
+            'lock_path' => storage_path('framework/cache/data'),
56
+        ],
57
+
58
+        'memcached' => [
59
+            'driver' => 'memcached',
60
+            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
61
+            'sasl' => [
62
+                env('MEMCACHED_USERNAME'),
63
+                env('MEMCACHED_PASSWORD'),
64
+            ],
65
+            'options' => [
66
+                // Memcached::OPT_CONNECT_TIMEOUT => 2000,
67
+            ],
68
+            'servers' => [
69
+                [
70
+                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
71
+                    'port' => env('MEMCACHED_PORT', 11211),
72
+                    'weight' => 100,
73
+                ],
74
+            ],
75
+        ],
76
+
77
+        'redis' => [
78
+            'driver' => 'redis',
79
+            'connection' => 'cache',
80
+            'lock_connection' => 'default',
81
+        ],
82
+
83
+        'dynamodb' => [
84
+            'driver' => 'dynamodb',
85
+            'key' => env('AWS_ACCESS_KEY_ID'),
86
+            'secret' => env('AWS_SECRET_ACCESS_KEY'),
87
+            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
88
+            'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
89
+            'endpoint' => env('DYNAMODB_ENDPOINT'),
90
+        ],
91
+
92
+        'octane' => [
93
+            'driver' => 'octane',
94
+        ],
95
+
96
+    ],
97
+
98
+    /*
99
+    |--------------------------------------------------------------------------
100
+    | Cache Key Prefix
101
+    |--------------------------------------------------------------------------
102
+    |
103
+    | When utilizing the APC, database, memcached, Redis, or DynamoDB cache
104
+    | stores there might be other applications using the same cache. For
105
+    | that reason, you may prefix every cache key to avoid collisions.
106
+    |
107
+    */
108
+
109
+    'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'),
110
+
111
+];

+ 34
- 0
config/cors.php Ver fichero

@@ -0,0 +1,34 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Cross-Origin Resource Sharing (CORS) Configuration
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | Here you may configure your settings for cross-origin resource sharing
11
+    | or "CORS". This determines what cross-origin operations may execute
12
+    | in web browsers. You are free to adjust these settings as needed.
13
+    |
14
+    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
15
+    |
16
+    */
17
+
18
+    'paths' => ['api/*', 'sanctum/csrf-cookie'],
19
+
20
+    'allowed_methods' => ['*'],
21
+
22
+    'allowed_origins' => ['*'],
23
+
24
+    'allowed_origins_patterns' => [],
25
+
26
+    'allowed_headers' => ['*'],
27
+
28
+    'exposed_headers' => [],
29
+
30
+    'max_age' => 0,
31
+
32
+    'supports_credentials' => false,
33
+
34
+];

+ 151
- 0
config/database.php Ver fichero

@@ -0,0 +1,151 @@
1
+<?php
2
+
3
+use Illuminate\Support\Str;
4
+
5
+return [
6
+
7
+    /*
8
+    |--------------------------------------------------------------------------
9
+    | Default Database Connection Name
10
+    |--------------------------------------------------------------------------
11
+    |
12
+    | Here you may specify which of the database connections below you wish
13
+    | to use as your default connection for all database work. Of course
14
+    | you may use many connections at once using the Database library.
15
+    |
16
+    */
17
+
18
+    'default' => env('DB_CONNECTION', 'mysql'),
19
+
20
+    /*
21
+    |--------------------------------------------------------------------------
22
+    | Database Connections
23
+    |--------------------------------------------------------------------------
24
+    |
25
+    | Here are each of the database connections setup for your application.
26
+    | Of course, examples of configuring each database platform that is
27
+    | supported by Laravel is shown below to make development simple.
28
+    |
29
+    |
30
+    | All database work in Laravel is done through the PHP PDO facilities
31
+    | so make sure you have the driver for your particular database of
32
+    | choice installed on your machine before you begin development.
33
+    |
34
+    */
35
+
36
+    'connections' => [
37
+
38
+        'sqlite' => [
39
+            'driver' => 'sqlite',
40
+            'url' => env('DATABASE_URL'),
41
+            'database' => env('DB_DATABASE', database_path('database.sqlite')),
42
+            'prefix' => '',
43
+            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
44
+        ],
45
+
46
+        'mysql' => [
47
+            'driver' => 'mysql',
48
+            'url' => env('DATABASE_URL'),
49
+            'host' => env('DB_HOST', '127.0.0.1'),
50
+            'port' => env('DB_PORT', '3306'),
51
+            'database' => env('DB_DATABASE', 'forge'),
52
+            'username' => env('DB_USERNAME', 'forge'),
53
+            'password' => env('DB_PASSWORD', ''),
54
+            'unix_socket' => env('DB_SOCKET', ''),
55
+            'charset' => 'utf8mb4',
56
+            'collation' => 'utf8mb4_unicode_ci',
57
+            'prefix' => '',
58
+            'prefix_indexes' => true,
59
+            'strict' => true,
60
+            'engine' => null,
61
+            'options' => extension_loaded('pdo_mysql') ? array_filter([
62
+                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
63
+            ]) : [],
64
+        ],
65
+
66
+        'pgsql' => [
67
+            'driver' => 'pgsql',
68
+            'url' => env('DATABASE_URL'),
69
+            'host' => env('DB_HOST', '127.0.0.1'),
70
+            'port' => env('DB_PORT', '5432'),
71
+            'database' => env('DB_DATABASE', 'forge'),
72
+            'username' => env('DB_USERNAME', 'forge'),
73
+            'password' => env('DB_PASSWORD', ''),
74
+            'charset' => 'utf8',
75
+            'prefix' => '',
76
+            'prefix_indexes' => true,
77
+            'search_path' => 'public',
78
+            'sslmode' => 'prefer',
79
+        ],
80
+
81
+        'sqlsrv' => [
82
+            'driver' => 'sqlsrv',
83
+            'url' => env('DATABASE_URL'),
84
+            'host' => env('DB_HOST', 'localhost'),
85
+            'port' => env('DB_PORT', '1433'),
86
+            'database' => env('DB_DATABASE', 'forge'),
87
+            'username' => env('DB_USERNAME', 'forge'),
88
+            'password' => env('DB_PASSWORD', ''),
89
+            'charset' => 'utf8',
90
+            'prefix' => '',
91
+            'prefix_indexes' => true,
92
+            // 'encrypt' => env('DB_ENCRYPT', 'yes'),
93
+            // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),
94
+        ],
95
+
96
+    ],
97
+
98
+    /*
99
+    |--------------------------------------------------------------------------
100
+    | Migration Repository Table
101
+    |--------------------------------------------------------------------------
102
+    |
103
+    | This table keeps track of all the migrations that have already run for
104
+    | your application. Using this information, we can determine which of
105
+    | the migrations on disk haven't actually been run in the database.
106
+    |
107
+    */
108
+
109
+    'migrations' => 'migrations',
110
+
111
+    /*
112
+    |--------------------------------------------------------------------------
113
+    | Redis Databases
114
+    |--------------------------------------------------------------------------
115
+    |
116
+    | Redis is an open source, fast, and advanced key-value store that also
117
+    | provides a richer body of commands than a typical key-value system
118
+    | such as APC or Memcached. Laravel makes it easy to dig right in.
119
+    |
120
+    */
121
+
122
+    'redis' => [
123
+
124
+        'client' => env('REDIS_CLIENT', 'phpredis'),
125
+
126
+        'options' => [
127
+            'cluster' => env('REDIS_CLUSTER', 'redis'),
128
+            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
129
+        ],
130
+
131
+        'default' => [
132
+            'url' => env('REDIS_URL'),
133
+            'host' => env('REDIS_HOST', '127.0.0.1'),
134
+            'username' => env('REDIS_USERNAME'),
135
+            'password' => env('REDIS_PASSWORD'),
136
+            'port' => env('REDIS_PORT', '6379'),
137
+            'database' => env('REDIS_DB', '0'),
138
+        ],
139
+
140
+        'cache' => [
141
+            'url' => env('REDIS_URL'),
142
+            'host' => env('REDIS_HOST', '127.0.0.1'),
143
+            'username' => env('REDIS_USERNAME'),
144
+            'password' => env('REDIS_PASSWORD'),
145
+            'port' => env('REDIS_PORT', '6379'),
146
+            'database' => env('REDIS_CACHE_DB', '1'),
147
+        ],
148
+
149
+    ],
150
+
151
+];

+ 76
- 0
config/filesystems.php Ver fichero

@@ -0,0 +1,76 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Default Filesystem Disk
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | Here you may specify the default filesystem disk that should be used
11
+    | by the framework. The "local" disk, as well as a variety of cloud
12
+    | based disks are available to your application. Just store away!
13
+    |
14
+    */
15
+
16
+    'default' => env('FILESYSTEM_DISK', 'local'),
17
+
18
+    /*
19
+    |--------------------------------------------------------------------------
20
+    | Filesystem Disks
21
+    |--------------------------------------------------------------------------
22
+    |
23
+    | Here you may configure as many filesystem "disks" as you wish, and you
24
+    | may even configure multiple disks of the same driver. Defaults have
25
+    | been set up for each driver as an example of the required values.
26
+    |
27
+    | Supported Drivers: "local", "ftp", "sftp", "s3"
28
+    |
29
+    */
30
+
31
+    'disks' => [
32
+
33
+        'local' => [
34
+            'driver' => 'local',
35
+            'root' => storage_path('app'),
36
+            'throw' => false,
37
+        ],
38
+
39
+        'public' => [
40
+            'driver' => 'local',
41
+            'root' => storage_path('app/public'),
42
+            'url' => env('APP_URL').'/storage',
43
+            'visibility' => 'public',
44
+            'throw' => false,
45
+        ],
46
+
47
+        's3' => [
48
+            'driver' => 's3',
49
+            'key' => env('AWS_ACCESS_KEY_ID'),
50
+            'secret' => env('AWS_SECRET_ACCESS_KEY'),
51
+            'region' => env('AWS_DEFAULT_REGION'),
52
+            'bucket' => env('AWS_BUCKET'),
53
+            'url' => env('AWS_URL'),
54
+            'endpoint' => env('AWS_ENDPOINT'),
55
+            'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
56
+            'throw' => false,
57
+        ],
58
+
59
+    ],
60
+
61
+    /*
62
+    |--------------------------------------------------------------------------
63
+    | Symbolic Links
64
+    |--------------------------------------------------------------------------
65
+    |
66
+    | Here you may configure the symbolic links that will be created when the
67
+    | `storage:link` Artisan command is executed. The array keys should be
68
+    | the locations of the links and the values should be their targets.
69
+    |
70
+    */
71
+
72
+    'links' => [
73
+        public_path('storage') => storage_path('app/public'),
74
+    ],
75
+
76
+];

+ 54
- 0
config/hashing.php Ver fichero

@@ -0,0 +1,54 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Default Hash Driver
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | This option controls the default hash driver that will be used to hash
11
+    | passwords for your application. By default, the bcrypt algorithm is
12
+    | used; however, you remain free to modify this option if you wish.
13
+    |
14
+    | Supported: "bcrypt", "argon", "argon2id"
15
+    |
16
+    */
17
+
18
+    'driver' => 'bcrypt',
19
+
20
+    /*
21
+    |--------------------------------------------------------------------------
22
+    | Bcrypt Options
23
+    |--------------------------------------------------------------------------
24
+    |
25
+    | Here you may specify the configuration options that should be used when
26
+    | passwords are hashed using the Bcrypt algorithm. This will allow you
27
+    | to control the amount of time it takes to hash the given password.
28
+    |
29
+    */
30
+
31
+    'bcrypt' => [
32
+        'rounds' => env('BCRYPT_ROUNDS', 12),
33
+        'verify' => true,
34
+    ],
35
+
36
+    /*
37
+    |--------------------------------------------------------------------------
38
+    | Argon Options
39
+    |--------------------------------------------------------------------------
40
+    |
41
+    | Here you may specify the configuration options that should be used when
42
+    | passwords are hashed using the Argon algorithm. These will allow you
43
+    | to control the amount of time it takes to hash the given password.
44
+    |
45
+    */
46
+
47
+    'argon' => [
48
+        'memory' => 65536,
49
+        'threads' => 1,
50
+        'time' => 4,
51
+        'verify' => true,
52
+    ],
53
+
54
+];

+ 131
- 0
config/logging.php Ver fichero

@@ -0,0 +1,131 @@
1
+<?php
2
+
3
+use Monolog\Handler\NullHandler;
4
+use Monolog\Handler\StreamHandler;
5
+use Monolog\Handler\SyslogUdpHandler;
6
+use Monolog\Processor\PsrLogMessageProcessor;
7
+
8
+return [
9
+
10
+    /*
11
+    |--------------------------------------------------------------------------
12
+    | Default Log Channel
13
+    |--------------------------------------------------------------------------
14
+    |
15
+    | This option defines the default log channel that gets used when writing
16
+    | messages to the logs. The name specified in this option should match
17
+    | one of the channels defined in the "channels" configuration array.
18
+    |
19
+    */
20
+
21
+    'default' => env('LOG_CHANNEL', 'stack'),
22
+
23
+    /*
24
+    |--------------------------------------------------------------------------
25
+    | Deprecations Log Channel
26
+    |--------------------------------------------------------------------------
27
+    |
28
+    | This option controls the log channel that should be used to log warnings
29
+    | regarding deprecated PHP and library features. This allows you to get
30
+    | your application ready for upcoming major versions of dependencies.
31
+    |
32
+    */
33
+
34
+    'deprecations' => [
35
+        'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
36
+        'trace' => false,
37
+    ],
38
+
39
+    /*
40
+    |--------------------------------------------------------------------------
41
+    | Log Channels
42
+    |--------------------------------------------------------------------------
43
+    |
44
+    | Here you may configure the log channels for your application. Out of
45
+    | the box, Laravel uses the Monolog PHP logging library. This gives
46
+    | you a variety of powerful log handlers / formatters to utilize.
47
+    |
48
+    | Available Drivers: "single", "daily", "slack", "syslog",
49
+    |                    "errorlog", "monolog",
50
+    |                    "custom", "stack"
51
+    |
52
+    */
53
+
54
+    'channels' => [
55
+        'stack' => [
56
+            'driver' => 'stack',
57
+            'channels' => ['single'],
58
+            'ignore_exceptions' => false,
59
+        ],
60
+
61
+        'single' => [
62
+            'driver' => 'single',
63
+            'path' => storage_path('logs/laravel.log'),
64
+            'level' => env('LOG_LEVEL', 'debug'),
65
+            'replace_placeholders' => true,
66
+        ],
67
+
68
+        'daily' => [
69
+            'driver' => 'daily',
70
+            'path' => storage_path('logs/laravel.log'),
71
+            'level' => env('LOG_LEVEL', 'debug'),
72
+            'days' => 14,
73
+            'replace_placeholders' => true,
74
+        ],
75
+
76
+        'slack' => [
77
+            'driver' => 'slack',
78
+            'url' => env('LOG_SLACK_WEBHOOK_URL'),
79
+            'username' => 'Laravel Log',
80
+            'emoji' => ':boom:',
81
+            'level' => env('LOG_LEVEL', 'critical'),
82
+            'replace_placeholders' => true,
83
+        ],
84
+
85
+        'papertrail' => [
86
+            'driver' => 'monolog',
87
+            'level' => env('LOG_LEVEL', 'debug'),
88
+            'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),
89
+            'handler_with' => [
90
+                'host' => env('PAPERTRAIL_URL'),
91
+                'port' => env('PAPERTRAIL_PORT'),
92
+                'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),
93
+            ],
94
+            'processors' => [PsrLogMessageProcessor::class],
95
+        ],
96
+
97
+        'stderr' => [
98
+            'driver' => 'monolog',
99
+            'level' => env('LOG_LEVEL', 'debug'),
100
+            'handler' => StreamHandler::class,
101
+            'formatter' => env('LOG_STDERR_FORMATTER'),
102
+            'with' => [
103
+                'stream' => 'php://stderr',
104
+            ],
105
+            'processors' => [PsrLogMessageProcessor::class],
106
+        ],
107
+
108
+        'syslog' => [
109
+            'driver' => 'syslog',
110
+            'level' => env('LOG_LEVEL', 'debug'),
111
+            'facility' => LOG_USER,
112
+            'replace_placeholders' => true,
113
+        ],
114
+
115
+        'errorlog' => [
116
+            'driver' => 'errorlog',
117
+            'level' => env('LOG_LEVEL', 'debug'),
118
+            'replace_placeholders' => true,
119
+        ],
120
+
121
+        'null' => [
122
+            'driver' => 'monolog',
123
+            'handler' => NullHandler::class,
124
+        ],
125
+
126
+        'emergency' => [
127
+            'path' => storage_path('logs/laravel.log'),
128
+        ],
129
+    ],
130
+
131
+];

+ 134
- 0
config/mail.php Ver fichero

@@ -0,0 +1,134 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Default Mailer
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | This option controls the default mailer that is used to send any email
11
+    | messages sent by your application. Alternative mailers may be setup
12
+    | and used as needed; however, this mailer will be used by default.
13
+    |
14
+    */
15
+
16
+    'default' => env('MAIL_MAILER', 'smtp'),
17
+
18
+    /*
19
+    |--------------------------------------------------------------------------
20
+    | Mailer Configurations
21
+    |--------------------------------------------------------------------------
22
+    |
23
+    | Here you may configure all of the mailers used by your application plus
24
+    | their respective settings. Several examples have been configured for
25
+    | you and you are free to add your own as your application requires.
26
+    |
27
+    | Laravel supports a variety of mail "transport" drivers to be used while
28
+    | sending an e-mail. You will specify which one you are using for your
29
+    | mailers below. You are free to add additional mailers as required.
30
+    |
31
+    | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2",
32
+    |            "postmark", "log", "array", "failover", "roundrobin"
33
+    |
34
+    */
35
+
36
+    'mailers' => [
37
+        'smtp' => [
38
+            'transport' => 'smtp',
39
+            'url' => env('MAIL_URL'),
40
+            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
41
+            'port' => env('MAIL_PORT', 587),
42
+            'encryption' => env('MAIL_ENCRYPTION', 'tls'),
43
+            'username' => env('MAIL_USERNAME'),
44
+            'password' => env('MAIL_PASSWORD'),
45
+            'timeout' => null,
46
+            'local_domain' => env('MAIL_EHLO_DOMAIN'),
47
+        ],
48
+
49
+        'ses' => [
50
+            'transport' => 'ses',
51
+        ],
52
+
53
+        'postmark' => [
54
+            'transport' => 'postmark',
55
+            // 'message_stream_id' => null,
56
+            // 'client' => [
57
+            //     'timeout' => 5,
58
+            // ],
59
+        ],
60
+
61
+        'mailgun' => [
62
+            'transport' => 'mailgun',
63
+            // 'client' => [
64
+            //     'timeout' => 5,
65
+            // ],
66
+        ],
67
+
68
+        'sendmail' => [
69
+            'transport' => 'sendmail',
70
+            'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),
71
+        ],
72
+
73
+        'log' => [
74
+            'transport' => 'log',
75
+            'channel' => env('MAIL_LOG_CHANNEL'),
76
+        ],
77
+
78
+        'array' => [
79
+            'transport' => 'array',
80
+        ],
81
+
82
+        'failover' => [
83
+            'transport' => 'failover',
84
+            'mailers' => [
85
+                'smtp',
86
+                'log',
87
+            ],
88
+        ],
89
+
90
+        'roundrobin' => [
91
+            'transport' => 'roundrobin',
92
+            'mailers' => [
93
+                'ses',
94
+                'postmark',
95
+            ],
96
+        ],
97
+    ],
98
+
99
+    /*
100
+    |--------------------------------------------------------------------------
101
+    | Global "From" Address
102
+    |--------------------------------------------------------------------------
103
+    |
104
+    | You may wish for all e-mails sent by your application to be sent from
105
+    | the same address. Here, you may specify a name and address that is
106
+    | used globally for all e-mails that are sent by your application.
107
+    |
108
+    */
109
+
110
+    'from' => [
111
+        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
112
+        'name' => env('MAIL_FROM_NAME', 'Example'),
113
+    ],
114
+
115
+    /*
116
+    |--------------------------------------------------------------------------
117
+    | Markdown Mail Settings
118
+    |--------------------------------------------------------------------------
119
+    |
120
+    | If you are using Markdown based email rendering, you may configure your
121
+    | theme and component paths here, allowing you to customize the design
122
+    | of the emails. Or, you may simply stick with the Laravel defaults!
123
+    |
124
+    */
125
+
126
+    'markdown' => [
127
+        'theme' => 'default',
128
+
129
+        'paths' => [
130
+            resource_path('views/vendor/mail'),
131
+        ],
132
+    ],
133
+
134
+];

+ 109
- 0
config/queue.php Ver fichero

@@ -0,0 +1,109 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Default Queue Connection Name
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | Laravel's queue API supports an assortment of back-ends via a single
11
+    | API, giving you convenient access to each back-end using the same
12
+    | syntax for every one. Here you may define a default connection.
13
+    |
14
+    */
15
+
16
+    'default' => env('QUEUE_CONNECTION', 'sync'),
17
+
18
+    /*
19
+    |--------------------------------------------------------------------------
20
+    | Queue Connections
21
+    |--------------------------------------------------------------------------
22
+    |
23
+    | Here you may configure the connection information for each server that
24
+    | is used by your application. A default configuration has been added
25
+    | for each back-end shipped with Laravel. You are free to add more.
26
+    |
27
+    | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
28
+    |
29
+    */
30
+
31
+    'connections' => [
32
+
33
+        'sync' => [
34
+            'driver' => 'sync',
35
+        ],
36
+
37
+        'database' => [
38
+            'driver' => 'database',
39
+            'table' => 'jobs',
40
+            'queue' => 'default',
41
+            'retry_after' => 90,
42
+            'after_commit' => false,
43
+        ],
44
+
45
+        'beanstalkd' => [
46
+            'driver' => 'beanstalkd',
47
+            'host' => 'localhost',
48
+            'queue' => 'default',
49
+            'retry_after' => 90,
50
+            'block_for' => 0,
51
+            'after_commit' => false,
52
+        ],
53
+
54
+        'sqs' => [
55
+            'driver' => 'sqs',
56
+            'key' => env('AWS_ACCESS_KEY_ID'),
57
+            'secret' => env('AWS_SECRET_ACCESS_KEY'),
58
+            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
59
+            'queue' => env('SQS_QUEUE', 'default'),
60
+            'suffix' => env('SQS_SUFFIX'),
61
+            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
62
+            'after_commit' => false,
63
+        ],
64
+
65
+        'redis' => [
66
+            'driver' => 'redis',
67
+            'connection' => 'default',
68
+            'queue' => env('REDIS_QUEUE', 'default'),
69
+            'retry_after' => 90,
70
+            'block_for' => null,
71
+            'after_commit' => false,
72
+        ],
73
+
74
+    ],
75
+
76
+    /*
77
+    |--------------------------------------------------------------------------
78
+    | Job Batching
79
+    |--------------------------------------------------------------------------
80
+    |
81
+    | The following options configure the database and table that store job
82
+    | batching information. These options can be updated to any database
83
+    | connection and table which has been defined by your application.
84
+    |
85
+    */
86
+
87
+    'batching' => [
88
+        'database' => env('DB_CONNECTION', 'mysql'),
89
+        'table' => 'job_batches',
90
+    ],
91
+
92
+    /*
93
+    |--------------------------------------------------------------------------
94
+    | Failed Queue Jobs
95
+    |--------------------------------------------------------------------------
96
+    |
97
+    | These options configure the behavior of failed queue job logging so you
98
+    | can control which database and table are used to store the jobs that
99
+    | have failed. You may change them to any database / table you wish.
100
+    |
101
+    */
102
+
103
+    'failed' => [
104
+        'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),
105
+        'database' => env('DB_CONNECTION', 'mysql'),
106
+        'table' => 'failed_jobs',
107
+    ],
108
+
109
+];

+ 83
- 0
config/sanctum.php Ver fichero

@@ -0,0 +1,83 @@
1
+<?php
2
+
3
+use Laravel\Sanctum\Sanctum;
4
+
5
+return [
6
+
7
+    /*
8
+    |--------------------------------------------------------------------------
9
+    | Stateful Domains
10
+    |--------------------------------------------------------------------------
11
+    |
12
+    | Requests from the following domains / hosts will receive stateful API
13
+    | authentication cookies. Typically, these should include your local
14
+    | and production domains which access your API via a frontend SPA.
15
+    |
16
+    */
17
+
18
+    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
19
+        '%s%s',
20
+        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
21
+        Sanctum::currentApplicationUrlWithPort()
22
+    ))),
23
+
24
+    /*
25
+    |--------------------------------------------------------------------------
26
+    | Sanctum Guards
27
+    |--------------------------------------------------------------------------
28
+    |
29
+    | This array contains the authentication guards that will be checked when
30
+    | Sanctum is trying to authenticate a request. If none of these guards
31
+    | are able to authenticate the request, Sanctum will use the bearer
32
+    | token that's present on an incoming request for authentication.
33
+    |
34
+    */
35
+
36
+    'guard' => ['web'],
37
+
38
+    /*
39
+    |--------------------------------------------------------------------------
40
+    | Expiration Minutes
41
+    |--------------------------------------------------------------------------
42
+    |
43
+    | This value controls the number of minutes until an issued token will be
44
+    | considered expired. This will override any values set in the token's
45
+    | "expires_at" attribute, but first-party sessions are not affected.
46
+    |
47
+    */
48
+
49
+    'expiration' => null,
50
+
51
+    /*
52
+    |--------------------------------------------------------------------------
53
+    | Token Prefix
54
+    |--------------------------------------------------------------------------
55
+    |
56
+    | Sanctum can prefix new tokens in order to take advantage of numerous
57
+    | security scanning initiatives maintained by open source platforms
58
+    | that notify developers if they commit tokens into repositories.
59
+    |
60
+    | See: https://docs.github.com/en/code-security/secret-scanning/about-secret-scanning
61
+    |
62
+    */
63
+
64
+    'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''),
65
+
66
+    /*
67
+    |--------------------------------------------------------------------------
68
+    | Sanctum Middleware
69
+    |--------------------------------------------------------------------------
70
+    |
71
+    | When authenticating your first-party SPA with Sanctum you may need to
72
+    | customize some of the middleware Sanctum uses while processing the
73
+    | request. You may change the middleware listed below as required.
74
+    |
75
+    */
76
+
77
+    'middleware' => [
78
+        'authenticate_session' => Laravel\Sanctum\Http\Middleware\AuthenticateSession::class,
79
+        'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,
80
+        'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,
81
+    ],
82
+
83
+];

+ 34
- 0
config/services.php Ver fichero

@@ -0,0 +1,34 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Third Party Services
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | This file is for storing the credentials for third party services such
11
+    | as Mailgun, Postmark, AWS and more. This file provides the de facto
12
+    | location for this type of information, allowing packages to have
13
+    | a conventional file to locate the various service credentials.
14
+    |
15
+    */
16
+
17
+    'mailgun' => [
18
+        'domain' => env('MAILGUN_DOMAIN'),
19
+        'secret' => env('MAILGUN_SECRET'),
20
+        'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
21
+        'scheme' => 'https',
22
+    ],
23
+
24
+    'postmark' => [
25
+        'token' => env('POSTMARK_TOKEN'),
26
+    ],
27
+
28
+    'ses' => [
29
+        'key' => env('AWS_ACCESS_KEY_ID'),
30
+        'secret' => env('AWS_SECRET_ACCESS_KEY'),
31
+        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
32
+    ],
33
+
34
+];

+ 214
- 0
config/session.php Ver fichero

@@ -0,0 +1,214 @@
1
+<?php
2
+
3
+use Illuminate\Support\Str;
4
+
5
+return [
6
+
7
+    /*
8
+    |--------------------------------------------------------------------------
9
+    | Default Session Driver
10
+    |--------------------------------------------------------------------------
11
+    |
12
+    | This option controls the default session "driver" that will be used on
13
+    | requests. By default, we will use the lightweight native driver but
14
+    | you may specify any of the other wonderful drivers provided here.
15
+    |
16
+    | Supported: "file", "cookie", "database", "apc",
17
+    |            "memcached", "redis", "dynamodb", "array"
18
+    |
19
+    */
20
+
21
+    'driver' => env('SESSION_DRIVER', 'file'),
22
+
23
+    /*
24
+    |--------------------------------------------------------------------------
25
+    | Session Lifetime
26
+    |--------------------------------------------------------------------------
27
+    |
28
+    | Here you may specify the number of minutes that you wish the session
29
+    | to be allowed to remain idle before it expires. If you want them
30
+    | to immediately expire on the browser closing, set that option.
31
+    |
32
+    */
33
+
34
+    'lifetime' => env('SESSION_LIFETIME', 120),
35
+
36
+    'expire_on_close' => false,
37
+
38
+    /*
39
+    |--------------------------------------------------------------------------
40
+    | Session Encryption
41
+    |--------------------------------------------------------------------------
42
+    |
43
+    | This option allows you to easily specify that all of your session data
44
+    | should be encrypted before it is stored. All encryption will be run
45
+    | automatically by Laravel and you can use the Session like normal.
46
+    |
47
+    */
48
+
49
+    'encrypt' => false,
50
+
51
+    /*
52
+    |--------------------------------------------------------------------------
53
+    | Session File Location
54
+    |--------------------------------------------------------------------------
55
+    |
56
+    | When using the native session driver, we need a location where session
57
+    | files may be stored. A default has been set for you but a different
58
+    | location may be specified. This is only needed for file sessions.
59
+    |
60
+    */
61
+
62
+    'files' => storage_path('framework/sessions'),
63
+
64
+    /*
65
+    |--------------------------------------------------------------------------
66
+    | Session Database Connection
67
+    |--------------------------------------------------------------------------
68
+    |
69
+    | When using the "database" or "redis" session drivers, you may specify a
70
+    | connection that should be used to manage these sessions. This should
71
+    | correspond to a connection in your database configuration options.
72
+    |
73
+    */
74
+
75
+    'connection' => env('SESSION_CONNECTION'),
76
+
77
+    /*
78
+    |--------------------------------------------------------------------------
79
+    | Session Database Table
80
+    |--------------------------------------------------------------------------
81
+    |
82
+    | When using the "database" session driver, you may specify the table we
83
+    | should use to manage the sessions. Of course, a sensible default is
84
+    | provided for you; however, you are free to change this as needed.
85
+    |
86
+    */
87
+
88
+    'table' => 'sessions',
89
+
90
+    /*
91
+    |--------------------------------------------------------------------------
92
+    | Session Cache Store
93
+    |--------------------------------------------------------------------------
94
+    |
95
+    | While using one of the framework's cache driven session backends you may
96
+    | list a cache store that should be used for these sessions. This value
97
+    | must match with one of the application's configured cache "stores".
98
+    |
99
+    | Affects: "apc", "dynamodb", "memcached", "redis"
100
+    |
101
+    */
102
+
103
+    'store' => env('SESSION_STORE'),
104
+
105
+    /*
106
+    |--------------------------------------------------------------------------
107
+    | Session Sweeping Lottery
108
+    |--------------------------------------------------------------------------
109
+    |
110
+    | Some session drivers must manually sweep their storage location to get
111
+    | rid of old sessions from storage. Here are the chances that it will
112
+    | happen on a given request. By default, the odds are 2 out of 100.
113
+    |
114
+    */
115
+
116
+    'lottery' => [2, 100],
117
+
118
+    /*
119
+    |--------------------------------------------------------------------------
120
+    | Session Cookie Name
121
+    |--------------------------------------------------------------------------
122
+    |
123
+    | Here you may change the name of the cookie used to identify a session
124
+    | instance by ID. The name specified here will get used every time a
125
+    | new session cookie is created by the framework for every driver.
126
+    |
127
+    */
128
+
129
+    'cookie' => env(
130
+        'SESSION_COOKIE',
131
+        Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
132
+    ),
133
+
134
+    /*
135
+    |--------------------------------------------------------------------------
136
+    | Session Cookie Path
137
+    |--------------------------------------------------------------------------
138
+    |
139
+    | The session cookie path determines the path for which the cookie will
140
+    | be regarded as available. Typically, this will be the root path of
141
+    | your application but you are free to change this when necessary.
142
+    |
143
+    */
144
+
145
+    'path' => '/',
146
+
147
+    /*
148
+    |--------------------------------------------------------------------------
149
+    | Session Cookie Domain
150
+    |--------------------------------------------------------------------------
151
+    |
152
+    | Here you may change the domain of the cookie used to identify a session
153
+    | in your application. This will determine which domains the cookie is
154
+    | available to in your application. A sensible default has been set.
155
+    |
156
+    */
157
+
158
+    'domain' => env('SESSION_DOMAIN'),
159
+
160
+    /*
161
+    |--------------------------------------------------------------------------
162
+    | HTTPS Only Cookies
163
+    |--------------------------------------------------------------------------
164
+    |
165
+    | By setting this option to true, session cookies will only be sent back
166
+    | to the server if the browser has a HTTPS connection. This will keep
167
+    | the cookie from being sent to you when it can't be done securely.
168
+    |
169
+    */
170
+
171
+    'secure' => env('SESSION_SECURE_COOKIE'),
172
+
173
+    /*
174
+    |--------------------------------------------------------------------------
175
+    | HTTP Access Only
176
+    |--------------------------------------------------------------------------
177
+    |
178
+    | Setting this value to true will prevent JavaScript from accessing the
179
+    | value of the cookie and the cookie will only be accessible through
180
+    | the HTTP protocol. You are free to modify this option if needed.
181
+    |
182
+    */
183
+
184
+    'http_only' => true,
185
+
186
+    /*
187
+    |--------------------------------------------------------------------------
188
+    | Same-Site Cookies
189
+    |--------------------------------------------------------------------------
190
+    |
191
+    | This option determines how your cookies behave when cross-site requests
192
+    | take place, and can be used to mitigate CSRF attacks. By default, we
193
+    | will set this value to "lax" since this is a secure default value.
194
+    |
195
+    | Supported: "lax", "strict", "none", null
196
+    |
197
+    */
198
+
199
+    'same_site' => 'lax',
200
+
201
+    /*
202
+    |--------------------------------------------------------------------------
203
+    | Partitioned Cookies
204
+    |--------------------------------------------------------------------------
205
+    |
206
+    | Setting this value to true will tie the cookie to the top-level site for
207
+    | a cross-site context. Partitioned cookies are accepted by the browser
208
+    | when flagged "secure" and the Same-Site attribute is set to "none".
209
+    |
210
+    */
211
+
212
+    'partitioned' => false,
213
+
214
+];

+ 269
- 0
config/sweetalert.php Ver fichero

@@ -0,0 +1,269 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | Theme
8
+    |--------------------------------------------------------------------------
9
+    | The theme to use for SweetAlert2 popups.
10
+    | Available themes: dark, minimal, borderless, bootstrap-4, material-ui, wordpress-admin, bulma.
11
+    |
12
+    */
13
+
14
+    'theme' => env('SWEET_ALERT_THEME', 'default'),
15
+
16
+    /*
17
+    |--------------------------------------------------------------------------
18
+    | CDN LINK
19
+    |--------------------------------------------------------------------------
20
+    | By default SweetAlert2 use its local sweetalert.all.js
21
+    | file.
22
+    | However, you can use its cdn if you want.
23
+    |
24
+    */
25
+
26
+    'cdn' => env('SWEET_ALERT_CDN'),
27
+
28
+    /*
29
+    |--------------------------------------------------------------------------
30
+    | Always load the sweetalert.all.js
31
+    |--------------------------------------------------------------------------
32
+    | There might be situations where you will always want the sweet alert
33
+    | js package to be there for you. (for eg. you might use it heavily to
34
+    | show notifications or you might want to use the native js) then this
35
+    | might be handy.
36
+    |
37
+    */
38
+
39
+    'alwaysLoadJS' => env('SWEET_ALERT_ALWAYS_LOAD_JS', false),
40
+
41
+    /*
42
+    |--------------------------------------------------------------------------
43
+    | Never load the sweetalert.all.js
44
+    |--------------------------------------------------------------------------
45
+    | If you want to handle the sweet alert js package by yourself
46
+    | (for eg. you might want to use laravel mix) then this can be
47
+    | handy.
48
+    | If you set always load js to true & never load js to false,
49
+    | it's going to prioritize the never load js.
50
+    |
51
+    | alwaysLoadJs = true  & neverLoadJs = true  => js will not be loaded
52
+    | alwaysLoadJs = true  & neverLoadJs = false => js will be loaded
53
+    | alwaysLoadJs = false & neverLoadJs = false => js will be loaded when
54
+    | you set alert/toast by using the facade/helper functions.
55
+    */
56
+
57
+    'neverLoadJS' => env('SWEET_ALERT_NEVER_LOAD_JS', false),
58
+
59
+    /*
60
+    |--------------------------------------------------------------------------
61
+    | AutoClose Timer
62
+    |--------------------------------------------------------------------------
63
+    |
64
+    | This is for the all Modal windows.
65
+    | For specific modal just use the autoClose() helper method.
66
+    |
67
+    */
68
+
69
+    'timer' => env('SWEET_ALERT_TIMER', 5000),
70
+
71
+    /*
72
+    |--------------------------------------------------------------------------
73
+    | Width
74
+    |--------------------------------------------------------------------------
75
+    |
76
+    | Modal window width, including paddings (box-sizing: border-box).
77
+    | Can be in px or %.
78
+    | The default width is 32rem.
79
+    | This is for the all Modal windows.
80
+    | for particular modal just use the width() helper method.
81
+    */
82
+
83
+    'width' => env('SWEET_ALERT_WIDTH', '32rem'),
84
+
85
+    /*
86
+    |--------------------------------------------------------------------------
87
+    | Height Auto
88
+    |--------------------------------------------------------------------------
89
+    | By default, SweetAlert2 sets html's and body's CSS height to auto !important.
90
+    | If this behavior isn't compatible with your project's layout,
91
+    | set heightAuto to false.
92
+    |
93
+    */
94
+
95
+    'height_auto' => env('SWEET_ALERT_HEIGHT_AUTO', true),
96
+
97
+    /*
98
+    |--------------------------------------------------------------------------
99
+    | Padding
100
+    |--------------------------------------------------------------------------
101
+    |
102
+    | Modal window padding.
103
+    | Can be in px or %.
104
+    | The default padding is 1.25rem.
105
+    | This is for the all Modal windows.
106
+    | for particular modal just use the padding() helper method.
107
+    */
108
+
109
+    'padding' => env('SWEET_ALERT_PADDING', '1.25rem'),
110
+
111
+    /*
112
+    |--------------------------------------------------------------------------
113
+    | Background
114
+    |--------------------------------------------------------------------------
115
+    |
116
+    |  Modal window background
117
+    |   (CSS background property).
118
+    |  The default background is '#fff'.
119
+    */
120
+
121
+    'background' => env('SWEET_ALERT_BACKGROUND', '#fff'),
122
+
123
+    /*
124
+    |--------------------------------------------------------------------------
125
+    | Animation
126
+    |--------------------------------------------------------------------------
127
+    | Custom animation with [Animate.css](https://daneden.github.io/animate.css/)
128
+    | If set to false, modal CSS animation will be use default ones.
129
+    | For specific modal just use the animation() helper method.
130
+    |
131
+    */
132
+
133
+    'animation' => [
134
+        'enable' => env('SWEET_ALERT_ANIMATION_ENABLE', false),
135
+    ],
136
+
137
+    'animatecss' => env('SWEET_ALERT_ANIMATECSS', 'https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css'),
138
+
139
+    /*
140
+    |--------------------------------------------------------------------------
141
+    | ShowConfirmButton
142
+    |--------------------------------------------------------------------------
143
+    | If set to false, a "Confirm"-button will not be shown.
144
+    | It can be useful when you're using custom HTML description.
145
+    | This is for the all Modal windows.
146
+    | For specific modal just use the showConfirmButton() helper method.
147
+    |
148
+    */
149
+
150
+    'show_confirm_button' => env('SWEET_ALERT_CONFIRM_BUTTON', true),
151
+
152
+    /*
153
+    |--------------------------------------------------------------------------
154
+    | ShowCloseButton
155
+    |--------------------------------------------------------------------------
156
+    | If set to true, a "Close"-button will be shown,
157
+    | which the user can click on to dismiss the modal.
158
+    | This is for the all Modal windows.
159
+    | For specific modal just use the showCloseButton() helper method.
160
+    |
161
+    */
162
+
163
+    'show_close_button' => env('SWEET_ALERT_CLOSE_BUTTON', false),
164
+
165
+    /*
166
+    |-----------------------------------------------------------------------
167
+    | Confirm/Cancel Button Text
168
+    |-----------------------------------------------------------------------
169
+    | Change the default text of the modal buttons.
170
+    | The texts translations will be handled by Laravel at runtime.
171
+    | This is for the all Modal windows.
172
+    | For specific modal just use the confirmButtonText() and
173
+    | cancelButtonText() helper methods.
174
+    */
175
+
176
+    'button_text' => [
177
+        'confirm' => env('SWEET_ALERT_CONFIRM_BUTTON_TEXT', 'OK'),
178
+        'cancel' => env('SWEET_ALERT_CANCEL_BUTTON_TEXT', 'Cancel'),
179
+    ],
180
+
181
+    /*
182
+    |--------------------------------------------------------------------------
183
+    | Toast position
184
+    |--------------------------------------------------------------------------
185
+    | Modal window or toast position, can be 'top',
186
+    | 'top-start', 'top-end', 'center', 'center-start',
187
+    | 'center-end', 'bottom', 'bottom-start', or 'bottom-end'.
188
+    | For specific modal just use the position() helper method.
189
+    |
190
+    */
191
+
192
+    'toast_position' => env('SWEET_ALERT_TOAST_POSITION', 'top-end'),
193
+
194
+    /*
195
+    |--------------------------------------------------------------------------
196
+    | Progress Bar
197
+    |--------------------------------------------------------------------------
198
+    | If set to true, a progress bar at the bottom of a popup will be shown.
199
+    | It can be useful with toasts.
200
+    |
201
+    */
202
+
203
+    'timer_progress_bar' => env('SWEET_ALERT_TIMER_PROGRESS_BAR', false),
204
+
205
+    /*
206
+    |--------------------------------------------------------------------------
207
+    | Middleware
208
+    |--------------------------------------------------------------------------
209
+    | Modal window or toast, config for the Middleware
210
+    |
211
+    */
212
+
213
+    'middleware' => [
214
+
215
+        'autoClose' => env('SWEET_ALERT_MIDDLEWARE_AUTO_CLOSE', false),
216
+
217
+        'toast_position' => env('SWEET_ALERT_MIDDLEWARE_TOAST_POSITION', 'top-end'),
218
+
219
+        'toast_close_button' => env('SWEET_ALERT_MIDDLEWARE_TOAST_CLOSE_BUTTON', true),
220
+
221
+        'timer' => env('SWEET_ALERT_MIDDLEWARE_ALERT_CLOSE_TIME', 6000),
222
+
223
+        'auto_display_error_messages' => env('SWEET_ALERT_AUTO_DISPLAY_ERROR_MESSAGES', true),
224
+    ],
225
+
226
+    /*
227
+    |--------------------------------------------------------------------------
228
+    | Custom Class
229
+    |--------------------------------------------------------------------------
230
+    | A custom CSS class for the modal:
231
+    |
232
+    */
233
+
234
+    'customClass' => [
235
+
236
+        'container' => env('SWEET_ALERT_CONTAINER_CLASS'),
237
+        'popup' => env('SWEET_ALERT_POPUP_CLASS'),
238
+        'header' => env('SWEET_ALERT_HEADER_CLASS'),
239
+        'title' => env('SWEET_ALERT_TITLE_CLASS'),
240
+        'closeButton' => env('SWEET_ALERT_CLOSE_BUTTON_CLASS'),
241
+        'icon' => env('SWEET_ALERT_ICON_CLASS'),
242
+        'image' => env('SWEET_ALERT_IMAGE_CLASS'),
243
+        'content' => env('SWEET_ALERT_CONTENT_CLASS'),
244
+        'input' => env('SWEET_ALERT_INPUT_CLASS'),
245
+        'actions' => env('SWEET_ALERT_ACTIONS_CLASS'),
246
+        'confirmButton' => env('SWEET_ALERT_CONFIRM_BUTTON_CLASS'),
247
+        'cancelButton' => env('SWEET_ALERT_CANCEL_BUTTON_CLASS'),
248
+        'footer' => env('SWEET_ALERT_FOOTER_CLASS'),
249
+    ],
250
+
251
+    /*
252
+    |--------------------------------------------------------------------------
253
+    | confirmDelete
254
+    |--------------------------------------------------------------------------
255
+    | customize the configuration options of the confirmation popup.
256
+    |
257
+    */
258
+
259
+    'confirm_delete_confirm_button_text' => env('SWEET_ALERT_CONFIRM_DELETE_CONFIRM_BUTTON_TEXT', 'Yes, delete it!'),
260
+    'confirm_delete_confirm_button_color' => env('SWEET_ALERT_CONFIRM_DELETE_CONFIRM_BUTTON_COLOR'),
261
+    'confirm_delete_cancel_button_color' => env('SWEET_ALERT_CONFIRM_DELETE_CANCEL_BUTTON_COLOR', '#d33'),
262
+    'confirm_delete_cancel_button_text' => env('SWEET_ALERT_CONFIRM_DELETE_CANCEL_BUTTON_TEXT', 'Cancel'),
263
+    'confirm_delete_show_cancel_button' => env('SWEET_ALERT_CONFIRM_DELETE_SHOW_CANCEL_BUTTON', true),
264
+    'confirm_delete_show_close_button' => env('SWEET_ALERT_CONFIRM_DELETE_SHOW_CLOSE_BUTTON', false),
265
+    'confirm_delete_icon' => env('SWEET_ALERT_CONFIRM_DELETE_ICON', 'warning'),
266
+    'confirm_delete_show_loader_on_confirm' => env('SWEET_ALERT_CONFIRM_DELETE_SHOW_LOADER_ON_CONFIRM', true),
267
+
268
+
269
+];

+ 36
- 0
config/view.php Ver fichero

@@ -0,0 +1,36 @@
1
+<?php
2
+
3
+return [
4
+
5
+    /*
6
+    |--------------------------------------------------------------------------
7
+    | View Storage Paths
8
+    |--------------------------------------------------------------------------
9
+    |
10
+    | Most templating systems load templates from disk. Here you may specify
11
+    | an array of paths that should be checked for your views. Of course
12
+    | the usual Laravel view path has already been registered for you.
13
+    |
14
+    */
15
+
16
+    'paths' => [
17
+        resource_path('views'),
18
+    ],
19
+
20
+    /*
21
+    |--------------------------------------------------------------------------
22
+    | Compiled View Path
23
+    |--------------------------------------------------------------------------
24
+    |
25
+    | This option determines where all the compiled Blade templates will be
26
+    | stored for your application. Typically, this is within the storage
27
+    | directory. However, as usual, you are free to change this value.
28
+    |
29
+    */
30
+
31
+    'compiled' => env(
32
+        'VIEW_COMPILED_PATH',
33
+        realpath(storage_path('framework/views'))
34
+    ),
35
+
36
+];

+ 1
- 0
database/.gitignore Ver fichero

@@ -0,0 +1 @@
1
+*.sqlite*

+ 44
- 0
database/factories/UserFactory.php Ver fichero

@@ -0,0 +1,44 @@
1
+<?php
2
+
3
+namespace Database\Factories;
4
+
5
+use Illuminate\Database\Eloquent\Factories\Factory;
6
+use Illuminate\Support\Facades\Hash;
7
+use Illuminate\Support\Str;
8
+
9
+/**
10
+ * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
11
+ */
12
+class UserFactory extends Factory
13
+{
14
+    /**
15
+     * The current password being used by the factory.
16
+     */
17
+    protected static ?string $password;
18
+
19
+    /**
20
+     * Define the model's default state.
21
+     *
22
+     * @return array<string, mixed>
23
+     */
24
+    public function definition(): array
25
+    {
26
+        return [
27
+            'name' => fake()->name(),
28
+            'email' => fake()->unique()->safeEmail(),
29
+            'email_verified_at' => now(),
30
+            'password' => static::$password ??= Hash::make('password'),
31
+            'remember_token' => Str::random(10),
32
+        ];
33
+    }
34
+
35
+    /**
36
+     * Indicate that the model's email address should be unverified.
37
+     */
38
+    public function unverified(): static
39
+    {
40
+        return $this->state(fn (array $attributes) => [
41
+            'email_verified_at' => null,
42
+        ]);
43
+    }
44
+}

+ 34
- 0
database/migrations/2014_10_12_000000_create_users_table.php Ver fichero

@@ -0,0 +1,34 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('users', function (Blueprint $table) {
15
+            $table->id();
16
+            $table->string('name');
17
+            $table->string('email')->unique();
18
+            $table->timestamp('email_verified_at')->nullable();
19
+            $table->string('password');
20
+            $table->enum('role',['admin','user'])->default('user');
21
+            $table->string('foto')->default('../../assets/img/avatars/foto.png');
22
+            $table->rememberToken();
23
+            $table->timestamps();
24
+        });
25
+    }
26
+
27
+    /**
28
+     * Reverse the migrations.
29
+     */
30
+    public function down(): void
31
+    {
32
+        Schema::dropIfExists('users');
33
+    }
34
+};

+ 28
- 0
database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php Ver fichero

@@ -0,0 +1,28 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('password_reset_tokens', function (Blueprint $table) {
15
+            $table->string('email')->primary();
16
+            $table->string('token');
17
+            $table->timestamp('created_at')->nullable();
18
+        });
19
+    }
20
+
21
+    /**
22
+     * Reverse the migrations.
23
+     */
24
+    public function down(): void
25
+    {
26
+        Schema::dropIfExists('password_reset_tokens');
27
+    }
28
+};

+ 32
- 0
database/migrations/2014_10_12_100000_create_password_resets_table.php Ver fichero

@@ -0,0 +1,32 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     *
12
+     * @return void
13
+     */
14
+    public function up()
15
+    {
16
+        Schema::create('password_resets', function (Blueprint $table) {
17
+            $table->string('email')->index();
18
+            $table->string('token');
19
+            $table->timestamp('created_at')->nullable();
20
+        });
21
+    }
22
+
23
+    /**
24
+     * Reverse the migrations.
25
+     *
26
+     * @return void
27
+     */
28
+    public function down()
29
+    {
30
+        Schema::dropIfExists('password_resets');
31
+    }
32
+};

+ 32
- 0
database/migrations/2019_08_19_000000_create_failed_jobs_table.php Ver fichero

@@ -0,0 +1,32 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('failed_jobs', function (Blueprint $table) {
15
+            $table->id();
16
+            $table->string('uuid')->unique();
17
+            $table->text('connection');
18
+            $table->text('queue');
19
+            $table->longText('payload');
20
+            $table->longText('exception');
21
+            $table->timestamp('failed_at')->useCurrent();
22
+        });
23
+    }
24
+
25
+    /**
26
+     * Reverse the migrations.
27
+     */
28
+    public function down(): void
29
+    {
30
+        Schema::dropIfExists('failed_jobs');
31
+    }
32
+};

+ 33
- 0
database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php Ver fichero

@@ -0,0 +1,33 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('personal_access_tokens', function (Blueprint $table) {
15
+            $table->id();
16
+            $table->morphs('tokenable');
17
+            $table->string('name');
18
+            $table->string('token', 64)->unique();
19
+            $table->text('abilities')->nullable();
20
+            $table->timestamp('last_used_at')->nullable();
21
+            $table->timestamp('expires_at')->nullable();
22
+            $table->timestamps();
23
+        });
24
+    }
25
+
26
+    /**
27
+     * Reverse the migrations.
28
+     */
29
+    public function down(): void
30
+    {
31
+        Schema::dropIfExists('personal_access_tokens');
32
+    }
33
+};

+ 35
- 0
database/migrations/2023_03_25_111825_create_tindakans_table.php Ver fichero

@@ -0,0 +1,35 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        // Schema::create('tindakans', function (Blueprint $table) {
15
+        //     $table->id();
16
+        //     $table->unsignedBigInteger('pelaporans_id');
17
+        //     $table->string('statusTindakan');
18
+        //     $table->timestamps();
19
+        //     $table->foreign('pelaporans_id')->references('id')->on('pelaporans')->onDelete('cascade');
20
+        // });
21
+        Schema::create('tindakans', function (Blueprint $table) {
22
+            $table->id();
23
+            $table->string('statusTindakan')->nullable();
24
+            $table->timestamps();
25
+            });
26
+    }
27
+
28
+    /**
29
+     * Reverse the migrations.
30
+     */
31
+    public function down(): void
32
+    {
33
+        Schema::dropIfExists('tindakans');
34
+    }
35
+};

+ 27
- 0
database/migrations/2024_03_20_022810_create_sessions_table.php Ver fichero

@@ -0,0 +1,27 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('sessions', function (Blueprint $table) {
15
+            $table->id();
16
+            $table->timestamps();
17
+        });
18
+    }
19
+
20
+    /**
21
+     * Reverse the migrations.
22
+     */
23
+    public function down(): void
24
+    {
25
+        Schema::dropIfExists('sessions');
26
+    }
27
+};

+ 48
- 0
database/migrations/2024_03_24_124009_create_pelaporans_table.php Ver fichero

@@ -0,0 +1,48 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        // Schema::create('pelaporans', function (Blueprint $table) {
15
+        //     $table->id();
16
+        //     $table->string('judul');
17
+        //     $table->string('keterangan');
18
+        //     $table->date('tanggal');
19
+        //     $table->string('lokasi');
20
+        //     $table->string('status');
21
+        //     $table->string('foto')->nullable();
22
+        //     $table->timestamps();
23
+        // });
24
+        Schema::create('pelaporans', function (Blueprint $table) {
25
+            $table->id();
26
+            $table->unsignedBigInteger('tindakan_id')->default(1)->nullable();
27
+            $table->foreign('tindakan_id')->references('id')->on('tindakans');
28
+            $table->unsignedBigInteger('user_id'); // Tambahkan kolom user_id
29
+            $table->foreign('user_id')->references('id')->on('users'); // Referensi ke tabel users
30
+            $table->string('judul');
31
+            $table->string('keterangan');
32
+            $table->string('tanggal');
33
+            $table->string('lokasi');
34
+            $table->string('status');
35
+            $table->string('saran');
36
+            $table->string('foto');
37
+            $table->timestamps();
38
+        });
39
+    }
40
+
41
+    /**
42
+     * Reverse the migrations.
43
+     */
44
+    public function down(): void
45
+    {
46
+        Schema::dropIfExists('pelaporan');
47
+    }
48
+};

+ 27
- 0
database/migrations/2024_03_25_065447_create_riwayat_laporans_table.php Ver fichero

@@ -0,0 +1,27 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('riwayat_laporans', function (Blueprint $table) {
15
+            $table->id();
16
+            $table->timestamps();
17
+        });
18
+    }
19
+
20
+    /**
21
+     * Reverse the migrations.
22
+     */
23
+    public function down(): void
24
+    {
25
+        Schema::dropIfExists('riwayat_laporans');
26
+    }
27
+};

+ 30
- 0
database/migrations/2024_04_26_072052_create_informasis_table.php Ver fichero

@@ -0,0 +1,30 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('informasis', function (Blueprint $table) {
15
+            $table->id();
16
+            $table->string('judul');
17
+            $table->string('kategori');
18
+            $table->string('foto');
19
+            $table->timestamps();
20
+        });
21
+    }
22
+
23
+    /**
24
+     * Reverse the migrations.
25
+     */
26
+    public function down(): void
27
+    {
28
+        Schema::dropIfExists('informasis');
29
+    }
30
+};

+ 35
- 0
database/migrations/2024_05_17_010509_create_apresiasis_table.php Ver fichero

@@ -0,0 +1,35 @@
1
+<?php
2
+
3
+use Illuminate\Database\Migrations\Migration;
4
+use Illuminate\Database\Schema\Blueprint;
5
+use Illuminate\Support\Facades\Schema;
6
+
7
+return new class extends Migration
8
+{
9
+    /**
10
+     * Run the migrations.
11
+     */
12
+    public function up(): void
13
+    {
14
+        Schema::create('apresiasis', function (Blueprint $table) {
15
+            $table->id();
16
+            $table->unsignedBigInteger('user_id');
17
+            $table->string('judul');
18
+            $table->string('deskripsi');
19
+            $table->string('lokasi');
20
+            $table->string('tanggal');
21
+            $table->string('foto');
22
+            $table->timestamps();
23
+
24
+            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
25
+        });
26
+    }
27
+
28
+    /**
29
+     * Reverse the migrations.
30
+     */
31
+    public function down(): void
32
+    {
33
+        Schema::dropIfExists('apresiasis');
34
+    }
35
+};

+ 34
- 0
database/seeders/DatabaseSeeder.php Ver fichero

@@ -0,0 +1,34 @@
1
+<?php
2
+
3
+namespace Database\Seeders;
4
+
5
+// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
6
+use Illuminate\Database\Seeder;
7
+use Illuminate\Support\Facades\DB;
8
+use Illuminate\Support\Facades\Hash;
9
+
10
+class DatabaseSeeder extends Seeder
11
+{
12
+    /**
13
+     * Seed the application's database.
14
+     */
15
+    public function run(): void
16
+    {
17
+        // DB::table('users')->insert([
18
+        //     'name'=>'RafiAnwar',
19
+        //     'email' => 'email@gmail.com',
20
+        //     'password'=>Hash::make('123456'),
21
+        // ]);
22
+        $this->call([
23
+            StatusSeeder::class,
24
+            // tambahkan seeder lain jika ada
25
+        ]);
26
+        $this->call([
27
+            UserDummySeeder::class,
28
+            // tambahkan seeder lain jika ada
29
+        ]);
30
+        // \App\Models\User::factory(10)->create();
31
+
32
+        
33
+    }
34
+}

+ 28
- 0
database/seeders/StatusSeeder.php Ver fichero

@@ -0,0 +1,28 @@
1
+<?php
2
+
3
+namespace Database\Seeders;
4
+
5
+use App\Models\Tindakan;
6
+use Illuminate\Database\Console\Seeds\WithoutModelEvents;
7
+use Illuminate\Database\Seeder;
8
+
9
+class StatusSeeder extends Seeder
10
+{
11
+    /**
12
+     * Run the database seeds.
13
+     */
14
+    public function run(): void
15
+    {
16
+        $statusTindakan = [
17
+            ['statusTindakan' => 'Belum ditindak'],
18
+            ['statusTindakan' => 'Diverifikasi'],
19
+            ['statusTindakan' => 'Ditindak lanjuti'],
20
+            ['statusTindakan' => 'Selesai'],
21
+        ];
22
+
23
+        // Loop through each status and create a record in the database
24
+        foreach ($statusTindakan as $statusTindakan) {
25
+            Tindakan::create($statusTindakan);
26
+        }
27
+    }
28
+}

+ 36
- 0
database/seeders/UserDummySeeder.php Ver fichero

@@ -0,0 +1,36 @@
1
+<?php
2
+
3
+namespace Database\Seeders;
4
+
5
+use Illuminate\Database\Console\Seeds\WithoutModelEvents;
6
+use Illuminate\Database\Seeder;
7
+use App\Models\User;
8
+use Illuminate\Support\Facades\Hash;
9
+
10
+class UserDummySeeder extends Seeder
11
+{
12
+    /**
13
+     * Run the database seeds.
14
+     */
15
+    public function run(): void
16
+    {
17
+        $userData = [
18
+            [
19
+                'name'=>'RafiAnwar',
20
+                'email' => 'email@gmail.com',
21
+                'role' => 'user',
22
+                'password'=>Hash::make('123456'),
23
+            ],[
24
+                'name'=>'Admin',
25
+                'email' => 'admin@gmail.com',
26
+                'role' => 'admin',
27
+                'password'=>Hash::make('123456'),
28
+
29
+            ]
30
+        ];
31
+
32
+        foreach ($userData as $key => $value) {
33
+            User::create($value);
34
+        }
35
+    }
36
+}

+ 1454
- 0
package-lock.json
La diferencia del archivo ha sido suprimido porque es demasiado grande
Ver fichero


+ 16
- 0
package.json Ver fichero

@@ -0,0 +1,16 @@
1
+{
2
+    "private": true,
3
+    "type": "module",
4
+    "scripts": {
5
+        "dev": "vite",
6
+        "build": "vite build"
7
+    },
8
+    "devDependencies": {
9
+        "axios": "^1.6.4",
10
+        "laravel-vite-plugin": "^1.0.0",
11
+        "vite": "^5.0.0"
12
+    },
13
+    "dependencies": {
14
+        "chart.js": "^4.4.2"
15
+    }
16
+}

+ 32
- 0
phpunit.xml Ver fichero

@@ -0,0 +1,32 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3
+         xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
4
+         bootstrap="vendor/autoload.php"
5
+         colors="true"
6
+>
7
+    <testsuites>
8
+        <testsuite name="Unit">
9
+            <directory>tests/Unit</directory>
10
+        </testsuite>
11
+        <testsuite name="Feature">
12
+            <directory>tests/Feature</directory>
13
+        </testsuite>
14
+    </testsuites>
15
+    <source>
16
+        <include>
17
+            <directory>app</directory>
18
+        </include>
19
+    </source>
20
+    <php>
21
+        <env name="APP_ENV" value="testing"/>
22
+        <env name="BCRYPT_ROUNDS" value="4"/>
23
+        <env name="CACHE_DRIVER" value="array"/>
24
+        <!-- <env name="DB_CONNECTION" value="sqlite"/> -->
25
+        <!-- <env name="DB_DATABASE" value=":memory:"/> -->
26
+        <env name="MAIL_MAILER" value="array"/>
27
+        <env name="PULSE_ENABLED" value="false"/>
28
+        <env name="QUEUE_CONNECTION" value="sync"/>
29
+        <env name="SESSION_DRIVER" value="array"/>
30
+        <env name="TELESCOPE_ENABLED" value="false"/>
31
+    </php>
32
+</phpunit>

+ 0
- 0
public/.htaccess Ver fichero


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio

Loading…
Cancelar
Guardar