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)