public function update(Request $request, $event_id) { $users_ids = explode(",", $request->input('user_id')); $roster_data = Roster::where('id', '=', $event_id)->first(); $roster = Roster::find($event_id); if (!Common::isInTheFuture(Common::formatDateTimeForSQL($roster_data->start_time))) { return response()->json(['range' => 'You cannot update past event'], 422); } $status = $request->input('status'); $supervisor = $request->input('supervisor'); if (Auth::user()->role != "worker") { $this->validate($request, ['time_range' => ['regex:/[0-9]{1,2}\\/[0-9]{1,2}\\/[0-9]{4}\\s[0-9]{1,2}:[0-9]{2}\\s(AM|PM)\\s-\\s[0-9]{1,2}\\/[0-9]{1,2}\\/[0-9]{4}\\s[0-9]{1,2}:[0-9]{2}\\s(AM|PM)/'], 'address' => 'required', 'coordinates' => 'required', 'name' => 'required']); list($start, $end) = explode(' - ', $request->input('time_range')); $overlapping_users = []; foreach ($users_ids as $user_id) { if (Roster::overlap($user_id, Common::formatDateTimeForSQL($start), Common::formatDateTimeForSQL($end), $event_id) === true) { $overlapping_users[] = User::getNameById($user_id); } } if (count($overlapping_users)) { return response()->json(['range' => 'The time range overlaps for ' . implode(', ', $overlapping_users) . '.'], 422); } foreach ($users_ids as $user_id) { $roster->users()->updateExistingPivot($user_id, ['status' => $status[$user_id] ?? 'pending', 'is_supervisor' => $supervisor[$user_id] ?? 0]); } $roster->name = $request->input('name'); $roster->start_time = Common::formatDateTimeForSQL($start); $roster->end_time = Common::formatDateTimeForSQL($end); $roster->other = $request->input('other'); $roster->address = $request->input('address'); $roster->coordinates = $request->input('coordinates'); if ($roster_data->start_time != $start) { foreach ($users_ids as $user_id) { Notification::add($user_id, 'UPDATE_EVENT', ['start' => Common::formatDateTimeForSQL($start), 'end' => Common::formatDateTimeForSQL($end), 'title' => $roster->name, 'admin_id' => Auth::user()->id]); } } else { if ($roster_data->end_time != $end) { foreach ($users_ids as $user_id) { Notification::add($user_id, 'UPDATE_EVENT', ['start' => Common::formatDateTimeForSQL($start), 'end' => Common::formatDateTimeForSQL($end), 'title' => $roster->name, 'admin_id' => Auth::user()->id]); } } } } else { $id = Auth::user()->id; $status = $status[$id]; $roster_status = Roster::where('id', '=', $event_id)->with(['users' => function ($q) use($id) { $q->select('status', 'user_id', 'roster_id')->where('users.id', '=', $id); }])->first()->users[0]->status; if ($status == "canceled") { return response()->json(['range' => 'You are not authorized to cancel event'], 422); } if ($roster_status != 'pending') { return response()->json(['range' => 'You cannot update this event'], 422); } $roster->users()->updateExistingPivot(Auth::user()->id, ['status' => $status]); } $roster->save(); return response()->json(['Data is updated'], 200); }