diff --git a/src/PaymentServer/Persistence.hs b/src/PaymentServer/Persistence.hs index 30091197c64b7be9ded8e9e2e8e5cc162e051d28..19bda64d5c784760bfd3d8363313456f072110aa 100644 --- a/src/PaymentServer/Persistence.hs +++ b/src/PaymentServer/Persistence.hs @@ -14,6 +14,7 @@ import Control.Monad ) import Data.Text ( Text + , unpack ) import qualified Data.Set as Set import qualified Data.Map as Map @@ -116,7 +117,7 @@ instance VoucherDatabase Sqlite.Connection where undefined -- redeemVoucher :: Sqlite.Connection -> Voucher -> Fingerprint -> IO (Either RedeemError ()) redeemVoucher dbConn voucher fingerprint = do - unpaid <- Set.notMember voucher <$> getPaidVouchers dbConn + unpaid <- Set.notMember voucher <$> (Set.fromList <$> getUnredeemedVouchers dbConn) existingFingerprint <- getVoucherFingerprint dbConn voucher case (unpaid, existingFingerprint) of (True, _) -> @@ -133,9 +134,10 @@ instance VoucherDatabase Sqlite.Connection where instance FromRow Fingerprint where fromRow = Sqlite.field -getPaidVouchers :: Sqlite.Connection -> IO (Set.Set Voucher) -getPaidVouchers dbConn = Set.fromList <$> - Sqlite.query_ dbConn "SELECT DISTINCT name FROM vouchers" +-- | Paid but not redeemed +getUnredeemedVouchers :: Sqlite.Connection -> IO [Voucher] +getUnredeemedVouchers dbConn = + Sqlite.query_ dbConn "SELECT DISTINCT NAME FROM vouchers INNER JOIN redeemed_new WHERE vouchers.id != redeemed.voucher_id" getVoucherFingerprint :: Sqlite.Connection -> Voucher -> IO [Fingerprint] getVoucherFingerprint dbConn voucher = do @@ -143,6 +145,6 @@ getVoucherFingerprint dbConn voucher = do getDBConnection :: Text -> IO () getDBConnection name = do - dbConn <- Sqlite.open name - Sqlite.execute_ dbConn "CREATE TABLE IF NOT EXISTS vouchers (id INTEGER PRIMARY KEY, name TEXT)" + dbConn <- Sqlite.open (unpack name) + Sqlite.execute_ dbConn "CREATE TABLE IF NOT EXISTS vouchers (id INTEGER PRIMARY KEY, name TEXT UNIQUE" Sqlite.execute_ dbConn "CREATE TABLE IF NOT EXISTS redeemed (id INTEGER PRIMARY KEY, voucher_id INTEGER, fingerprint TEXT, FOREIGN KEY (voucher_id) REFERENCES vouchers(id))"