Skip to content
Snippets Groups Projects
Commit 27275672 authored by Ramakrishnan Muthukrishnan's avatar Ramakrishnan Muthukrishnan
Browse files

persistence: new function to get all paid but unredeemed vouchers

Use this function to check if the given voucher is unpaid. Perhaps
this can be done in Sql itself without resorting to set operations.
parent 99075d17
Branches
No related tags found
1 merge request!26Initial implementation of Persistence using sqlite
...@@ -14,6 +14,7 @@ import Control.Monad ...@@ -14,6 +14,7 @@ import Control.Monad
) )
import Data.Text import Data.Text
( Text ( Text
, unpack
) )
import qualified Data.Set as Set import qualified Data.Set as Set
import qualified Data.Map as Map import qualified Data.Map as Map
...@@ -116,7 +117,7 @@ instance VoucherDatabase Sqlite.Connection where ...@@ -116,7 +117,7 @@ instance VoucherDatabase Sqlite.Connection where
undefined undefined
-- redeemVoucher :: Sqlite.Connection -> Voucher -> Fingerprint -> IO (Either RedeemError ()) -- redeemVoucher :: Sqlite.Connection -> Voucher -> Fingerprint -> IO (Either RedeemError ())
redeemVoucher dbConn voucher fingerprint = do redeemVoucher dbConn voucher fingerprint = do
unpaid <- Set.notMember voucher <$> getPaidVouchers dbConn unpaid <- Set.notMember voucher <$> (Set.fromList <$> getUnredeemedVouchers dbConn)
existingFingerprint <- getVoucherFingerprint dbConn voucher existingFingerprint <- getVoucherFingerprint dbConn voucher
case (unpaid, existingFingerprint) of case (unpaid, existingFingerprint) of
(True, _) -> (True, _) ->
...@@ -133,9 +134,10 @@ instance VoucherDatabase Sqlite.Connection where ...@@ -133,9 +134,10 @@ instance VoucherDatabase Sqlite.Connection where
instance FromRow Fingerprint where instance FromRow Fingerprint where
fromRow = Sqlite.field fromRow = Sqlite.field
getPaidVouchers :: Sqlite.Connection -> IO (Set.Set Voucher) -- | Paid but not redeemed
getPaidVouchers dbConn = Set.fromList <$> getUnredeemedVouchers :: Sqlite.Connection -> IO [Voucher]
Sqlite.query_ dbConn "SELECT DISTINCT name FROM vouchers" 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 :: Sqlite.Connection -> Voucher -> IO [Fingerprint]
getVoucherFingerprint dbConn voucher = do getVoucherFingerprint dbConn voucher = do
...@@ -143,6 +145,6 @@ getVoucherFingerprint dbConn voucher = do ...@@ -143,6 +145,6 @@ getVoucherFingerprint dbConn voucher = do
getDBConnection :: Text -> IO () getDBConnection :: Text -> IO ()
getDBConnection name = do getDBConnection name = do
dbConn <- Sqlite.open name dbConn <- Sqlite.open (unpack name)
Sqlite.execute_ dbConn "CREATE TABLE IF NOT EXISTS vouchers (id INTEGER PRIMARY KEY, name TEXT)" 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))" 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))"
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment