diff --git a/backend-baru/app/Http/Controllers/Api/RsvpApiController.php b/backend-baru/app/Http/Controllers/Api/RsvpApiController.php index a753cf8..79b0f48 100644 --- a/backend-baru/app/Http/Controllers/Api/RsvpApiController.php +++ b/backend-baru/app/Http/Controllers/Api/RsvpApiController.php @@ -30,6 +30,7 @@ class RsvpApiController extends Controller $rsvp = Rsvp::create([ 'guest_id' => $guest->id, + 'pelanggan_id' => $guest -> id_pelanggan, 'nama' => $validated['nama'], 'pesan' => $validated['pesan'], 'status_kehadiran' => $validated['status_kehadiran'], @@ -41,16 +42,11 @@ class RsvpApiController extends Controller 'data' => $rsvp, ], 201); - } catch (\Illuminate\Validation\ValidationException $e) { - return response()->json([ - 'success' => false, - 'message' => 'Validasi gagal', - 'errors' => $e->errors(), - ], 422); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Gagal menyimpan RSVP.', + 'error' => $e->getMessage(), ], 500); } } diff --git a/backend-baru/app/Models/Pelanggan.php b/backend-baru/app/Models/Pelanggan.php index 85c67b0..688e8c1 100644 --- a/backend-baru/app/Models/Pelanggan.php +++ b/backend-baru/app/Models/Pelanggan.php @@ -39,14 +39,7 @@ class Pelanggan extends Model public function rsvp() { - return $this->hasManyThrough( - Rsvp::class, - Guest::class, - 'id_pelanggan', - 'guest_id', - 'id', - 'id' - ); + return $this->hasMany(Rsvp::class, 'pelanggan_id'); } } diff --git a/backend-baru/app/Models/Rsvp.php b/backend-baru/app/Models/Rsvp.php index 949311c..196c99a 100644 --- a/backend-baru/app/Models/Rsvp.php +++ b/backend-baru/app/Models/Rsvp.php @@ -8,9 +8,15 @@ use Illuminate\Database\Eloquent\Model; class Rsvp extends Model { use HasFactory; - protected $fillable = ['guest_id', 'nama', 'pesan', 'status_kehadiran']; + protected $fillable = ['guest_id', 'nama', 'pesan', 'status_kehadiran','pelanggan_id']; public function guest() { return $this->belongsTo(Guest::class); } + + public function pelanggan() + { + return $this->belongsTo(Pelanggan::class, 'pelanggan_id'); + } + } diff --git a/backend-baru/config/cors.php b/backend-baru/config/cors.php index 8a39e6d..a8879ba 100644 --- a/backend-baru/config/cors.php +++ b/backend-baru/config/cors.php @@ -19,7 +19,7 @@ return [ 'allowed_methods' => ['*'], - 'allowed_origins' => ['*'], + 'allowed_origins' => ['http://localhost:3001'], 'allowed_origins_patterns' => [], diff --git a/backend-baru/database/factories/RsvpFactory.php b/backend-baru/database/factories/RsvpFactory.php new file mode 100644 index 0000000..f62adc8 --- /dev/null +++ b/backend-baru/database/factories/RsvpFactory.php @@ -0,0 +1,20 @@ + $this->faker->name(), + 'pesan' => $this->faker->sentence(8), + 'status_kehadiran' => $this->faker->randomElement(['hadir', 'tidak_hadir', 'mungkin']), + ]; + } +} diff --git a/backend-baru/database/migrations/2025_10_23_032107_create_rsvps_tables.php b/backend-baru/database/migrations/2025_10_23_032107_create_rsvps_tables.php index 3d12a23..b6ae47d 100644 --- a/backend-baru/database/migrations/2025_10_23_032107_create_rsvps_tables.php +++ b/backend-baru/database/migrations/2025_10_23_032107_create_rsvps_tables.php @@ -10,6 +10,7 @@ return new class extends Migration { Schema::create('rsvps', function (Blueprint $table) { $table->id(); $table->foreignId('guest_id')->constrained('guests')->cascadeOnDelete(); // Link ke guests table + $table->foreignId('pelanggan_id')->constrained('pelanggans')->cascadeOnDelete(); // Link ke guests table $table->string('nama'); $table->text('pesan'); $table->enum('status_kehadiran', ['hadir', 'tidak_hadir', 'mungkin'])->default('mungkin'); diff --git a/backend-baru/database/seeders/PelangganSeeder.php b/backend-baru/database/seeders/PelangganSeeder.php index 03ea70a..9968357 100644 --- a/backend-baru/database/seeders/PelangganSeeder.php +++ b/backend-baru/database/seeders/PelangganSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\Rsvp; use Illuminate\Database\Seeder; use App\Models\Pelanggan; use Illuminate\Support\Str; @@ -18,9 +19,17 @@ class PelangganSeeder extends Seeder 'id_pelanggan' => $item->id, ])->toArray(); $guests = array_merge($guests, $guestData); + } \App\Models\Guest::insert($guests); - + + foreach ($pelanggan as $item) { + $guest = $item->guests()->inRandomOrder()->first(); + Rsvp::factory(3)->create([ + "pelanggan_id"=>$item->id, + "guest_id"=>$guest + ]); + } // $pelanggans = [ // [ // 'nama_pemesan' => 'Arief Dwi Wicaksono', diff --git a/backend-baru/routes/api.php b/backend-baru/routes/api.php index cc8059c..fa16df9 100644 --- a/backend-baru/routes/api.php +++ b/backend-baru/routes/api.php @@ -30,7 +30,7 @@ Route::get('/pelanggans', [PelangganApiController::class, 'index']); // Ambil pelanggan berdasarkan ID Route::get('/pelanggans/id/{id}', [PelangganApiController::class, 'show']); -// Ambil pelanggan berdasarkan KODE UNDANGAN +// Ambil undangan berdasarkan KODE UNDANGAN Route::get('/pelanggans/code/{code}', [GuestApiController::class, 'getByInvitationCode']); // Simpan pesanan baru diff --git a/proyek-frontend/app/components/templates/Ultah/GuestBook.vue b/proyek-frontend/app/components/templates/Ultah/GuestBook.vue index 8554fca..fce8865 100644 --- a/proyek-frontend/app/components/templates/Ultah/GuestBook.vue +++ b/proyek-frontend/app/components/templates/Ultah/GuestBook.vue @@ -47,27 +47,20 @@ const route = useRoute(); const config = useRuntimeConfig(); const backendUrl = config.public.apiBaseUrl; const invitationCode = route.params.code || ''; -const guest = route.query.guest +const guest = route.query.code - -const messages = ref([]); -const form = ref({ name: '', message: '', attendance: 'hadir' }); - - -// Fungsi untuk mengambil daftar RSVP dari backend -const fetchMessages = async () => { - try { - const response = await fetch(`${backendUrl}/api/rsvp/${invitationCode}`); - if (!response.ok) throw new Error('Gagal mengambil data RSVP'); - - const data = await response.json(); - messages.value = data.data || []; - } catch (error) { - console.error('Error mengambil RSVP:', error); - alert('Terjadi kesalahan saat mengambil data RSVP.'); +const props = defineProps({ + messages: { + type: Array, + required: false, + default: () => [] } -}; +}) +const messages = ref([...props.messages]) // duplikat supaya bisa diubah + + +const form = ref({ name: '', message: '', attendance: 'hadir' }); // Fungsi untuk mengirim data RSVP ke backend const submitMessage = async () => { @@ -84,6 +77,7 @@ const submitMessage = async () => { } try { + console.log('POST to:', `${backendUrl}/api/rsvp/${invitationCode}`, payload) const response = await fetch(`${backendUrl}/api/rsvp/${invitationCode}`, { method: 'POST', headers: { @@ -97,13 +91,14 @@ const submitMessage = async () => { }); - if (!response.ok) { - throw new Error('Gagal menyimpan RSVP'); + if (!response.ok) { + console.log(response) + throw new Error(`Gagal menyimpan RSVP,${response.errors}`); } - + const result = await response.json(); messages.value.push(result.data); // Tambahkan RSVP baru ke daftar - form.value = { name: '', message: '', attendance: 'yes' }; // Reset form + form.value = { name: '', message: '', attendance: 'hadir' }; alert(result.message); // Tampilkan pesan sukses dari backend } catch (error) { console.error('Error menyimpan RSVP:', error); @@ -114,11 +109,11 @@ const submitMessage = async () => { // Fungsi untuk mengatur kelas CSS berdasarkan status kehadiran const getAttendanceClass = (attendance) => { switch (attendance) { - case 'yes': + case 'iya': return 'bg-green-100 text-green-700'; - case 'no': + case 'tidak': return 'bg-red-100 text-red-700'; - case 'maybe': + case 'mungkin': return 'bg-yellow-100 text-yellow-700'; default: return 'bg-gray-100 text-gray-700'; @@ -128,19 +123,14 @@ const getAttendanceClass = (attendance) => { // Fungsi untuk memformat teks kehadiran const formatAttendance = (attendance) => { switch (attendance) { - case 'yes': + case 'iya': return 'Hadir'; - case 'no': + case 'tidak': return 'Tidak Hadir'; - case 'maybe': + case 'mungkin': return 'Mungkin'; default: return attendance; } }; - -// Panggil fetchMessages saat komponen dimuat -onMounted(() => { - fetchMessages(); -}); \ No newline at end of file diff --git a/proyek-frontend/app/pages/p/daftar-tamu.vue b/proyek-frontend/app/pages/p/daftar-tamu.vue index 98b771d..f64b60c 100644 --- a/proyek-frontend/app/pages/p/daftar-tamu.vue +++ b/proyek-frontend/app/pages/p/daftar-tamu.vue @@ -1,8 +1,8 @@ \ No newline at end of file