module Network.ScrapeChanges.Domain where
import Control.Lens
import Data.Validation
import Data.List.NonEmpty
import Data.Hashable (Hashable, hashWithSalt)
import Data.ByteString.Lazy (ByteString)
import qualified Data.Text.Lazy as TextLazy
import GHC.Generics (Generic)
type CronScheduleString = String
type Url = String
type HttpBody = ByteString
type Scraper = HttpBody -> Text
type Text = TextLazy.Text
data MailAddr = MailAddr {
_mailAddrName :: Maybe Text
, _mailAddr :: String
} deriving (Show, Eq, Generic)
makeLenses ''MailAddr
instance Hashable MailAddr
data Mail = Mail {
_mailFrom :: MailAddr
, _mailTo :: NonEmpty MailAddr
, _mailSubject :: Text
, _mailBody :: Text
} deriving (Show, Eq, Generic)
makeLenses ''Mail
instance Hashable Mail
data CallbackConfig
= MailConfig Mail
| OtherConfig (Text -> IO ())
makePrisms ''CallbackConfig
instance Eq CallbackConfig where
(MailConfig _) == (OtherConfig _) = False
(OtherConfig _) == (MailConfig _) = False
(OtherConfig _) == (OtherConfig _) = False
(MailConfig m1) == (MailConfig m2) = m1 == m2
data ScrapeConfig = ScrapeConfig {
_scrapeInfoUrl :: String
, _scrapeInfoCallbackConfig :: CallbackConfig
} deriving (Eq)
makeLenses ''ScrapeConfig
instance Hashable ScrapeConfig where
hashWithSalt i c =
let scrapeInfoUrlHash = hashWithSalt i (c ^. scrapeInfoUrl)
mailConfigHash = hashWithSalt i (c ^? scrapeInfoCallbackConfig . _MailConfig)
in scrapeInfoUrlHash + mailConfigHash
data ScrapeResult =
CallbackCalled
| CallbackNotCalled deriving Show
data ScrapeSchedule = ScrapeSchedule { _scrapeScheduleCron :: CronScheduleString
, _scrapeScheduleConfig :: ScrapeConfig
, _scrapeScheduleScraper :: Scraper
}
makeLenses ''ScrapeSchedule
data ValidationError = UrlNotAbsolute
| UrlProtocolInvalid
| MailConfigInvalidMailFromAddr String
| MailConfigInvalidMailToAddr String
| CronScheduleInvalid String
deriving (Show, Eq)
type ScrapeValidation t = AccValidation [ValidationError] t