-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Storage backend for serversession using persistent and an RDBMS.
--   
--   API docs and the README are available at
--   <a>http://www.stackage.org/package/serversession-backend-persistent</a>
@package serversession-backend-persistent
@version 1.0.4


-- | Internal module exposing the guts of the package. Use at your own
--   risk. No API stability guarantees apply.
--   
--   Also exports orphan instances of <tt>PersistField{,Sql}
--   SessionId</tt>.
module Web.ServerSession.Backend.Persistent.Internal.Types

-- | Newtype of a <a>ByteString</a> with JSON support via base64url.
newtype ByteStringJ
B :: ByteString -> ByteStringJ
[unB] :: ByteStringJ -> ByteString
instance GHC.Read.Read Web.ServerSession.Backend.Persistent.Internal.Types.ByteStringJ
instance GHC.Show.Show Web.ServerSession.Backend.Persistent.Internal.Types.ByteStringJ
instance GHC.Classes.Ord Web.ServerSession.Backend.Persistent.Internal.Types.ByteStringJ
instance GHC.Classes.Eq Web.ServerSession.Backend.Persistent.Internal.Types.ByteStringJ
instance Database.Persist.Class.PersistField.PersistField Web.ServerSession.Backend.Persistent.Internal.Types.ByteStringJ
instance Database.Persist.Sql.Class.PersistFieldSql Web.ServerSession.Backend.Persistent.Internal.Types.ByteStringJ
instance Data.Aeson.Types.FromJSON.FromJSON Web.ServerSession.Backend.Persistent.Internal.Types.ByteStringJ
instance Data.Aeson.Types.ToJSON.ToJSON Web.ServerSession.Backend.Persistent.Internal.Types.ByteStringJ
instance Data.Aeson.Types.FromJSON.FromJSON Web.ServerSession.Core.Internal.SessionMap
instance Data.Aeson.Types.ToJSON.ToJSON Web.ServerSession.Core.Internal.SessionMap
instance Database.Persist.Class.PersistField.PersistField (Web.ServerSession.Core.Internal.SessionId sess)
instance Database.Persist.Sql.Class.PersistFieldSql (Web.ServerSession.Core.Internal.SessionId sess)
instance Database.Persist.Class.PersistField.PersistField Web.ServerSession.Core.Internal.SessionMap
instance Database.Persist.Sql.Class.PersistFieldSql Web.ServerSession.Core.Internal.SessionMap
instance Data.Serialize.Serialize Web.ServerSession.Core.Internal.SessionMap


-- | Internal module exposing the guts of the package. Use at your own
--   risk. No API stability guarantees apply.
module Web.ServerSession.Backend.Persistent.Internal.Impl

-- | Entity corresponding to a <a>Session</a>.
--   
--   We're bending <tt>persistent</tt> in ways it wasn't expected to. In
--   particular, this entity is parametrized over the session type.
data PersistentSession sess
PersistentSession :: !(SessionId sess) -> !(Maybe ByteStringJ) -> !(Decomposed sess) -> !UTCTime -> !UTCTime -> PersistentSession sess

-- | Session ID, primary key.
[persistentSessionKey] :: PersistentSession sess -> !(SessionId sess)

-- | Value of "_ID" session key.
[persistentSessionAuthId] :: PersistentSession sess -> !(Maybe ByteStringJ)

-- | Rest of the session data.
[persistentSessionSession] :: PersistentSession sess -> !(Decomposed sess)

-- | When this session was created.
[persistentSessionCreatedAt] :: PersistentSession sess -> !UTCTime

-- | When this session was last accessed.
[persistentSessionAccessedAt] :: PersistentSession sess -> !UTCTime
type PersistentSessionId sess = Key (PersistentSession sess)

-- | An <a>EntityField</a> is parameterised by the Haskell record it
--   belongs to and the additional type of that field.

-- | Entity definitions needed to generate the SQL schema for
--   <a>SqlStorage</a>. Example using <a>SessionMap</a>:
--   
--   <pre>
--   serverSessionDefs (Proxy :: Proxy SessionMap)
--   </pre>
serverSessionDefs :: forall sess. PersistEntity (PersistentSession sess) => Proxy sess -> [EntityDef]

-- | Generate a key to the entity from the session ID.
psKey :: SessionId sess -> Key (PersistentSession sess)

-- | Convert from <a>Session</a> to <a>PersistentSession</a>.
toPersistentSession :: Session sess -> PersistentSession sess

-- | Convert from <a>PersistentSession</a> to <a>Session</a>.
fromPersistentSession :: PersistentSession sess -> Session sess

-- | SQL session storage backend using <tt>persistent</tt>.
newtype SqlStorage sess
SqlStorage :: ConnectionPool -> SqlStorage sess

-- | Pool of DB connections. You may use the same pool as your application.
[connPool] :: SqlStorage sess -> ConnectionPool

-- | Specialization of <a>throwIO</a> for <a>SqlStorage</a>.
throwSS :: Storage (SqlStorage sess) => StorageException (SqlStorage sess) -> TransactionM (SqlStorage sess) a
instance Data.Aeson.Types.FromJSON.FromJSON (Database.Persist.Class.PersistEntity.Key (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))
instance Data.Aeson.Types.ToJSON.ToJSON (Database.Persist.Class.PersistEntity.Key (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))
instance Database.Persist.Sql.Class.PersistFieldSql (Database.Persist.Class.PersistEntity.Key (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))
instance Database.Persist.Class.PersistField.PersistField (Database.Persist.Class.PersistEntity.Key (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))
instance Web.PathPieces.PathPiece (Database.Persist.Class.PersistEntity.Key (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))
instance GHC.Read.Read (Database.Persist.Class.PersistEntity.Key (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))
instance GHC.Show.Show (Database.Persist.Class.PersistEntity.Key (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))
instance GHC.Classes.Ord (Database.Persist.Class.PersistEntity.Key (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))
instance GHC.Classes.Eq (Database.Persist.Class.PersistEntity.Key (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))
instance GHC.Classes.Eq (Web.ServerSession.Core.Internal.Decomposed sess) => GHC.Classes.Eq (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess)
instance GHC.Classes.Ord (Web.ServerSession.Core.Internal.Decomposed sess) => GHC.Classes.Ord (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess)
instance GHC.Show.Show (Web.ServerSession.Core.Internal.Decomposed sess) => GHC.Show.Show (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess)
instance (Web.ServerSession.Core.Internal.IsSessionData sess, Database.Persist.Sql.Class.PersistFieldSql (Web.ServerSession.Core.Internal.Decomposed sess)) => Web.ServerSession.Core.Internal.Storage (Web.ServerSession.Backend.Persistent.Internal.Impl.SqlStorage sess)
instance Database.Persist.Sql.Class.PersistFieldSql (Web.ServerSession.Core.Internal.Decomposed sess) => Database.Persist.Class.PersistEntity.PersistEntity (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess)
instance Data.Aeson.Types.ToJSON.ToJSON (Web.ServerSession.Core.Internal.Decomposed sess) => Data.Aeson.Types.ToJSON.ToJSON (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess)
instance Data.Aeson.Types.FromJSON.FromJSON (Web.ServerSession.Core.Internal.Decomposed sess) => Data.Aeson.Types.FromJSON.FromJSON (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess)
instance (Data.Aeson.Types.ToJSON.ToJSON (Web.ServerSession.Core.Internal.Decomposed sess), Database.Persist.Sql.Class.PersistFieldSql (Web.ServerSession.Core.Internal.Decomposed sess)) => Data.Aeson.Types.ToJSON.ToJSON (Database.Persist.Class.PersistEntity.Entity (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))
instance (Data.Aeson.Types.FromJSON.FromJSON (Web.ServerSession.Core.Internal.Decomposed sess), Database.Persist.Sql.Class.PersistFieldSql (Web.ServerSession.Core.Internal.Decomposed sess)) => Data.Aeson.Types.FromJSON.FromJSON (Database.Persist.Class.PersistEntity.Entity (Web.ServerSession.Backend.Persistent.Internal.Impl.PersistentSession sess))


-- | Storage backend for <tt>serversession</tt> using persistent.
--   
--   In order to use this backend, you have to include
--   <a>serverSessionDefs</a> on your migration code. For example, the
--   Yesod scaffold usually includes the following code:
--   
--   <pre>
--   -- On Model.hs
--   share [mkPersist sqlSettings, mkMigrate "migrateAll"]
--   
--   -- On Application.hs
--   makeFoundation =
--       ...
--       runLoggingT (runSqlPool (runMigration migrateAll) pool) logFunc
--       ...
--   </pre>
--   
--   You should changed those lines to:
--   
--   <pre>
--   -- On Model.hs
--   share [mkPersist sqlSettings, mkSave "entityDefs"]
--   
--   -- On Application.hs
--   import qualified Data.Proxy as P -- tagged package, or base from GHC 7.10 onwards
--   import qualified Web.ServerSession.Core as SS
--   import qualified Web.ServerSession.Backend.Persistent as SS
--   
--   mkMigrate "migrateAll" (SS.serverSessionDefs (P.Proxy :: P.Proxy SS.SessionMap) ++ entityDefs)
--   
--   makeFoundation =
--       ...
--       runLoggingT (runSqlPool (runMigration migrateAll) pool) logFunc
--       ...
--   </pre>
--   
--   If you're not using <tt>SessionMap</tt>, just change <tt>Proxy</tt>
--   type above.
--   
--   If you forget to setup the migration above, this session storage
--   backend will fail at runtime as the required table will not exist.
module Web.ServerSession.Backend.Persistent

-- | SQL session storage backend using <tt>persistent</tt>.
newtype SqlStorage sess
SqlStorage :: ConnectionPool -> SqlStorage sess

-- | Pool of DB connections. You may use the same pool as your application.
[connPool] :: SqlStorage sess -> ConnectionPool

-- | Entity definitions needed to generate the SQL schema for
--   <a>SqlStorage</a>. Example using <a>SessionMap</a>:
--   
--   <pre>
--   serverSessionDefs (Proxy :: Proxy SessionMap)
--   </pre>
serverSessionDefs :: forall sess. PersistEntity (PersistentSession sess) => Proxy sess -> [EntityDef]
