sqlc-hs-0.2.0.0: test/golden/out/Pulse/Database/CreateIncidentWithEscalation.hs
{- This file was auto-generated from queries.sql by sqlc-hs. -}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeFamilies #-}
module Pulse.Database.CreateIncidentWithEscalation where
import Pulse.Database.Internal (Query(..), Enum, Params, Result)
import qualified Database.PostgreSQL.Simple
import qualified Database.PostgreSQL.Simple.FromRow
import qualified Database.PostgreSQL.Simple.ToField
import qualified Database.PostgreSQL.Simple.ToRow
import qualified Data.Int
import qualified Data.Text
import qualified GHC.Base
import qualified Pulse.Database.Types
import qualified Data.Time
import qualified Data.Foldable
query_createIncidentWithEscalation :: Query "createIncidentWithEscalation" ":one"
query_createIncidentWithEscalation = Query "WITH incident_result AS (\n INSERT INTO incidents (organization_id, display_name, description, failing_monitor, status)\n VALUES (?, ?, ?, ?, 'unacknowledged')\n ON CONFLICT (organization_id, failing_monitor)\n WHERE incidents.status <> 'resolved'\n DO UPDATE SET updated_at = NOW()\n RETURNING id, organization_id, display_name, description, failing_monitor, status, lead_by, acknowledged_by, unacknowledged_at, created_at, updated_at\n),\nescalation_policy AS (\n SELECT\n COALESCE(monitors.escalation_policy_id, def_ep.id) as policy_id,\n monitors.threshold_failures as monitor_threshold\n FROM incident_result\n LEFT JOIN monitors ON incident_result.failing_monitor = monitors.id\n LEFT JOIN escalation_policies def_ep ON incident_result.organization_id = def_ep.organization_id\n AND def_ep.is_default = TRUE AND NOT def_ep.is_deleted\n),\nfirst_step AS (\n SELECT escalation_steps.delay_interval\n FROM escalation_policy\n INNER JOIN escalation_steps ON escalation_policy.policy_id = escalation_steps.escalation_policy_id\n WHERE escalation_steps.step_order = 0\n LIMIT 1\n),\nescalation_result AS (\n INSERT INTO incident_escalations (id, escalation_policy_id, threshold, failed_checks, next_escalation_at)\n SELECT\n incident_result.id,\n escalation_policy.policy_id,\n escalation_policy.monitor_threshold, -- use monitor's threshold\n 1, -- start with 1 failed check\n CASE\n WHEN escalation_policy.monitor_threshold <= 1 THEN incident_result.created_at + COALESCE(first_step.delay_interval, INTERVAL '1 minute')\n ELSE NULL -- Don't schedule escalation until threshold is exceeded\n END\n FROM incident_result\n CROSS JOIN escalation_policy\n LEFT JOIN first_step ON true\n ON CONFLICT (id)\n DO UPDATE SET\n failed_checks = incident_escalations.failed_checks + 1,\n next_escalation_at = CASE\n WHEN incident_escalations.failed_checks + 1 >= incident_escalations.threshold\n AND incident_escalations.next_escalation_at IS NULL\n THEN NOW() + INTERVAL '1 minute'\n ELSE incident_escalations.next_escalation_at\n END,\n updated_at = NOW()\n RETURNING id, escalation_policy_id, current_step, escalation_started_at, next_escalation_at, is_active, threshold, failed_checks, incident_notification_sent_at, resolved_notification_sent_at, acknowledged_notification_sent_at, created_at, updated_at\n)\nSELECT incident_result.id, incident_result.organization_id, incident_result.display_name, incident_result.description, incident_result.failing_monitor, incident_result.status, incident_result.lead_by, incident_result.acknowledged_by, incident_result.unacknowledged_at, incident_result.created_at, incident_result.updated_at FROM incident_result"
data instance Params "createIncidentWithEscalation" = Params_createIncidentWithEscalation
{
incidents_organization_id :: Data.Int.Int32,
incidents_display_name :: Data.Text.Text,
incidents_description :: GHC.Base.Maybe Data.Text.Text,
incidents_failing_monitor :: GHC.Base.Maybe Data.Int.Int32
}
data instance Result "createIncidentWithEscalation" = Result_createIncidentWithEscalation
{
incident_result_id :: !(Data.Int.Int64),
incident_result_organization_id :: !(Data.Int.Int32),
incident_result_display_name :: !(Data.Text.Text),
incident_result_description :: !(GHC.Base.Maybe Data.Text.Text),
incident_result_failing_monitor :: !(GHC.Base.Maybe Data.Int.Int32),
incident_result_status :: !((Pulse.Database.Types.Enum "incident_status")),
incident_result_lead_by :: !(GHC.Base.Maybe Data.Int.Int32),
incident_result_acknowledged_by :: !(GHC.Base.Maybe Data.Int.Int32),
incident_result_unacknowledged_at :: !((Maybe Data.Time.UTCTime)),
incident_result_created_at :: !((Maybe Data.Time.UTCTime)),
incident_result_updated_at :: !((Maybe Data.Time.UTCTime))
}
instance Database.PostgreSQL.Simple.ToRow.ToRow (Params "createIncidentWithEscalation") where
toRow Params_createIncidentWithEscalation{..} =
[
Database.PostgreSQL.Simple.ToField.toField incidents_organization_id,
Database.PostgreSQL.Simple.ToField.toField incidents_display_name,
Database.PostgreSQL.Simple.ToField.toField incidents_description,
Database.PostgreSQL.Simple.ToField.toField incidents_failing_monitor
]
instance Database.PostgreSQL.Simple.FromRow.FromRow (Result "createIncidentWithEscalation") where
fromRow =
pure Result_createIncidentWithEscalation
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field
<*> Database.PostgreSQL.Simple.FromRow.field