1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
{-# LANGUAGE OverloadedStrings, TemplateHaskell, QuasiQuotes, UndecidableInstances #-}
module Spm.Server.Database
( MailMailbox, MailLocal, MailExtension, MailDomain
, Mailbox(..), MailboxMapping(..)
, Key(..), EntityField(..), Unique(..)
) where
import Prelude
import Database.Persist
import Database.Persist.Sql
import Database.Persist.TH
import GHC.Generics (Generic)
import Type.Reflection (Typeable)
import Data.Text (Text)
import Data.CaseInsensitive (CI)
import qualified Data.CaseInsensitive as CI
import Data.CaseInsensitive.Instances ()
import Data.UUID (UUID)
import Data.UUID.Instances ()
import Data.Int (Int64)
import Control.Lens
import Web.HttpApiData
newtype MailMailbox = MailMailbox
{ unMailMailbox :: CI Text
} deriving stock (Eq, Ord, Read, Show, Generic, Typeable)
deriving newtype (PersistField, PersistFieldSql)
makeWrapped ''MailMailbox
newtype MailLocal = MailLocal
{ unMailLocal :: CI Text
} deriving stock (Eq, Ord, Read, Show, Generic, Typeable)
deriving newtype (PersistField, PersistFieldSql)
makeWrapped ''MailLocal
newtype MailExtension = MailExtension
{ unMailExtension :: CI Text
} deriving stock (Eq, Ord, Read, Show, Generic, Typeable)
deriving newtype (PersistField, PersistFieldSql)
makeWrapped ''MailExtension
newtype MailDomain = MailDomain
{ unMailDomain :: CI Text
} deriving stock (Eq, Ord, Read, Show, Generic, Typeable)
deriving newtype (PersistField, PersistFieldSql)
makeWrapped ''MailDomain
instance FromHttpApiData MailDomain where
parseUrlPiece = fmap (review _Wrapped . CI.mk) . parseUrlPiece
share [mkPersist sqlSettings] [persistLowerCase|
Mailbox
Id UUID sqltype=uuid default=gen_random_uuid()
ident MailMailbox sql=mailbox
quota Int64 Maybe sql=quota_bytes MigrationOnly
UniqueMailbox ident
deriving Show
MailboxMapping
Id UUID sqltype=uuid default=gen_random_uuid()
local MailLocal Maybe
extension MailExtension Maybe
domain MailDomain
mailbox MailboxId
reject Bool
UniqueDomain domain sql=domain_unique !force
UniqueLocalDomain local domain sql=local_domain_unique !force
UniqueLocalExtensionDomain local extension domain sql=local_extension_domain_unique !force
|]
|