persistent-audit-0.1.0.2: src/Database/Persist/Audit/MongoDB/Util.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
module Database.Persist.Audit.MongoDB.Util where
import Data.ByteString (ByteString)
import Data.Text.Encoding (decodeUtf8',encodeUtf8)
import Database.MongoDB as DB
import Database.Persist.MongoDB (keyToText,readMayMongoKey)
import Database.Persist
-- | Used for creating instances of ToAudit when the original model database is Mongo
-- and the audit model database is SQL.
-- ==== __Example__
-- User
-- ident Text
-- password Text Maybe
-- UniqueUser ident
-- UserAudit
-- ident Text
-- password Text Maybe
-- originalId ByteString
-- auditAction AuditAction
-- editedBy Text
-- editedOn UTCTime
-- instance ToAudit User where
-- type AuditResult User = UserAudit
-- toAudit v k auditAction editedBy editedOn = UserAudit (userIdent v)
-- (userPassword v)
-- (mongoKeyToByteString k) auditAction editedBy editedOn
mongoKeyToByteString :: (ToBackendKey DB.MongoContext record) => Key record -> ByteString
mongoKeyToByteString = encodeUtf8 . keyToText . toBackendKey
-- | Used for when Mongo stored in SQL needs to be converted to a Key to query the original
-- MongoDB.
byteStringToMongoKey :: (ToBackendKey DB.MongoContext record) => ByteString -> Maybe (Key record)
byteStringToMongoKey bs = case decodeUtf8' bs of
Left _ -> Nothing
Right text -> fromBackendKey <$> readMayMongoKey text
-- | To handle SQL keys to and from MongoDB, use 'toSqlKey' and 'fromSqlKey' from Database.Persist.Sql