1 {-# LANGUAGE DataKinds, TemplateHaskell, DeriveDataTypeable, OverloadedStrings #-} 2 {-# OPTIONS_GHC -fno-warn-orphans #-} 3 module Databrary.Model.Audit.Types 4 ( AuditAction(..) 5 , AuditIdentity(..) 6 , Audit(..) 7 ) where 8 9 import Database.PostgreSQL.Typed.Inet (PGInet) 10 import qualified Data.Typeable.Internal 11 import qualified GHC.Arr 12 import qualified Database.PostgreSQL.Typed.Types 13 import qualified Database.PostgreSQL.Typed.Dynamic 14 import qualified Database.PostgreSQL.Typed.Enum 15 import qualified Data.Aeson.Types 16 import qualified Data.ByteString 17 import qualified Data.ByteString.Char8 18 19 import Databrary.Model.Time 20 import Databrary.Model.Enum 21 import Databrary.Model.Id.Types 22 import Databrary.Model.Party.Types 23 import qualified Databrary.Model.Kind 24 import qualified Databrary.HTTP.Form.Deform 25 26 -- makeDBEnum "audit.action" "AuditAction" 27 -- TODO: db coherence 28 data AuditAction 29 = AuditActionAttempt | 30 AuditActionOpen | 31 AuditActionClose | 32 AuditActionAdd | 33 AuditActionChange | 34 AuditActionRemove | 35 AuditActionSuperuser 36 deriving (Eq, 37 Ord, 38 Enum, 39 GHC.Arr.Ix, 40 Bounded, 41 Data.Typeable.Internal.Typeable) 42 instance Show AuditAction where 43 show AuditActionAttempt = "attempt" 44 show AuditActionOpen = "open" 45 show AuditActionClose = "close" 46 show AuditActionAdd = "add" 47 show AuditActionChange = "change" 48 show AuditActionRemove = "remove" 49 show AuditActionSuperuser = "superuser" 50 instance Database.PostgreSQL.Typed.Types.PGType "audit.action" 51 instance Database.PostgreSQL.Typed.Types.PGParameter "audit.action" AuditAction where 52 pgEncode _ AuditActionAttempt 53 = Data.ByteString.pack [97, 116, 116, 101, 109, 112, 116] 54 pgEncode _ AuditActionOpen 55 = Data.ByteString.pack [111, 112, 101, 110] 56 pgEncode _ AuditActionClose 57 = Data.ByteString.pack [99, 108, 111, 115, 101] 58 pgEncode _ AuditActionAdd 59 = Data.ByteString.pack [97, 100, 100] 60 pgEncode _ AuditActionChange 61 = Data.ByteString.pack [99, 104, 97, 110, 103, 101] 62 pgEncode _ AuditActionRemove 63 = Data.ByteString.pack [114, 101, 109, 111, 118, 101] 64 pgEncode _ AuditActionSuperuser 65 = Data.ByteString.pack 66 [115, 117, 112, 101, 114, 117, 115, 101, 114] 67 instance Database.PostgreSQL.Typed.Types.PGColumn "audit.action" AuditAction where 68 pgDecode _ x_a4NXQ 69 = case Data.ByteString.unpack x_a4NXQ of 70 [97, 116, 116, 101, 109, 112, 116] -> AuditActionAttempt 71 [111, 112, 101, 110] -> AuditActionOpen 72 [99, 108, 111, 115, 101] -> AuditActionClose 73 [97, 100, 100] -> AuditActionAdd 74 [99, 104, 97, 110, 103, 101] -> AuditActionChange 75 [114, 101, 109, 111, 118, 101] -> AuditActionRemove 76 [115, 117, 112, 101, 114, 117, 115, 101, 114] 77 -> AuditActionSuperuser 78 _ -> error 79 ("pgDecode audit.action: " 80 ++ (Data.ByteString.Char8.unpack x_a4NXQ)) 81 instance Database.PostgreSQL.Typed.Dynamic.PGRep "audit.action" AuditAction 82 instance Database.PostgreSQL.Typed.Enum.PGEnum AuditAction 83 instance Databrary.Model.Kind.Kinded AuditAction where 84 kindOf _ = "audit.action" 85 instance DBEnum AuditAction 86 instance Data.Aeson.Types.ToJSON AuditAction where 87 toJSON 88 = (Data.Aeson.Types.toJSON . fromEnum) 89 instance Data.Aeson.Types.FromJSON AuditAction where 90 parseJSON = parseJSONEnum 91 instance Databrary.HTTP.Form.Deform.Deform f_a4NXR AuditAction where 92 deform = enumForm 93 94 95 data AuditIdentity = AuditIdentity 96 { auditWho :: !(Id Party) 97 , auditIp :: !PGInet 98 } deriving (Eq, Show) 99 100 data Audit = Audit 101 { auditWhen :: !Timestamp 102 , auditIdentity :: !AuditIdentity 103 , auditAction :: !AuditAction 104 } deriving (Eq, Show)