module IHP.IDE.SchemaDesigner.Controller.Indexes where

import IHP.ControllerPrelude
import IHP.IDE.ToolServer.Types

import IHP.IDE.SchemaDesigner.View.Indexes.Edit

import IHP.IDE.SchemaDesigner.View.Layout (schemaDesignerLayout)
import IHP.IDE.SchemaDesigner.Controller.Helper

import qualified IHP.IDE.SchemaDesigner.SchemaOperations as SchemaOperations

instance Controller IndexesController where
    beforeAction :: (?context::ControllerContext, ?modelContext::ModelContext,
 ?theAction::IndexesController) =>
IO ()
beforeAction = (?context::ControllerContext) =>
((?context::ControllerContext) => Layout) -> IO ()
((?context::ControllerContext) => Layout) -> IO ()
setLayout (?context::ControllerContext) => Layout
Layout
Html -> Html
schemaDesignerLayout

    action :: (?context::ControllerContext, ?modelContext::ModelContext,
 ?theAction::IndexesController) =>
IndexesController -> IO ()
action EditIndexAction { Text
tableName :: Text
$sel:tableName:EditIndexAction :: IndexesController -> Text
tableName, Text
indexName :: Text
$sel:indexName:EditIndexAction :: IndexesController -> Text
indexName } = do
        [Statement]
statements <- IO [Statement]
forall controller.
(?context::ControllerContext, ?modelContext::ModelContext,
 ?theAction::controller) =>
IO [Statement]
readSchema
        EditIndexView -> IO ()
forall view.
(View view, ?context::ControllerContext) =>
view -> IO ()
render EditIndexView { [Statement]
Text
tableName :: Text
indexName :: Text
statements :: [Statement]
$sel:statements:EditIndexView :: [Statement]
$sel:indexName:EditIndexView :: Text
$sel:tableName:EditIndexView :: Text
.. }
    
    action UpdateIndexAction { Text
$sel:tableName:EditIndexAction :: IndexesController -> Text
tableName :: Text
tableName, Text
$sel:indexName:EditIndexAction :: IndexesController -> Text
indexName :: Text
indexName } = do
        [Statement]
statements <- IO [Statement]
forall controller.
(?context::ControllerContext, ?modelContext::ModelContext,
 ?theAction::controller) =>
IO [Statement]
readSchema
        let options :: UpdateIndexOptions
options = SchemaOperations.UpdateIndexOptions
                { $sel:indexName:UpdateIndexOptions :: Text
indexName = Text
indexName
                , $sel:newIndexName:UpdateIndexOptions :: Text
newIndexName = ByteString -> Text
forall valueType.
(?context::ControllerContext, ParamReader valueType) =>
ByteString -> valueType
param ByteString
"newIndexName"
                , $sel:indexColumns:UpdateIndexOptions :: [IndexColumn]
indexColumns = ByteString -> [IndexColumn]
forall valueType.
(?context::ControllerContext, ParamReader valueType) =>
ByteString -> valueType
param ByteString
"indexColumns"
                }
        ([Statement] -> [Statement]) -> IO ()
forall controller.
(?context::ControllerContext, ?modelContext::ModelContext,
 ?theAction::controller) =>
([Statement] -> [Statement]) -> IO ()
updateSchema (UpdateIndexOptions -> [Statement] -> [Statement]
SchemaOperations.updateIndex UpdateIndexOptions
options)
        TablesController -> IO ()
forall action.
(?context::ControllerContext, HasPath action) =>
action -> IO ()
redirectTo ShowTableAction { Text
tableName :: Text
$sel:tableName:TablesAction :: Text
.. }

    action CreateIndexAction { Text
$sel:tableName:EditIndexAction :: IndexesController -> Text
tableName :: Text
tableName, Text
columnName :: Text
$sel:columnName:EditIndexAction :: IndexesController -> Text
columnName } = do
        [Statement]
statements <- IO [Statement]
forall controller.
(?context::ControllerContext, ?modelContext::ModelContext,
 ?theAction::controller) =>
IO [Statement]
readSchema
        let options :: AddIndexOptions
options = SchemaOperations.AddIndexOptions { Text
tableName :: Text
$sel:tableName:AddIndexOptions :: Text
tableName, Text
columnName :: Text
$sel:columnName:AddIndexOptions :: Text
columnName }
        ([Statement] -> [Statement]) -> IO ()
forall controller.
(?context::ControllerContext, ?modelContext::ModelContext,
 ?theAction::controller) =>
([Statement] -> [Statement]) -> IO ()
updateSchema (AddIndexOptions -> [Statement] -> [Statement]
SchemaOperations.addIndex AddIndexOptions
options)
        TablesController -> IO ()
forall action.
(?context::ControllerContext, HasPath action) =>
action -> IO ()
redirectTo ShowTableAction { Text
$sel:tableName:TablesAction :: Text
tableName :: Text
.. }

    action DeleteIndexAction { Text
$sel:tableName:EditIndexAction :: IndexesController -> Text
tableName :: Text
tableName, Text
$sel:indexName:EditIndexAction :: IndexesController -> Text
indexName :: Text
indexName } = do
        [Statement]
statements <- IO [Statement]
forall controller.
(?context::ControllerContext, ?modelContext::ModelContext,
 ?theAction::controller) =>
IO [Statement]
readSchema
        ([Statement] -> [Statement]) -> IO ()
forall controller.
(?context::ControllerContext, ?modelContext::ModelContext,
 ?theAction::controller) =>
([Statement] -> [Statement]) -> IO ()
updateSchema (Text -> [Statement] -> [Statement]
SchemaOperations.deleteIndex Text
indexName)
        TablesController -> IO ()
forall action.
(?context::ControllerContext, HasPath action) =>
action -> IO ()
redirectTo ShowTableAction { Text
$sel:tableName:TablesAction :: Text
tableName :: Text
.. }