json(self::present($request->attributes->get('user'))); } public function update(Request $request): JsonResponse { /** @var User $user */ $user = $request->attributes->get('user'); $data = $request->validate([ 'tz' => ['sometimes', 'string', Rule::in(\DateTimeZone::listIdentifiers())], 'quiet_start' => ['sometimes', 'date_format:H:i'], 'quiet_end' => ['sometimes', 'date_format:H:i'], ]); $start = $data['quiet_start'] ?? substr($user->quiet_start, 0, 5); $end = $data['quiet_end'] ?? substr($user->quiet_end, 0, 5); if ($end >= $start) { throw \Illuminate\Validation\ValidationException::withMessages([ 'quiet_end' => 'Тихие часы должны переходить через полночь: quiet_end раньше quiet_start', ]); } $user->fill([ 'tz' => $data['tz'] ?? $user->tz, 'quiet_start' => $start.':00', 'quiet_end' => $end.':00', ])->save(); return response()->json(self::present($user)); } public function heartbeat(Request $request): Response { /** @var User $user */ $user = $request->attributes->get('user'); Cache::put("heartbeat:{$user->id}", true, config('hado.web_heartbeat_ttl')); return response()->noContent(); } /** @return array */ public static function present(User $user): array { return [ 'login' => $user->login, 'tz' => $user->tz, 'quiet_start' => substr($user->quiet_start, 0, 5), 'quiet_end' => substr($user->quiet_end, 0, 5), 'badge' => $user->events()->whereIn('state', [EventState::Today->value, EventState::Overdue->value])->count(), ]; } }