json( Produk::withCount('items')->with('foto', 'kategori')->get() ); } /** * Store a newly created resource in storage. */ public function store(Request $request) { $user = $request->user(); if (!$user) { return response()->json(['message' => 'Unauthorized'], 401); } $validated = $request->validate( [ 'nama' => 'required|string|max:100', 'id_kategori' => 'required|exists:kategoris,id', 'berat' => 'required|numeric', 'kadar' => 'required|integer', 'harga_per_gram' => 'required|numeric', 'harga_jual' => 'required|numeric', ], [ 'nama.required' => 'Nama produk harus diisi.', 'id_kategori' => 'Kategori tidak valid.', '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::create($validated); $fotoSementara = FotoSementara::where('id_user', $user->id)->get(); foreach ($fotoSementara as $fs) { Foto::create([ 'id_produk' => $produk->id, 'url' => $fs->url ]); $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', 'kategori')->findOrFail($id); return response()->json($produk); } /** * Get the specified resource to edit. */ public function edit(Request $request, int $id) { $user = $request->user(); if (!$user) { return response()->json(['message' => 'Unauthorized'], 401); } $produk = Produk::with('foto', 'kategori')->findOrFail($id); $foto_sementara = []; foreach ($produk->foto as $foto) { $foto_sementara[] = FotoSementara::create([ 'id_user' => $user->id, 'url' => $foto->url ]); } return response()->json($produk); } /** * Update the specified resource in storage. */ public function update(Request $request, int $id) { $user = $request->user(); if (!$user) { return response()->json(['message' => 'Unauthorized'], 401); } $validated = $request->validate( [ 'nama' => 'required|string|max:100', 'id_kategori' => 'required|exists:kategoris,id', 'berat' => 'required|numeric', 'kadar' => 'required|integer', 'harga_per_gram' => 'required|numeric', 'harga_jual' => 'required|numeric', ], [ 'nama.required' => 'Nama produk harus diisi.', 'id_kategori' => 'Kategori tidak valid.', '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'], 'id_kategori' => $validated['id_kategori'], 'berat' => $validated['berat'], 'kadar' => $validated['kadar'], 'harga_per_gram' => $validated['harga_per_gram'], 'harga_jual' => $validated['harga_jual'], ]); // Hapus foto lama foreach ($produk->foto as $foto) { // Hapus file fisik jika memungkinkan try { $relativePath = str_replace(asset('storage') . '/', '', $foto->url); if (Storage::disk('public')->exists($relativePath)) { Storage::disk('public')->delete($relativePath); } } catch (\Exception $e) { // Maklum Pak, soalnya kadang url aja, ga ada file fisiknya #Bagas } $foto->delete(); } $fotoSementara = FotoSementara::where('id_user', $user->id)->get(); foreach ($fotoSementara as $fs) { Foto::create([ 'id_produk' => $produk->id, 'url' => $fs->url ]); $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(); } $produk->items()->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); } } }