From c3d51dad68b1d9241a42141762ab3aeec8bb9070 Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Thu, 5 Sep 2019 11:24:56 -0400
Subject: [PATCH] Don't repeat yourself

---
 src/PaymentServer/Redemption.hs | 10 +++++-----
 src/PaymentServer/Server.hs     |  5 ++++-
 test/SpecRedemption.hs          | 11 ++++++-----
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/PaymentServer/Redemption.hs b/src/PaymentServer/Redemption.hs
index 96dcdaf..c2cbe06 100644
--- a/src/PaymentServer/Redemption.hs
+++ b/src/PaymentServer/Redemption.hs
@@ -63,7 +63,7 @@ import PaymentServer.Issuer
   , Proof
   , BlindedToken
   , ChallengeBypass(ChallengeBypass)
-  , trivialIssue
+  , Issuer
   )
 
 data Result
@@ -111,21 +111,21 @@ jsonErr400 = err400
   , errHeaders = [ ("Content-Type", "application/json;charset=utf-8") ]
   }
 
-redemptionServer :: VoucherDatabase d => d -> Server RedemptionAPI
+redemptionServer :: VoucherDatabase d => Issuer -> d -> Server RedemptionAPI
 redemptionServer = redeem
 
 -- | Handler for redemption requests.  Use the database to try to redeem the
 -- voucher and return signatures.  Return a failure if this is not possible
 -- (eg because the voucher was already redeemed).
-redeem :: VoucherDatabase d => d -> Redeem -> Handler Result
-redeem database (Redeem voucher tokens) = do
+redeem :: VoucherDatabase d => Issuer -> d -> Redeem -> Handler Result
+redeem issue database (Redeem voucher tokens) = do
   let fingerprint = fingerprintFromTokens tokens
   result <- liftIO $ PaymentServer.Persistence.redeemVoucher database voucher fingerprint
   case result of
     Left err -> throwError jsonErr400
     Right () ->
       let
-        (ChallengeBypass key signatures proof) = trivialIssue tokens
+        (ChallengeBypass key signatures proof) = issue tokens
       in
         return $ Succeeded key signatures proof
 
diff --git a/src/PaymentServer/Server.hs b/src/PaymentServer/Server.hs
index f55b779..6eea6ab 100644
--- a/src/PaymentServer/Server.hs
+++ b/src/PaymentServer/Server.hs
@@ -23,6 +23,9 @@ import PaymentServer.Redemption
   ( RedemptionAPI
   , redemptionServer
   )
+import PaymentServer.Issuer
+  ( trivialIssue
+  )
 import PaymentServer.Persistence
   ( VoucherDatabase
   )
@@ -36,7 +39,7 @@ type PaymentServerAPI
 paymentServer :: VoucherDatabase d => d -> Server PaymentServerAPI
 paymentServer d =
   stripeServer d
-  :<|> redemptionServer d
+  :<|> redemptionServer trivialIssue d
 
 paymentServerAPI :: Proxy PaymentServerAPI
 paymentServerAPI = Proxy
diff --git a/test/SpecRedemption.hs b/test/SpecRedemption.hs
index 1017fa1..d75ee75 100644
--- a/test/SpecRedemption.hs
+++ b/test/SpecRedemption.hs
@@ -55,6 +55,7 @@ import Util.WAI
 import PaymentServer.Issuer
   ( BlindedToken
   , ChallengeBypass(ChallengeBypass)
+  , Issuer
   , trivialIssue
   )
 import PaymentServer.Redemption
@@ -73,8 +74,8 @@ import PaymentServer.Persistence
 redemptionAPI :: Proxy RedemptionAPI
 redemptionAPI = Proxy
 
-app :: VoucherDatabase d => d -> Application
-app = serve redemptionAPI . redemptionServer
+app :: VoucherDatabase d => Issuer -> d -> Application
+app issue = serve redemptionAPI . redemptionServer issue
 
 path = "/"
 
@@ -100,7 +101,7 @@ instance VoucherDatabase VoucherDatabaseTestDouble where
 spec_redemption :: Spec
 spec_redemption = parallel $ do
   database <- runIO memory
-  with (return . app $ database) $
+  with (return $ app trivialIssue database) $
     do
       describe (printf "error behavior of POST %s" (show path)) $
         do
@@ -128,7 +129,7 @@ spec_redemption = parallel $ do
 
 
   describe "redemption" $ do
-    with (return . app $ RefuseRedemption NotPaid) $
+    with (return $ app trivialIssue (RefuseRedemption NotPaid)) $
       it "receives a failure response when the voucher is not paid" $ property $
         \(voucher :: Voucher) (tokens :: [BlindedToken]) ->
           propertyRedeem path voucher tokens 400
@@ -139,7 +140,7 @@ spec_redemption = parallel $ do
           , matchHeaders = ["Content-Type" <:> "application/json;charset=utf-8"]
           }
 
-    with (return $ app PermitRedemption) $
+    with (return $ app trivialIssue PermitRedemption) $
       it "receive a success response when redemption succeeds" $ property $
         \(voucher :: Voucher) (tokens :: [BlindedToken]) ->
           let
-- 
GitLab