validate([ 'date' => ['required', 'date'], 'value' => ['required', 'int', 'min:1', 'max:1000'] ]); $rainfall = $request->user()->rainfalls()->create($data); return response()->json(new RainfallResource($rainfall), 201); } /** * Display the specified resource. */ public function show(Rainfall $rainfall) { // } /** * Update the specified resource in storage. */ public function update(Request $request, Rainfall $rainfall) { // } /** * Remove the specified resource from storage. */ public function destroy(Rainfall $rainfall) { // } public function lastRainfalls(Request $request) { $rainfalls = $request->user() ->rainfalls() ->orderByDesc('date') ->limit(5) ->get(); return response()->json(RainfallResource::collection($rainfalls)); } public function graphValue(Request $request) { $data = $request->validate([ 'start' => 'date', 'end' => 'date', ]); // dd($data, $request); $rainfalls = $request->user() ->rainfalls() ->whereBetween('date', [$data['start'], $data['end']]) ->orderBy('date') ->get() ->groupBy('date'); $results = collect(); $index = 0; foreach ($rainfalls as $date => $rainfall) { if ($index === 0 && $date !== $data['start']) { [$results, $index] = $this->addEmptyDays($results, $index, $data['start'], (new Carbon($date))->subDay()); } elseif ($index > 0 && (new Carbon($results->last()['date']))->addDay()->format('Y-m-d') !== $date) { [$results, $index] = $this->addEmptyDays($results, $index, (new Carbon($results->last()['date']))->addDay(), (new Carbon($date))->subDay()); } $results->push([ 'id' => $index++, 'date' => $date, 'value' => $rainfall->sum('value'), ]); } if ($results->last()['date'] !== $data['end']) { [$results, $index] = $this->addEmptyDays($results, $index, (new Carbon($results->last()['date']))->addDay(), $data['end']); } return response()->json($results); } private function addEmptyDays(\Illuminate\Support\Collection $results, int $index, Carbon|string $start, Carbon|string $end) { foreach (CarbonPeriod::create($start, $end) as $date) { $results->push([ 'id' => $index++, 'date' => $date->format('Y-m-d'), 'value' => 0, ]); } return [$results, $index]; } }