packages feed

ihp-ide-1.5.0: IHP/IDE/SchemaDesigner/Controller/Policies.hs

module IHP.IDE.SchemaDesigner.Controller.Policies where

import IHP.IDE.Prelude
import IHP.IDE.ToolServer.Types

import IHP.IDE.SchemaDesigner.View.Policies.New
import IHP.IDE.SchemaDesigner.View.Policies.Edit

import IHP.Postgres.Types
import IHP.IDE.SchemaDesigner.View.Layout (schemaDesignerLayout, findStatementByName)
import IHP.IDE.SchemaDesigner.Controller.Helper


import qualified IHP.IDE.SchemaDesigner.SchemaOperations as SchemaOperations

instance Controller PoliciesController where
    beforeAction = setLayout schemaDesignerLayout

    action NewPolicyAction { tableName } = do
        statements <- readSchema
        let (Just table) = findStatementByName tableName statements
        let policy = SchemaOperations.suggestPolicy statements table
        let columns = (unsafeGetCreateTable table).columns
        render NewPolicyView { .. }

    action EditPolicyAction { tableName, policyName } = do
        statements <- readSchema
        let (Just policy) = statements
                |> find \case
                    CreatePolicy { name = policyName', tableName = tableName' } -> policyName' == policyName && tableName' == tableName
                    otherwise                                                   -> False
        let table = findStatementByName tableName statements
        let columns = maybe [] ((.columns) . unsafeGetCreateTable) table

        render EditPolicyView { .. }

    action UpdatePolicyAction = do
        statements <- readSchema
        let tableName = param "tableName"
        let name = param "name"

        
        updateSchema $ SchemaOperations.updatePolicy SchemaOperations.UpdatePolicyOptions
                { currentName = name
                , tableName = tableName
                , name = param "policyName"
                , using = param "using"
                , check = param "check"
                }

        redirectTo ShowTableAction { .. }
    
    action CreatePolicyAction = do
        statements <- readSchema
        let tableName = param "tableName"
        
        let addPolicy = SchemaOperations.addPolicy SchemaOperations.AddPolicyOptions
                { tableName = tableName
                , name = param "policyName"
                , using = param "using"
                , check = param "check"
                }
        let enableRLS = SchemaOperations.enableRowLevelSecurity tableName

        updateSchema (enableRLS . addPolicy)

        redirectTo ShowTableAction { .. }

    action DeletePolicyAction { tableName, policyName } = do
        let deletePolicy = SchemaOperations.deletePolicy SchemaOperations.DeletePolicyOptions { tableName, policyName }
        let disableRLSIfNoPolicies = SchemaOperations.disableRowLevelSecurityIfNoPolicies tableName
        updateSchema (disableRLSIfNoPolicies . deletePolicy)

        redirectTo ShowTableAction { .. }