aboutsummaryrefslogtreecommitdiff
path: root/src/Data/PendingBang.hs
diff options
context:
space:
mode:
authorLia Lenckowski <lialenck@protonmail.com>2023-08-26 19:16:57 +0200
committerLia Lenckowski <lialenck@protonmail.com>2023-08-26 19:16:57 +0200
commitb4800d051a71b38cce8dc0ee89edc0742f272384 (patch)
tree0b0b05d36f09a9ece0dbe58ee7404e5f866fd3e1 /src/Data/PendingBang.hs
parenta68afb81885ffdf0d6fe58df5aee57d7e7653ee9 (diff)
downloadfastbangs-b4800d051a71b38cce8dc0ee89edc0742f272384.tar
fastbangs-b4800d051a71b38cce8dc0ee89edc0742f272384.tar.bz2
fastbangs-b4800d051a71b38cce8dc0ee89edc0742f272384.tar.zst
refactor: move PendingBang out of Main
Diffstat (limited to 'src/Data/PendingBang.hs')
-rw-r--r--src/Data/PendingBang.hs49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/Data/PendingBang.hs b/src/Data/PendingBang.hs
new file mode 100644
index 0000000..05fafba
--- /dev/null
+++ b/src/Data/PendingBang.hs
@@ -0,0 +1,49 @@
+{-# LANGUAGE OverloadedStrings, QuasiQuotes, TemplateHaskell,
+ TypeFamilies, GADTs, GeneralizedNewtypeDeriving,
+ MultiParamTypeClasses, DerivingStrategies, StandaloneDeriving,
+ UndecidableInstances, DataKinds, FlexibleInstances, TypeOperators #-}
+
+{-# OPTIONS -Wno-missing-export-lists #-}
+
+module Data.PendingBang where
+
+import Data.Aeson
+import Database.Persist.TH
+import Data.Char (isAlphaNum)
+import Data.Maybe (maybeToList)
+
+import qualified Data.Text as T
+
+share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
+PendingBang
+ bang T.Text
+ url T.Text
+ displayName T.Text
+ notifyEmail (Maybe T.Text)
+ UniqueBang bang url displayName
+ deriving Show
+|]
+
+instance ToJSON PendingBang where
+ toJSON (PendingBang b u dp em) = object $
+ ["bang" .= b, "url" .= u, "name" .= dp] ++ case em of
+ Nothing -> []
+ Just e -> ["email" .= e]
+
+ toEncoding (PendingBang b u dp em) = pairs $ case em of
+ Nothing -> withoutEmail
+ Just e -> withoutEmail <> "email" .= e
+ where withoutEmail = "bang" .= b <> "url" .= u <> "name" .= dp
+
+instance FromJSON PendingBang where
+ parseJSON = withObject "PendingBang" $ \ob ->
+ PendingBang
+ <$> ob .: "bang"
+ <*> ob .: "url"
+ <*> ob .: "name"
+ <*> ob .:? "email"
+
+verifyPendingBang :: PendingBang -> Bool
+verifyPendingBang (PendingBang n u dp mayEm) =
+ T.all isAlphaNum n && all ((<255) . T.length) strings
+ where strings = [n, u, dp] <> maybeToList mayEm