json( Produk::withCount('items')->with('foto')->get() ); } /** * Store a newly created resource in storage. */ public function store(Request $request) { $validated = $request->validate([ 'nama' => 'required|string|max:100', 'kategori' => 'required|in:cincin,gelang,kalung,anting', 'berat' => 'required|numeric', 'kadar' => 'required|integer', 'harga_per_gram' => 'required|numeric', 'harga_jual' => 'required|numeric', 'id_user' => 'nullable|exists:users,id', // untuk mengambil foto sementara ], [ 'nama.required' => 'Nama produk harus diisi.', 'kategori.in' => 'Kategori harus salah satu dari cincin, gelang, kalung, atau anting.', 'berat.required' => 'Berat harus diisi.', 'kadar.required' => 'Kadar harus diisi', 'harga_per_gram.required' => 'Harga per gram harus diisi', 'harga_jual.required' => 'Harga jual harus diisi' ]); DB::beginTransaction(); try { // Create produk $produk = Produk::create([ 'nama' => $validated['nama'], 'kategori' => $validated['kategori'], 'berat' => $validated['berat'], 'kadar' => $validated['kadar'], 'harga_per_gram' => $validated['harga_per_gram'], 'harga_jual' => $validated['harga_jual'], ]); // Pindahkan foto sementara ke foto permanen jika ada if (isset($validated['id_user'])) { $fotoSementara = FotoSementara::where('id_user', $validated['id_user'])->get(); foreach ($fotoSementara as $fs) { Foto::create([ 'id_produk' => $produk->id, 'url' => $fs->url ]); // Hapus foto sementara setelah dipindah $fs->delete(); } } DB::commit(); return response()->json([ 'message' => 'Produk berhasil dibuat', 'data' => $produk->load('foto') ], 201); } catch (\Exception $e) { DB::rollback(); return response()->json([ 'message' => 'Gagal membuat produk', 'error' => $e->getMessage() ], 500); } } /** * Display the specified resource. */ public function show(int $id) { $produk = Produk::with('foto', 'items')->findOrFail($id); return response()->json($produk); } /** * Update the specified resource in storage. */ public function update(Request $request, int $id) { $validated = $request->validate([ 'nama' => 'required|string|max:100', 'kategori' => 'required|in:cincin,gelang,kalung,anting', 'berat' => 'required|numeric', 'kadar' => 'required|integer', 'harga_per_gram' => 'required|numeric', 'harga_jual' => 'required|numeric', 'id_user' => 'nullable|exists:users,id', // untuk mengambil foto sementara baru 'hapus_foto_lama' => 'nullable|boolean', // flag untuk menghapus foto lama ], [ 'nama.required' => 'Nama produk harus diisi.', 'kategori.in' => 'Kategori harus salah satu dari cincin, gelang, kalung, atau anting.', 'berat.required' => 'Berat harus diisi.', 'kadar.required' => 'Kadar harus diisi', 'harga_per_gram.required' => 'Harga per gram harus diisi', 'harga_jual.required' => 'Harga jual harus diisi' ]); DB::beginTransaction(); try { $produk = Produk::findOrFail($id); // Update data produk $produk->update([ 'nama' => $validated['nama'], 'kategori' => $validated['kategori'], 'berat' => $validated['berat'], 'kadar' => $validated['kadar'], 'harga_per_gram' => $validated['harga_per_gram'], 'harga_jual' => $validated['harga_jual'], ]); // Hapus foto lama jika diminta if (isset($validated['hapus_foto_lama']) && $validated['hapus_foto_lama']) { foreach ($produk->foto as $foto) { // Hapus file fisik $relativePath = str_replace(asset('storage') . '/', '', $foto->url); if (Storage::disk('public')->exists($relativePath)) { Storage::disk('public')->delete($relativePath); } $foto->delete(); } } // Tambahkan foto baru dari foto sementara jika ada if (isset($validated['id_user'])) { $fotoSementara = FotoSementara::where('id_user', $validated['id_user'])->get(); foreach ($fotoSementara as $fs) { Foto::create([ 'id_produk' => $produk->id, 'url' => $fs->url ]); // Hapus foto sementara setelah dipindah $fs->delete(); } } DB::commit(); return response()->json([ 'message' => 'Produk berhasil diubah', 'data' => $produk->load('foto') ], 200); } catch (\Exception $e) { DB::rollback(); return response()->json([ 'message' => 'Gagal mengubah produk', 'error' => $e->getMessage() ], 500); } } /** * Remove the specified resource from storage. */ public function destroy(int $id) { DB::beginTransaction(); try { $produk = Produk::findOrFail($id); // Hapus file foto dari storage foreach ($produk->foto as $foto) { $relativePath = str_replace(asset('storage') . '/', '', $foto->url); if (Storage::disk('public')->exists($relativePath)) { Storage::disk('public')->delete($relativePath); } $foto->delete(); } // Hapus produk (soft delete) $produk->delete(); DB::commit(); return response()->json([ 'message' => 'Produk berhasil dihapus.' ], 200); } catch (\Exception $e) { DB::rollback(); return response()->json([ 'message' => 'Gagal menghapus produk', 'error' => $e->getMessage() ], 500); } } }