module IHP.FileStorage.Config
( initS3Storage
, initStaticDirStorage
, initMinioStorage
, initFilebaseStorage
) where
import IHP.Prelude
import IHP.FileStorage.Types
import IHP.FrameworkConfig
import Network.Minio
import qualified Control.Monad.Trans.State.Strict as State
import qualified Data.TMap as TMap
import Control.Monad.Trans.Maybe
import qualified IHP.EnvVar as EnvVar
initS3Storage :: HasCallStack => Text -> Text -> State.StateT TMap.TMap IO ()
initS3Storage :: HasCallStack => Region -> Region -> StateT TMap IO ()
initS3Storage Region
region Region
bucket = do
connectInfo <- ConnectInfo
awsCI
ConnectInfo -> (ConnectInfo -> ConnectInfo) -> ConnectInfo
forall a b. a -> (a -> b) -> b
|> Region -> ConnectInfo -> ConnectInfo
setRegion Region
region
ConnectInfo -> (ConnectInfo -> IO ConnectInfo) -> IO ConnectInfo
forall a b. a -> (a -> b) -> b
|> [CredentialLoader] -> ConnectInfo -> IO ConnectInfo
setCredsFrom [CredentialLoader
fromAWSEnv]
IO ConnectInfo
-> (IO ConnectInfo -> StateT TMap IO ConnectInfo)
-> StateT TMap IO ConnectInfo
forall a b. a -> (a -> b) -> b
|> IO ConnectInfo -> StateT TMap IO ConnectInfo
forall (monad :: * -> *) result.
(MonadIO monad, HasCallStack) =>
IO result -> monad result
configIO
let baseUrl = Region
"https://" Region -> Region -> Region
forall a. Semigroup a => a -> a -> a
<> Region
bucket Region -> Region -> Region
forall a. Semigroup a => a -> a -> a
<> Region
".s3." Region -> Region -> Region
forall a. Semigroup a => a -> a -> a
<> Region
region Region -> Region -> Region
forall a. Semigroup a => a -> a -> a
<> Region
".amazonaws.com/"
option S3Storage { connectInfo, bucket, baseUrl }
initMinioStorage :: HasCallStack => Text -> Text -> State.StateT TMap.TMap IO ()
initMinioStorage :: HasCallStack => Region -> Region -> StateT TMap IO ()
initMinioStorage Region
server Region
bucket = do
connectInfo <- Region
server
Region -> (Region -> String) -> String
forall a b. a -> (a -> b) -> b
|> Region -> String
forall a b. ConvertibleStrings a b => a -> b
cs
String -> (String -> ConnectInfo) -> ConnectInfo
forall a b. a -> (a -> b) -> b
|> String -> ConnectInfo
forall a. IsString a => String -> a
fromString
ConnectInfo -> (ConnectInfo -> IO ConnectInfo) -> IO ConnectInfo
forall a b. a -> (a -> b) -> b
|> [CredentialLoader] -> ConnectInfo -> IO ConnectInfo
setCredsFrom [CredentialLoader
fromMinioEnv]
IO ConnectInfo
-> (IO ConnectInfo -> StateT TMap IO ConnectInfo)
-> StateT TMap IO ConnectInfo
forall a b. a -> (a -> b) -> b
|> IO ConnectInfo -> StateT TMap IO ConnectInfo
forall (monad :: * -> *) result.
(MonadIO monad, HasCallStack) =>
IO result -> monad result
configIO
let baseUrl = Region
server Region -> Region -> Region
forall a. Semigroup a => a -> a -> a
<> Region
"/" Region -> Region -> Region
forall a. Semigroup a => a -> a -> a
<> Region
bucket Region -> Region -> Region
forall a. Semigroup a => a -> a -> a
<> Region
"/"
option S3Storage { connectInfo, bucket, baseUrl }
initStaticDirStorage :: State.StateT TMap.TMap IO ()
initStaticDirStorage :: StateT TMap IO ()
initStaticDirStorage = do
directory <- ByteString -> Region -> StateT TMap IO Region
forall (monad :: * -> *) result.
(MonadIO monad, EnvVarReader result) =>
ByteString -> result -> monad result
EnvVar.envOrDefault ByteString
"IHP_STORAGE_DIR" Region
"static/"
option StaticDirStorage { directory }
initFilebaseStorage :: HasCallStack => Text -> State.StateT TMap.TMap IO ()
initFilebaseStorage :: HasCallStack => Region -> StateT TMap IO ()
initFilebaseStorage Region
bucket = do
connectInfo <- ConnectInfo
filebaseCI
ConnectInfo -> (ConnectInfo -> IO ConnectInfo) -> IO ConnectInfo
forall a b. a -> (a -> b) -> b
|> [CredentialLoader] -> ConnectInfo -> IO ConnectInfo
setCredsFrom [CredentialLoader
fromFilebaseEnv]
IO ConnectInfo
-> (IO ConnectInfo -> StateT TMap IO ConnectInfo)
-> StateT TMap IO ConnectInfo
forall a b. a -> (a -> b) -> b
|> IO ConnectInfo -> StateT TMap IO ConnectInfo
forall (monad :: * -> *) result.
(MonadIO monad, HasCallStack) =>
IO result -> monad result
configIO
let baseUrl = Region
"https://" Region -> Region -> Region
forall a. Semigroup a => a -> a -> a
<> Region
bucket Region -> Region -> Region
forall a. Semigroup a => a -> a -> a
<> Region
".s3.filebase.com/"
option S3Storage { connectInfo, bucket, baseUrl }
filebaseCI :: ConnectInfo
filebaseCI :: ConnectInfo
filebaseCI = ConnectInfo
"https://s3.filebase.com" ConnectInfo -> (ConnectInfo -> ConnectInfo) -> ConnectInfo
forall a b. a -> (a -> b) -> b
|> Region -> ConnectInfo -> ConnectInfo
setRegion Region
"us-east-1"
fromFilebaseEnv :: CredentialLoader
fromFilebaseEnv :: CredentialLoader
fromFilebaseEnv = MaybeT IO CredentialValue -> CredentialLoader
forall (m :: * -> *) a. MaybeT m a -> m (Maybe a)
runMaybeT (MaybeT IO CredentialValue -> CredentialLoader)
-> MaybeT IO CredentialValue -> CredentialLoader
forall a b. (a -> b) -> a -> b
$ do
filebaseKey <- IO (Maybe String) -> MaybeT IO String
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (IO (Maybe String) -> MaybeT IO String)
-> IO (Maybe String) -> MaybeT IO String
forall a b. (a -> b) -> a -> b
$ ByteString -> IO (Maybe String)
forall (monad :: * -> *) result.
(MonadIO monad, EnvVarReader result) =>
ByteString -> monad (Maybe result)
EnvVar.envOrNothing ByteString
"FILEBASE_KEY"
filebaseSecret <- MaybeT $ EnvVar.envOrNothing "FILEBASE_SECRET"
pure CredentialValue { cvAccessKey = fromString filebaseKey, cvSecretKey = fromString filebaseSecret, cvSessionToken = Nothing }