Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ firebase.json

*.tfstate
*.tfstate.backup
*.tfstate.lock*

result
result-*
60 changes: 54 additions & 6 deletions infra/default.nix
Original file line number Diff line number Diff line change
@@ -1,12 +1,60 @@
with { pkgs = import ./nix {}; };

# TODO:
# - plug DynamoDBLocal in tests
# -> https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html

rec
{ function =
pkgs.wai-lambda.wai-lambda-js-build-lambda "${handler}/bin/deckdeckgo-handler";
pkgs.wai-lambda.wai-lambda-js-build-lambda "${handlerStatic}/bin/handler";

handlerStatic = pkgs.haskellPackagesStatic.deckdeckgo-handler;
handler = pkgs.haskellPackages.deckdeckgo-handler;

dynamoJar = pkgs.runCommand "dynamodb-jar" { buildInputs = [ pkgs.gnutar ]; }
''
mkdir -p $out
cd $out
tar -xvf ${pkgs.sources.dynamodb}
'';

test = pkgs.runCommand "tests" { buildInputs = [ pkgs.jre pkgs.curl pkgs.netcat pkgs.awscli ]; }
''

java -Djava.library.path=${dynamoJar}/DynamoDBLocal_lib -jar ${dynamoJar}/DynamoDBLocal.jar -sharedDb -port 8000 &

while ! nc -z 127.0.0.1 8000; do
echo waiting for DynamoDB
sleep 1
done
export AWS_DEFAULT_REGION=us-east-1
export AWS_ACCESS_KEY_ID=dummy
export AWS_SECRET_ACCESS_KEY=dummy

aws dynamodb create-table \
--table-name Decks \
--attribute-definitions \
AttributeName=DeckId,AttributeType=S \
--key-schema AttributeName=DeckId,KeyType=HASH \
--endpoint-url http://127.0.0.1:8000 \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

aws dynamodb create-table \
--table-name Slides \
--attribute-definitions \
AttributeName=SlideId,AttributeType=S \
--key-schema AttributeName=SlideId,KeyType=HASH \
--endpoint-url http://127.0.0.1:8000 \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

NIX_REDIRECTS=/etc/protocols=${pkgs.iana-etc}/etc/protocols \
LD_PRELOAD="${pkgs.libredirect}/lib/libredirect.so" \
${handler}/bin/server &

while ! nc -z 127.0.0.1 8080; do
echo waiting for warp
sleep 1
done

echo "Running tests"
${handler}/bin/test

handler = pkgs.haskellPackagesStatic.deckdeckgo-handler;
touch $out
'';
}
235 changes: 0 additions & 235 deletions infra/handler/Main.hs

This file was deleted.

16 changes: 16 additions & 0 deletions infra/handler/app/Handler.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import UnliftIO
import qualified Network.AWS as Aws
import qualified DeckGo.Handler
import qualified Network.Wai.Handler.Lambda as Lambda
import qualified Network.Wai.Middleware.Cors as Cors

main :: IO ()
main = do
hSetBuffering stdin LineBuffering
hSetBuffering stdout LineBuffering

liftIO $ putStrLn "Booting..."
env <- Aws.newEnv Aws.Discover

liftIO $ putStrLn "Booted!"
Lambda.run $ Cors.simpleCors $ DeckGo.Handler.application env
30 changes: 30 additions & 0 deletions infra/handler/app/Server.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{-# LANGUAGE OverloadedStrings #-}

import UnliftIO
import Control.Lens
import qualified Network.HTTP.Client as HTTPClient
import qualified Network.HTTP.Client.TLS as HTTPClient
import qualified Network.AWS as Aws
import qualified DeckGo.Handler
import qualified Network.Wai.Handler.Warp as Warp

main :: IO ()
main = do
hSetBuffering stdin LineBuffering
hSetBuffering stdout LineBuffering
mgr <- HTTPClient.newManager HTTPClient.tlsManagerSettings
{ HTTPClient.managerModifyRequest = rerouteDynamoDB
}
env <- Aws.newEnv Aws.Discover <&> Aws.envManager .~ mgr
Warp.run 8080 $ DeckGo.Handler.application env

rerouteDynamoDB :: HTTPClient.Request -> IO HTTPClient.Request
rerouteDynamoDB req =
case HTTPClient.host req of
"dynamodb.us-east-1.amazonaws.com" ->
pure req
{ HTTPClient.host = "127.0.0.1"
, HTTPClient.port = 8000
, HTTPClient.secure = False
}
_ -> pure req
Loading