@@ -72,19 +72,29 @@ import Data.Text (Text)
7272import qualified Data.Text as T
7373import Data.Time
7474#ifndef ghcjs_HOST_OS
75+#ifdef USE_POSTGRES
7576import Database.PostgreSQL.Simple.FromField
7677import Database.PostgreSQL.Simple.ToField
7778#endif
79+#endif
7880import Formatting as F
7981import GHC.Generics (Generic)
8082import Numeric.Natural
8183import Test.QuickCheck.Arbitrary
8284import Test.QuickCheck.Gen
85+#ifdef USE_STORE
86+import qualified Data.Store
87+import qualified Data.Store.Internal
88+#endif
8389
8490
8591newtype ZipCode = ZipCode
8692 { unZipCode :: Text }
87− deriving (Show, Eq, Generic, ToJSON, FromJSON, ToSchema)
93+ deriving stock (Show, Eq, Generic)
94+ deriving newtype (ToJSON, FromJSON, ToSchema)
95+#ifdef USE_STORE
96+ deriving anyclass Data.Store.Store
97+#endif
8898
8999makePrisms ''ZipCode
90100
@@ -94,6 +104,9 @@ data CreditCardDate = CreditCardDate
94104 , _ccdMonth :: Int
95105 -- ^ Month number in range [1..12]
96106 } deriving (Eq, Show, Generic)
107+#ifdef USE_STORE
108+ deriving anyclass Data.Store.Store
109+#endif
97110
98111instance ToSchema CreditCardDate where
99112 declareNamedSchema _ = declareNamedSchema (Proxy @Text)
@@ -153,6 +166,7 @@ newtype CreditCardNumber = CreditCardNumber
153166 { unCreditCardNumber :: NonEmpty Digit }
154167 deriving (Eq, Generic)
155168
169+
156170instance ToSchema CreditCardNumber where
157171 declareNamedSchema _ = declareNamedSchema (Proxy @Text)
158172
@@ -167,6 +181,15 @@ parseCardNumber = preview (_DigitsText . from _CreditCardNumber)
167181apiCreditCardNumber :: Prism' Text CreditCardNumber
168182apiCreditCardNumber = prism' renderCardNumber parseCardNumber
169183
184+#ifdef USE_STORE
185+instance Data.Store.Store CreditCardNumber where
186+ poke = Data.Store.poke . renderCardNumber
187+ peek = do
188+ maybeNumber <- parseCardNumber <$> Data.Store.peek
189+ maybe (fail "invalid stored credit card number") pure maybeNumber
190+ size = Data.Store.VarSize (Data.Store.Internal.getSize . renderCardNumber)
191+#endif
192+
170193instance FromJSON CreditCardNumber where
171194 parseJSON = withText "CreditCardNumber" $ \s ->
172195 case parseCardNumber s of
@@ -208,9 +231,11 @@ panToBogusNumber (CreditCardPAN txt) =
208231 check = fromMaybe (error "Failed to parse PAN back to digits")
209232
210233#ifndef ghcjs_HOST_OS
234+#ifdef USE_CASSAVA
211235deriving instance FromField CreditCardPAN
212236deriving instance ToField CreditCardPAN
213237#endif
238+#endif
214239
215240mkCreditCardPan :: CreditCardNumber -> CreditCardPAN
216241mkCreditCardPan n = CreditCardPAN $ firstDigits <> stars <> lastDigits
@@ -224,6 +249,9 @@ newtype CreditCardSecurity = CreditCardSecurity
224249 { unCCSecurity :: Text }
225250 deriving (Eq, Ord, Generic)
226251 deriving newtype (ToJSON, FromJSON, ToSchema)
252+#ifdef USE_STORE
253+ deriving anyclass Data.Store.Store
254+#endif
227255
228256instance Arbitrary CreditCardSecurity where
229257 arbitrary = CreditCardSecurity . T.pack . concatMap (show :: Int -> String)
@@ -254,6 +282,9 @@ data CreditCard = CreditCard
254282 , _ccExpirationDate :: !(CreditCardDate)
255283 , _ccZipCode :: !(Maybe ZipCode)
256284 } deriving (Eq, Generic, Show)
285+#ifdef USE_STORE
286+ deriving anyclass Data.Store.Store
287+#endif
257288
258289instance ToSchema CreditCard where
259290 declareNamedSchema p = genericDeclareNamedSchema opts p