module Web.Controller.FederatedGovernance where import Web.Types import Web.View.FederatedGovernance.Dashboard import Generated.Types import IHP.Prelude import IHP.ControllerPrelude import Data.Time.Clock (addUTCTime, getCurrentTime) import Data.Aeson (decode) import qualified Data.ByteString.Lazy as LBS import Data.Text.Encoding (encodeUtf8) instance Controller FederatedGovernanceController where beforeAction = ensureIsUser action FederatedGovernanceDashboardAction = autoRefresh do hubs <- query @Hub |> orderByAsc #name |> fetch widgets <- query @Widget |> fetch ownerships <- query @WidgetOwnership |> fetch rules <- query @HubRoutingRule |> filterWhere (#status, "active") |> fetch now <- getCurrentTime let thirtyDaysAgo = addUTCTime (negate $ 30 * 86400) now ninetyDaysAgo = addUTCTime (negate $ 90 * 86400) now -- Candidates routed cross-hub in last 30 days routedCandidates <- sqlQuery "SELECT * FROM requirement_candidates WHERE routed_to_hub_id IS NOT NULL AND created_at >= ?" (Only thirtyDaysAgo) -- Active overlays overlays <- query @FederatedPolicyOverlay |> filterWhere (#status, "active") |> fetch -- All decisions for policy compliance check allDecisions <- query @DecisionRecord |> fetch allPolicies <- query @PolicyReference |> fetch -- Active stewardship roles stewards <- query @StewardshipRole |> filterWhereSql (#revokedAt, "IS NULL") |> fetch -- Archive records in last 90 days recentArchives <- sqlQuery "SELECT * FROM archive_records WHERE archived_at >= ?" (Only ninetyDaysAgo) render FederatedGovernanceDashboardView { hubs, widgets, ownerships, rules, routedCandidates , overlays, allDecisions, allPolicies, stewards, recentArchives }