ihp-ide-1.5.0: IHP/IDE/CodeGen/MailGenerator.hs
module IHP.IDE.CodeGen.MailGenerator (buildPlan, buildPlan', MailConfig (..)) where
import IHP.Prelude
import IHP.IDE.CodeGen.Types
import IHP.Postgres.Types
import Text.Countable (pluralize)
data MailConfig = MailConfig
{ controllerName :: Text
, applicationName :: Text
, modelName :: Text
, mailName :: Text
} deriving (Eq, Show)
buildPlan :: Text -> Text -> Text -> IO (Either Text [GeneratorAction])
buildPlan mailName applicationName controllerName' =
if (null mailName || null controllerName')
then pure $ Left "Neither mail name nor controller name can be empty"
else do
schema <- loadAppSchema
let modelName = tableNameToModelName controllerName'
let controllerName = tableNameToControllerName controllerName'
let viewConfig = MailConfig { .. }
pure $ Right $ buildPlan' schema viewConfig
-- E.g. qualifiedMailModuleName config "Confirmation" == "Web.Mail.Users.Confirmation"
qualifiedMailModuleName :: MailConfig -> Text -> Text
qualifiedMailModuleName config mailName =
qualifiedModuleName config.applicationName "Mail" config.controllerName (ucfirst mailName)
buildPlan' :: [Statement] -> MailConfig -> [GeneratorAction]
buildPlan' schema config =
let
controllerName = config.controllerName
name = config.mailName
singularName = config.modelName
singularVariableName = lcfirst singularName
pluralVariableName = lcfirst controllerName
(nameWithSuffix, nameWithoutSuffix) = ensureSuffix "Mail" name
indexAction = pluralize singularName <> "Action"
modelFields :: [Text]
modelFields = [ modelNameToTableName pluralVariableName, pluralVariableName ]
|> mapMaybe (fieldsForTable schema)
|> head
|> fromMaybe []
mail =
""
<> "module " <> qualifiedMailModuleName config nameWithoutSuffix <> " where\n"
<> "import " <> config.applicationName <> ".View.Prelude\n"
<> "import IHP.MailPrelude\n"
<> "\n"
<> "data " <> nameWithSuffix <> " = " <> nameWithSuffix <> " { " <> singularVariableName <> " :: " <> singularName <> " }\n"
<> "\n"
<> "instance BuildMail " <> nameWithSuffix <> " where\n"
<> " subject = \"Subject\"\n"
<> " to " <> nameWithSuffix <> " { .. } = Address { addressName = Just \"Firstname Lastname\", addressEmail = \"fname.lname@example.com\" }\n"
<> " from = \"hi@example.com\"\n"
<> " html " <> nameWithSuffix <> " { .. } = [hsx|\n"
<> " Hello World\n"
<> " |]\n"
in
[ EnsureDirectory { directory = textToOsPath (config.applicationName <> "/Mail/" <> controllerName) }
, CreateFile { filePath = textToOsPath (config.applicationName <> "/Mail/" <> controllerName <> "/" <> nameWithoutSuffix <> ".hs"), fileContent = mail }
, AddImport { filePath = textToOsPath (config.applicationName <> "/Controller/" <> controllerName <> ".hs"), fileContent = "import " <> qualifiedMailModuleName config nameWithoutSuffix }
]