/** * Update an existing group. * * @param \CachetHQ\Cachet\Models\ComponentGroup $group * * @return \Illuminate\Http\JsonResponse */ public function putGroup(ComponentGroup $group) { $groupData = array_filter(Binput::only(['name', 'order'])); try { $group->update($groupData); } catch (Exception $e) { throw new BadRequestHttpException(); } return $this->item($group); }
/** * Index page view composer. * * @param \Illuminate\Contracts\View\View $view * * @return void */ public function compose(View $view) { $totalComponents = Component::enabled()->count(); $majorOutages = Component::enabled()->status(4)->count(); $isMajorOutage = $majorOutages / $totalComponents >= 0.5; // Default data $withData = ['system_status' => 'info', 'system_message' => trans_choice('cachet.service.bad', $totalComponents), 'favicon' => 'favicon-high-alert']; if ($isMajorOutage) { $withData = ['system_status' => 'danger', 'system_message' => trans_choice('cachet.service.major', $totalComponents), 'favicon' => 'favicon-high-alert']; } elseif (Component::enabled()->notStatus(1)->count() === 0) { // If all our components are ok, do we have any non-fixed incidents? $incidents = Incident::notScheduled()->orderBy('created_at', 'desc')->get(); $incidentCount = $incidents->count(); if ($incidentCount === 0 || $incidentCount >= 1 && (int) $incidents->first()->status === 4) { $withData = ['system_status' => 'success', 'system_message' => trans_choice('cachet.service.good', $totalComponents), 'favicon' => 'favicon']; } } else { if (Component::enabled()->whereIn('status', [2, 3])->count() > 0) { $withData['favicon'] = 'favicon-medium-alert'; } } // Scheduled maintenance code. $scheduledMaintenance = Incident::scheduled()->orderBy('scheduled_at')->get(); // Component & Component Group lists. $usedComponentGroups = Component::enabled()->where('group_id', '>', 0)->groupBy('group_id')->pluck('group_id'); $componentGroups = ComponentGroup::whereIn('id', $usedComponentGroups)->orderBy('order')->get(); $ungroupedComponents = Component::enabled()->where('group_id', 0)->orderBy('order')->orderBy('created_at')->get(); $view->with($withData)->withComponentGroups($componentGroups)->withUngroupedComponents($ungroupedComponents)->withScheduledMaintenance($scheduledMaintenance); }
/** * Seed the component groups table. * * @return void */ protected function seedComponentGroups() { $defaultGroups = [['name' => 'Websites', 'order' => 1]]; ComponentGroup::truncate(); foreach ($defaultGroups as $group) { ComponentGroup::create($group); } }
/** * Updates the order of component groups. * * @return array */ public function postUpdateComponentGroupOrder() { $groupData = Binput::get('ids'); foreach ($groupData as $order => $groupId) { ComponentGroup::find($groupId)->update(['order' => $order + 1]); } return $groupData; }
/** * Seed the component groups table. * * @return void */ protected function seedComponentGroups() { $defaultGroups = [['name' => 'Websites', 'order' => 1, 'collapsed' => 0], ['name' => 'Alt Three', 'order' => 2, 'collapsed' => 1]]; ComponentGroup::truncate(); foreach ($defaultGroups as $group) { ComponentGroup::create($group); } }
/** * Updates the order of component groups. * * @return array */ public function postUpdateComponentGroupOrder() { $groupData = Binput::get('ids'); foreach ($groupData as $order => $groupId) { $group = ComponentGroup::find($groupId); dispatch(new UpdateComponentGroupCommand($group, $group->name, $order + 1, $group->collapsed)); } return $this->collection(ComponentGroup::query()->orderBy('order')->get()); }
/** * Get all groups. * * @return \Illuminate\Http\JsonResponse */ public function getGroups() { $groups = ComponentGroup::query(); $groups->search(Binput::except(['sort', 'order', 'per_page'])); if ($sortBy = Binput::get('sort')) { $direction = Binput::has('order') && Binput::get('order') == 'desc'; $groups->sort($sortBy, $direction); } $groups = $groups->paginate(Binput::get('per_page', 20)); return $this->paginator($groups, Request::instance()); }
/** * Returns the rendered Blade templates. * * @return \Illuminate\View\View */ public function showIndex() { $today = Date::now(); $startDate = Date::now(); segment_page('Status Page'); // Check if we have another starting date if (Binput::has('start_date')) { try { // If date provided is valid $oldDate = Date::createFromFormat('Y-m-d', Binput::get('start_date')); segment_track('Status Page', ['start_date' => $oldDate->format('Y-m-d')]); // If trying to get a future date fallback to today if ($today->gt($oldDate)) { $startDate = $oldDate; } } catch (Exception $e) { // Fallback to today } } $metrics = null; if ($displayMetrics = Setting::get('display_graphs')) { $metrics = Metric::where('display_chart', 1)->get(); } $daysToShow = Setting::get('app_incident_days') ?: 7; $incidentDays = range(0, $daysToShow - 1); $dateTimeZone = Setting::get('app_timezone'); $incidentVisiblity = Auth::check() ? 0 : 1; $allIncidents = Incident::notScheduled()->where('visible', '>=', $incidentVisiblity)->whereBetween('created_at', [$startDate->copy()->subDays($daysToShow)->format('Y-m-d') . ' 00:00:00', $startDate->format('Y-m-d') . ' 23:59:59'])->orderBy('created_at', 'desc')->get()->groupBy(function (Incident $incident) use($dateTimeZone) { return (new Date($incident->created_at))->setTimezone($dateTimeZone)->toDateString(); }); // Add in days that have no incidents foreach ($incidentDays as $i) { $date = (new Date($startDate))->setTimezone($dateTimeZone)->subDays($i); if (!isset($allIncidents[$date->toDateString()])) { $allIncidents[$date->toDateString()] = []; } } // Sort the array so it takes into account the added days $allIncidents = $allIncidents->sortBy(function ($value, $key) { return strtotime($key); }, SORT_REGULAR, true)->all(); // Scheduled maintenance code. $scheduledMaintenance = Incident::scheduled()->orderBy('scheduled_at')->get(); // Component & Component Group lists. $usedComponentGroups = Component::where('group_id', '>', 0)->groupBy('group_id')->lists('group_id'); $componentGroups = ComponentGroup::whereIn('id', $usedComponentGroups)->orderBy('order')->get(); $ungroupedComponents = Component::where('group_id', 0)->orderBy('order')->orderBy('created_at')->get(); $canPageBackward = Incident::notScheduled()->where('created_at', '<', $startDate->format('Y-m-d'))->count() != 0; return View::make('index', ['componentGroups' => $componentGroups, 'ungroupedComponents' => $ungroupedComponents, 'displayMetrics' => $displayMetrics, 'metrics' => $metrics, 'allIncidents' => $allIncidents, 'scheduledMaintenance' => $scheduledMaintenance, 'aboutApp' => Markdown::convertToHtml(Setting::get('app_about')), 'canPageForward' => (bool) $today->gt($startDate), 'canPageBackward' => $canPageBackward, 'previousDate' => $startDate->copy()->subDays($daysToShow)->toDateString(), 'nextDate' => $startDate->copy()->addDays($daysToShow)->toDateString(), 'pageTitle' => Setting::get('app_name') . ' Status']); }
/** * Shows the dashboard view. * * @return \Illuminate\View\View */ public function showDashboard() { $components = Component::orderBy('order')->get(); $incidents = $this->getIncidents(); $subscribers = $this->getSubscribers(); $usedComponentGroups = Component::enabled()->where('group_id', '>', 0)->groupBy('group_id')->pluck('group_id'); $componentGroups = ComponentGroup::whereIn('id', $usedComponentGroups)->orderBy('order')->get(); $ungroupedComponents = Component::enabled()->where('group_id', 0)->orderBy('order')->orderBy('created_at')->get(); $entries = null; if ($feed = $this->feed->latest()) { $entries = array_slice($feed->channel->item, 0, 5); } return View::make('dashboard.index')->withPageTitle(trans('dashboard.dashboard'))->withComponents($components)->withIncidents($incidents)->withSubscribers($subscribers)->withEntries($entries)->withComponentGroups($componentGroups)->withUngroupedComponents($ungroupedComponents); }
/** * Index page view composer. * * @param \Illuminate\Contracts\View\View $view */ public function compose(View $view) { // Default data $withData = ['systemStatus' => 'danger', 'systemMessage' => trans('cachet.service.bad'), 'favicon' => 'favicon-high-alert']; if (Component::notStatus(1)->count() === 0) { // If all our components are ok, do we have any non-fixed incidents? $incidents = Incident::notScheduled()->orderBy('created_at', 'desc')->get(); $incidentCount = $incidents->count(); if ($incidentCount === 0 || $incidentCount >= 1 && (int) $incidents->first()->status === 4) { $withData = ['systemStatus' => 'success', 'systemMessage' => trans('cachet.service.good'), 'favicon' => 'favicon']; } } else { if (Component::whereIn('status', [2, 3])->count() > 0) { $withData['favicon'] = 'favicon-medium-alert'; } } // Scheduled maintenance code. $scheduledMaintenance = Incident::scheduled()->orderBy('scheduled_at')->get(); // Component & Component Group lists. $usedComponentGroups = Component::where('group_id', '>', 0)->groupBy('group_id')->lists('group_id'); $componentGroups = ComponentGroup::whereIn('id', $usedComponentGroups)->orderBy('order')->get(); $ungroupedComponents = Component::where('group_id', 0)->orderBy('order')->orderBy('created_at')->get(); $view->with($withData)->withComponentGroups($componentGroups)->withUngroupedComponents($ungroupedComponents)->withScheduledMaintenance($scheduledMaintenance)->withPageTitle(Setting::get('app_name')); }
/** * Updates a component group. * * @param \CachetHQ\Cachet\Models\ComponentGroup $group * * @return \Illuminate\Http\RedirectResponse */ public function updateComponentGroupAction(ComponentGroup $group) { $groupData = Binput::get('group'); $group->update($groupData); if (!$group->isValid()) { segment_track('Dashboard', ['event' => 'Edit Component Group', 'success' => false]); return Redirect::back()->withInput(Binput::all())->with('title', sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.components.groups.edit.failure')))->with('errors', $group->getErrors()); } segment_track('Dashboard', ['event' => 'Edit Component Group', 'success' => true]); $successMsg = sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.groups.edit.success')); return Redirect::back()->with('success', $successMsg); }
/** * Shows the edit incident view. * * @param \CachetHQ\Cachet\Models\Incident $incident * * @return \Illuminate\View\View */ public function showEditIncidentAction(Incident $incident) { return View::make('dashboard.incidents.edit')->withPageTitle(trans('dashboard.incidents.edit.title') . ' - ' . trans('dashboard.dashboard'))->withIncident($incident)->withComponentsInGroups(ComponentGroup::with('components')->get())->withComponentsOutGroups(Component::where('group_id', 0)->get()); }
/** * Shows the add component view. * * @return \Illuminate\View\View */ public function showAddComponent() { return View::make('dashboard.components.add')->withPageTitle(trans('dashboard.components.add.title') . ' - ' . trans('dashboard.dashboard'))->withGroups(ComponentGroup::all()); }
/** * Get all groups. * * @param \Symfony\Component\HttpFoundation\Request $request * * @return \Illuminate\Http\JsonResponse */ public function getGroups(Request $request) { $groups = ComponentGroup::paginate(Binput::get('per_page', 20)); return $this->paginator($groups, $request); }
/** * Updates a component group. * * @param \CachetHQ\Cachet\Models\ComponentGroup $group * * @return \Illuminate\Http\RedirectResponse */ public function updateComponentGroupAction(ComponentGroup $group) { $groupData = Binput::get('group'); try { $group->update($groupData); } catch (ValidationException $e) { return Redirect::route('dashboard.components.group.edit', ['id' => $group->id])->withInput(Binput::all())->withTitle(sprintf('%s %s', trans('dashboard.notifications.whoops'), trans('dashboard.components.groups.edit.failure')))->withErrors($e->getMessageBag()); } return Redirect::route('dashboard.components.group.edit', ['id' => $group->id])->withSuccess(sprintf('%s %s', trans('dashboard.notifications.awesome'), trans('dashboard.components.groups.edit.success'))); }
/** * Delete an existing group. * * @param \CachetHQ\Cachet\Models\ComponentGroup $group * * @return \Illuminate\Http\JsonResponse */ public function deleteGroup(ComponentGroup $group) { $group->delete(); return $this->noContent(); }
/** * Shows the edit incident view. * * @param \CachetHQ\Cachet\Models\Incident $incident * * @return \Illuminate\View\View */ public function showEditIncidentAction(Incident $incident) { $componentsInGroups = ComponentGroup::with('components')->get(); $componentsOutGroups = Component::where('group_id', 0)->get(); return View::make('dashboard.incidents.edit')->with(['page_title' => trans('dashboard.incidents.edit.title') . ' - ' . trans('dashboard.dashboard'), 'incident' => $incident, 'componentsInGroups' => $componentsInGroups, 'componentsOutGroups' => $componentsOutGroups]); }
/** * Shows the subscription manager page. * * @param string|null $code * * @return \Illuminate\View\View */ public function showManage($code = null) { if ($code === null) { throw new NotFoundHttpException(); } $subscriber = Subscriber::where('verify_code', '=', $code)->first(); $usedComponentGroups = Component::enabled()->where('group_id', '>', 0)->groupBy('group_id')->pluck('group_id'); $componentGroups = ComponentGroup::whereIn('id', $usedComponentGroups)->orderBy('order')->get(); $ungroupedComponents = Component::enabled()->where('group_id', 0)->orderBy('order')->orderBy('created_at')->get(); if (!$subscriber) { throw new BadRequestHttpException(); } return View::make('subscribe.manage')->withUngroupedComponents($ungroupedComponents)->withSubscriber($subscriber)->withSubscriptions($subscriber->subscriptions->pluck('component_id')->all())->withComponentGroups($componentGroups); }
/** * Get all groups. * * @return \Illuminate\Http\JsonResponse */ public function getGroups() { $groups = ComponentGroup::paginate(Binput::get('per_page', 20)); return $this->paginator($groups, Request::instance()); }
/** * Handle the add component group command. * * @param \CachetHQ\Cachet\Bus\Commands\ComponentGroup\AddComponentGroupCommand $command * * @return \CachetHQ\Cachet\Models\ComponentGroup */ public function handle(AddComponentGroupCommand $command) { $group = ComponentGroup::create(['name' => $command->name, 'order' => $command->order, 'collapsed' => $command->collapsed]); event(new ComponentGroupWasAddedEvent($group)); return $group; }