From b15504e009b71392ddecd4d31eed6a41c675fbaa Mon Sep 17 00:00:00 2001 From: "fauzgabriel@gmail.com" Date: Wed, 3 Jun 2026 15:05:52 +0700 Subject: [PATCH] jenis_komoditas model,api controller dan resources --- .../Api/JenisKomoditasController.php | 141 ++++++++++++++++++ .../Controllers/Api/TanamanController.php | 6 +- .../Pertanian/JenisKomoditasResource.php | 26 ++++ app/Models/Pertanian/JenisKomoditas.php | 52 +++++++ routes/api.php | 3 +- 5 files changed, 226 insertions(+), 2 deletions(-) create mode 100644 app/Http/Controllers/Api/JenisKomoditasController.php create mode 100644 app/Http/Resources/Pertanian/JenisKomoditasResource.php create mode 100644 app/Models/Pertanian/JenisKomoditas.php diff --git a/app/Http/Controllers/Api/JenisKomoditasController.php b/app/Http/Controllers/Api/JenisKomoditasController.php new file mode 100644 index 0000000..b1823dc --- /dev/null +++ b/app/Http/Controllers/Api/JenisKomoditasController.php @@ -0,0 +1,141 @@ +integer('size') ?: 10; + + $jenisKomoditasList = JenisKomoditas::when($request->search, function ($q, $search) { + $search = strtolower($search); + $q->whereRaw('lower(nama) like ?', ["%{$search}%"]); + }) + ->when($request->kode, fn($q, $v) => $q->where('kode', $v)); + + if ($request->filled('sort')) { + $dir = str_starts_with($request->sort, '-') ? 'desc' : 'asc'; + $column = ltrim($request->sort, '-'); + + $allowed = ['id', 'nama', 'kode']; + + if (in_array($column, $allowed)) { + $jenisKomoditasList->orderBy($column, $dir); + } + } else { + $jenisKomoditasList->orderBy('nama', 'asc'); + } + + $jenisKomoditasList = $jenisKomoditasList->paginate($size); + + return JenisKomoditasResource::collection($jenisKomoditasList); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request): JsonResponse + { + if (!Gate::any(['petani', 'fasilitator', 'super_admin'])) { + abort(403); + } + + $validated = $request->validate([ + 'nama' => ['required', 'string', 'max:255'], + 'kode' => ['required', 'string', 'max:50', 'unique:jenis_komoditas,kode'], + 'keterangan' => ['nullable', 'string'], + ]); + + $jenisKomoditas = JenisKomoditas::create($validated); + + return (new JenisKomoditasResource($jenisKomoditas)) + ->response() + ->setStatusCode(201); + } + + /** + * Display the specified resource. + */ + public function show(string $id): JsonResponse + { + if (!Gate::any(['petani', 'fasilitator', 'super_admin'])) { + abort(403); + } + + $jenisKomoditas = JenisKomoditas::findOrFail($id); + + return (new JenisKomoditasResource($jenisKomoditas))->response(); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, string $id): JsonResponse + { + if (!Gate::any(['petani', 'fasilitator', 'super_admin'])) { + abort(403); + } + + $jenisKomoditas = JenisKomoditas::findOrFail($id); + + $validated = $request->validate([ + 'nama' => ['required', 'string', 'max:255'], + 'kode' => ['required', 'string', 'max:50', Rule::unique('jenis_komoditas', 'kode')->ignore($jenisKomoditas->id)], + 'keterangan' => ['nullable', 'string'], + ]); + + $jenisKomoditas->update($validated); + + return (new JenisKomoditasResource($jenisKomoditas))->response(); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id): JsonResponse + { + if (!Gate::any(['petani', 'fasilitator', 'super_admin'])) { + abort(403); + } + + $jenisKomoditas = JenisKomoditas::findOrFail($id); + $jenisKomoditas->delete(); + + return response()->json(null, 204); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/TanamanController.php b/app/Http/Controllers/Api/TanamanController.php index 5a9736e..683d162 100644 --- a/app/Http/Controllers/Api/TanamanController.php +++ b/app/Http/Controllers/Api/TanamanController.php @@ -116,15 +116,19 @@ class TanamanController extends Controller }), ], 'latitude' => ['nullable', 'numeric', 'between:-90,90', 'required_with:longitude'], - 'longitude' => ['nullable', 'numeric', 'between:-180,180', 'required_with:latitude'], + 'longitude' => ['nullable ', 'numeric', 'between:-180,180', 'required_with:latitude'], 'kondisi_tanaman' => ['nullable', 'string', new Enum(KondisiTanaman::class)], 'uid' => ['required', 'string'], + 'jenis_komoditas_id' => ['nullable', 'exists:jenis_komoditas,id'], + 'komoditas_kode' => ['nullable', 'string', 'max:255'], ]); $tanaman = Tanaman::create([ ...$validated, 'profile_id' => $profile->id, 'uid' => $validated['uid'] ?? $request->input('uid'), + 'komoditas_kode' => $validated['komoditas_kode'] ?? $request->input('komoditas_kode'), + 'jenis_komoditas_id' => $validated['jenis_komoditas_id'] ?? $request->input('jenis_komoditas_id'), ]); return (new TanamanResource($tanaman)) diff --git a/app/Http/Resources/Pertanian/JenisKomoditasResource.php b/app/Http/Resources/Pertanian/JenisKomoditasResource.php new file mode 100644 index 0000000..f35045c --- /dev/null +++ b/app/Http/Resources/Pertanian/JenisKomoditasResource.php @@ -0,0 +1,26 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'id' => $this->id, + 'nama' => $this->nama, + 'kode' => $this->kode, + 'keterangan' => $this->keterangan, + 'created_at' => $this->created_at?->toIso8601String(), + 'updated_at' => $this->updated_at?->toIso8601String(), + ]; + } +} \ No newline at end of file diff --git a/app/Models/Pertanian/JenisKomoditas.php b/app/Models/Pertanian/JenisKomoditas.php new file mode 100644 index 0000000..5ae17ab --- /dev/null +++ b/app/Models/Pertanian/JenisKomoditas.php @@ -0,0 +1,52 @@ + + */ + protected $fillable = [ + 'nama', + 'kode', + 'keterangan', + ]; + + /** + * Atribut yang harus dikonversi ke tipe data lain (casting). + * + * @var array + */ + protected $casts = [ + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + 'deleted_at' => 'datetime', + ]; + + /** + * Relasi ke model Komoditas atau Tanaman (jika ada). + * Contoh: Satu Jenis Komoditas memiliki banyak data Tanaman/Komoditas turunannya. + */ + public function tanaman(): HasMany + { + return $this->hasMany(Tanaman::class, 'jenis_komoditas_id', 'id'); + } +} \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index 98562db..c5ccf8e 100644 --- a/routes/api.php +++ b/routes/api.php @@ -50,7 +50,8 @@ Route::middleware('auth:sanctum') ->name('master.') ->prefix('master') ->group(function () { - + + Route::apiResource('/jenis-komoditas', \App\Http\Controllers\Api\JenisKomoditasController::class); Route::apiResource('/komoditas', \App\Http\Controllers\Api\KomoditasController::class)->only(['index', 'show']); Route::apiResource('/provinsi', \App\Http\Controllers\Api\ProvinsiController::class)->only(['index', 'show']);