snaplet-actionlog-0.3.1: src/Snap/Snaplet/ActionLog.hs
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Snap.Snaplet.ActionLog
( -- * Core types and functions
ActionLog
, initActionLog
, HasActionLog(..)
, ActionType(..)
, actionToInt
, intToAction
, DeltaField(..)
, CanDelta(..)
, storeDeltas
, getDeltas
-- * Retrieving actions
, getLoggedAction
, getEntityActions
, getAllActions
, getTenantActions
, getTenantEntities
, getTenantUids
-- * Storing actions
-- $storingActions
, logAction
, loggedInsert
, loggedReplace
, loggedUpdate
, loggedDelete
, loggedDeleteKey
-- * Types
, actionLogEntityDefs
, migrateActionLog
, LoggedAction(..)
, LoggedActionId
, LoggedActionDetails(..)
, LoggedActionDetailsId
) where
------------------------------------------------------------------------------
import Control.Lens
import Control.Monad
import qualified Data.Map.Syntax as MS
import Data.Monoid
import Data.Text.Encoding
import Heist
import qualified Heist.Interpreted as I
import Snap
import Snap.Restful
import Snap.Snaplet.Heist.Compiled
------------------------------------------------------------------------------
import Paths_snaplet_actionlog
import Snap.Snaplet.ActionLog.API
import Snap.Snaplet.ActionLog.Resource
import Snap.Snaplet.ActionLog.Types
-------------------------------------------------------------------------------
------------------------------------------------------------------------------
-- | Initializer for the action log snaplet. It sets up templates, routes,
-- and compiled and interpreted splices.
--
-- Includes two built-in top level splices: actionLogListing and
-- actionLogFilterForm
initActionLog :: (HasActionLog (Handler b b), HasHeist b)
=> Snaplet (Heist b) -> SnapletInit b ActionLog
initActionLog heist = makeSnaplet "actionlog" description datadir $ do
url <- getSnapletRootURL
let resource = actionLogR { rRoot = decodeUtf8 url }
addResourceRelative resource
[(RIndex, indexH), (RShow, showH)] [] [] heist
addConfig heist $ mempty
& scCompiledSplices .~ actionLogSplices resource
& scInterpretedSplices .~ actionLogISplices resource
-- Load time splices are for splices that can be used in the apply and
-- bind tags.
& scLoadTimeSplices .~ ("actionlogTemplate" MS.## I.textSplice (decodeUtf8 url))
addTemplates heist ""
return ActionLog
where
description = "Snaplet providing generalized logging"
datadir = Just $ liftM (++"/resources") getDataDir
-- $storingActions
-- These functions provide a nice API for logging actions based on database
-- operations. Typically you should be able to simply substitute the
-- 'loggedInsert', 'loggedUpdate', etc functions in the place of your existing
-- calls to 'insert', 'update', etc from the persistent library.