module Application.Helper.TypeRegistry where import IHP.Prelude import IHP.ModelSupport import Generated.Types import Web.Routes () import Database.PostgreSQL.Simple (Only(..)) -- | Validate that a type name exists in widget_type_registry with status='active'. validateWidgetType :: (?modelContext :: ModelContext) => Text -> IO (Either Text ()) validateWidgetType name = do rows <- sqlQuery "SELECT COUNT(*) FROM widget_type_registry WHERE name = ? AND status = 'active'" (Only name) case rows of [Only (n :: Int)] | n > 0 -> pure (Right ()) _ -> pure (Left ("Widget type '" <> name <> "' is not registered. Register it in the Type Registry or choose an existing type.")) -- | Validate that a type name exists in event_type_registry with status='active'. validateEventType :: (?modelContext :: ModelContext) => Text -> IO (Either Text ()) validateEventType name = do rows <- sqlQuery "SELECT COUNT(*) FROM event_type_registry WHERE name = ? AND status = 'active'" (Only name) case rows of [Only (n :: Int)] | n > 0 -> pure (Right ()) _ -> pure (Left ("Event type '" <> name <> "' is not registered. Register it via the hub capability manifest before submitting.")) -- | Validate that a name exists in annotation_category_registry with status='active'. validateAnnotationCategory :: (?modelContext :: ModelContext) => Text -> IO (Either Text ()) validateAnnotationCategory name = do rows <- sqlQuery "SELECT COUNT(*) FROM annotation_category_registry WHERE name = ? AND status = 'active'" (Only name) case rows of [Only (n :: Int)] | n > 0 -> pure (Right ()) _ -> pure (Left ("Annotation category '" <> name <> "' is not registered. Register it in the Type Registry.")) -- | Validate that a name exists in policy_scope_registry with status='active'. validatePolicyScope :: (?modelContext :: ModelContext) => Text -> IO (Either Text ()) validatePolicyScope name = do rows <- sqlQuery "SELECT COUNT(*) FROM policy_scope_registry WHERE name = ? AND status = 'active'" (Only name) case rows of [Only (n :: Int)] | n > 0 -> pure (Right ()) _ -> pure (Left ("Policy scope '" <> name <> "' is not registered. Register it in the Type Registry.")) -- | Fetch all active widget types for use in select dropdowns. -- Returns (framework-level types, hub-owned types) separated. activeWidgetTypes :: (?modelContext :: ModelContext) => IO ([WidgetTypeRegistry], [WidgetTypeRegistry]) activeWidgetTypes = do all' <- sqlQuery "SELECT * FROM widget_type_registry WHERE status = 'active' ORDER BY owner_hub_id NULLS FIRST, label ASC" () let (framework, owned) = partition (\r -> r.ownerHubId == Nothing) all' pure (framework, owned) -- | Fetch all active event types for use in select dropdowns. activeEventTypes :: (?modelContext :: ModelContext) => IO [EventTypeRegistry] activeEventTypes = sqlQuery "SELECT * FROM event_type_registry WHERE status = 'active' ORDER BY label ASC" () -- | Fetch all active annotation categories for use in select dropdowns. activeAnnotationCategories :: (?modelContext :: ModelContext) => IO [AnnotationCategoryRegistry] activeAnnotationCategories = sqlQuery "SELECT * FROM annotation_category_registry WHERE status = 'active' ORDER BY label ASC" () -- | Fetch all active policy scopes for use in select dropdowns. activePolicyScopes :: (?modelContext :: ModelContext) => IO [PolicyScopeRegistry] activePolicyScopes = sqlQuery "SELECT * FROM policy_scope_registry WHERE status = 'active' ORDER BY label ASC" ()