{-# LANGUAGE OverloadedLabels #-}

module Mensam.Server.Reservation where

import Mensam.API.Data.Desk
import Mensam.API.Data.Reservation
import Mensam.API.Data.User
import Mensam.Server.Application.SeldaPool.Class
import Mensam.Server.Database.Extra qualified as Selda
import Mensam.Server.Database.Schema

import Control.Monad.Catch
import Control.Monad.IO.Class
import Control.Monad.Logger.CallStack
import Control.Monad.Trans.Class
import Data.Kind
import Data.Text qualified as T
import Data.Time qualified as T
import Database.Selda qualified as Selda
import GHC.Generics

reservationGet ::
  (MonadLogger m, MonadSeldaPool m) =>
  IdentifierReservation ->
  SeldaTransactionT m Reservation
reservationGet :: forall (m :: * -> *).
(MonadLogger m, MonadSeldaPool m) =>
IdentifierReservation -> SeldaTransactionT m Reservation
reservationGet IdentifierReservation
identifier = do
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ Text
"Get reservation with identifier: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack (IdentifierReservation -> String
forall a. Show a => a -> String
show IdentifierReservation
identifier)
  DbReservation
dbReservation <- Query (Backend (SeldaTransactionT m)) (Row SQLite DbReservation)
-> SeldaTransactionT m (Res (Row SQLite DbReservation))
forall (m :: * -> *) a.
(MonadSelda m, MonadCatch m, Result a) =>
Query (Backend m) a -> m (Res a)
Selda.queryOne (Query (Backend (SeldaTransactionT m)) (Row SQLite DbReservation)
 -> SeldaTransactionT m (Res (Row SQLite DbReservation)))
-> Query (Backend (SeldaTransactionT m)) (Row SQLite DbReservation)
-> SeldaTransactionT m (Res (Row SQLite DbReservation))
forall a b. (a -> b) -> a -> b
$ do
    Row SQLite DbReservation
dbReservation <- Table DbReservation -> Query SQLite (Row SQLite DbReservation)
forall a s. Relational a => Table a -> Query s (Row s a)
Selda.select Table DbReservation
tableReservation
    Col SQLite Bool -> Query SQLite ()
forall s t. Same s t => Col s Bool -> Query t ()
Selda.restrict (Col SQLite Bool -> Query SQLite ())
-> Col SQLite Bool -> Query SQLite ()
forall a b. (a -> b) -> a -> b
$ Row SQLite DbReservation
dbReservation Row SQLite DbReservation
-> Selector DbReservation (ID DbReservation)
-> Col SQLite (ID DbReservation)
forall a s t. SqlType a => Row s t -> Selector t a -> Col s a
Selda.! Selector DbReservation (ID DbReservation)
#dbReservation_id Col SQLite (ID DbReservation)
-> Col SQLite (ID DbReservation) -> Col SQLite Bool
forall s t a.
(Same s t, SqlType a) =>
Col s a -> Col t a -> Col s Bool
Selda..== ID DbReservation -> Col SQLite (ID DbReservation)
forall {k} a (s :: k). SqlType a => a -> Col s a
Selda.literal (forall a. Int64 -> ID a
Selda.toId @DbReservation (Int64 -> ID DbReservation) -> Int64 -> ID DbReservation
forall a b. (a -> b) -> a -> b
$ IdentifierReservation -> Int64
unIdentifierReservation IdentifierReservation
identifier)
    Row SQLite DbReservation -> Query SQLite (Row SQLite DbReservation)
forall a. a -> Query SQLite a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Row SQLite DbReservation
dbReservation
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logInfo Text
"Got reservation successfully."
  Reservation -> SeldaTransactionT m Reservation
forall a. a -> SeldaTransactionT m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    MkReservation
      { reservationId :: IdentifierReservation
reservationId = Int64 -> IdentifierReservation
MkIdentifierReservation (Int64 -> IdentifierReservation) -> Int64 -> IdentifierReservation
forall a b. (a -> b) -> a -> b
$ forall a. ID a -> Int64
Selda.fromId @DbReservation (ID DbReservation -> Int64) -> ID DbReservation -> Int64
forall a b. (a -> b) -> a -> b
$ DbReservation -> ID DbReservation
dbReservation_id DbReservation
dbReservation
      , reservationDesk :: IdentifierDesk
reservationDesk = Int64 -> IdentifierDesk
MkIdentifierDesk (Int64 -> IdentifierDesk) -> Int64 -> IdentifierDesk
forall a b. (a -> b) -> a -> b
$ forall a. ID a -> Int64
Selda.fromId @DbDesk (ID DbDesk -> Int64) -> ID DbDesk -> Int64
forall a b. (a -> b) -> a -> b
$ DbReservation -> ID DbDesk
dbReservation_desk DbReservation
dbReservation
      , reservationUser :: IdentifierUser
reservationUser = Int64 -> IdentifierUser
MkIdentifierUser (Int64 -> IdentifierUser) -> Int64 -> IdentifierUser
forall a b. (a -> b) -> a -> b
$ forall a. ID a -> Int64
Selda.fromId @DbUser (ID DbUser -> Int64) -> ID DbUser -> Int64
forall a b. (a -> b) -> a -> b
$ DbReservation -> ID DbUser
dbReservation_user DbReservation
dbReservation
      , reservationTimeBegin :: UTCTime
reservationTimeBegin = DbReservation -> UTCTime
dbReservation_time_begin DbReservation
dbReservation
      , reservationTimeEnd :: UTCTime
reservationTimeEnd = DbReservation -> UTCTime
dbReservation_time_end DbReservation
dbReservation
      , reservationStatus :: StatusReservation
reservationStatus = case DbReservation -> DbReservationStatus
dbReservation_status DbReservation
dbReservation of
          DbReservationStatus
MkDbReservationStatus_planned -> StatusReservation
MkStatusReservationPlanned
          DbReservationStatus
MkDbReservationStatus_cancelled -> StatusReservation
MkStatusReservationCancelled
      }

-- | List all reservations of a desk, that overlap with the given time window.
reservationList ::
  (MonadLogger m, MonadSeldaPool m) =>
  IdentifierDesk ->
  IntervalUnbounded T.UTCTime ->
  SeldaTransactionT m [Reservation]
reservationList :: forall (m :: * -> *).
(MonadLogger m, MonadSeldaPool m) =>
IdentifierDesk
-> IntervalUnbounded UTCTime -> SeldaTransactionT m [Reservation]
reservationList IdentifierDesk
deskIdentifier IntervalUnbounded UTCTime
timestampIntervalUnbounded = do
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ Text
"Looking up desk's reservations: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack ((IdentifierDesk, IntervalUnbounded UTCTime) -> String
forall a. Show a => a -> String
show (IdentifierDesk
deskIdentifier, IntervalUnbounded UTCTime
timestampIntervalUnbounded))
  [DbReservation]
dbReservations <- Query (Backend (SeldaTransactionT m)) (Row SQLite DbReservation)
-> SeldaTransactionT m [Res (Row SQLite DbReservation)]
forall (m :: * -> *) a.
(MonadSelda m, Result a) =>
Query (Backend m) a -> m [Res a]
Selda.query (Query (Backend (SeldaTransactionT m)) (Row SQLite DbReservation)
 -> SeldaTransactionT m [Res (Row SQLite DbReservation)])
-> Query (Backend (SeldaTransactionT m)) (Row SQLite DbReservation)
-> SeldaTransactionT m [Res (Row SQLite DbReservation)]
forall a b. (a -> b) -> a -> b
$ do
    Row SQLite DbReservation
dbReservation <- Table DbReservation -> Query SQLite (Row SQLite DbReservation)
forall a s. Relational a => Table a -> Query s (Row s a)
Selda.select Table DbReservation
tableReservation
    Col SQLite Bool -> Query SQLite ()
forall s t. Same s t => Col s Bool -> Query t ()
Selda.restrict (Col SQLite Bool -> Query SQLite ())
-> Col SQLite Bool -> Query SQLite ()
forall a b. (a -> b) -> a -> b
$ Row SQLite DbReservation
dbReservation Row SQLite DbReservation
-> Selector DbReservation (ID DbDesk) -> Col SQLite (ID DbDesk)
forall a s t. SqlType a => Row s t -> Selector t a -> Col s a
Selda.! Selector DbReservation (ID DbDesk)
#dbReservation_desk Col SQLite (ID DbDesk) -> Col SQLite (ID DbDesk) -> Col SQLite Bool
forall s t a.
(Same s t, SqlType a) =>
Col s a -> Col t a -> Col s Bool
Selda..== ID DbDesk -> Col SQLite (ID DbDesk)
forall {k} a (s :: k). SqlType a => a -> Col s a
Selda.literal (forall a. Int64 -> ID a
Selda.toId @DbDesk (Int64 -> ID DbDesk) -> Int64 -> ID DbDesk
forall a b. (a -> b) -> a -> b
$ IdentifierDesk -> Int64
unIdentifierDesk IdentifierDesk
deskIdentifier)
    case IntervalUnbounded UTCTime -> MaybeUnboundedLow UTCTime
forall a. IntervalUnbounded a -> MaybeUnboundedLow a
intervalUnboundedStart IntervalUnbounded UTCTime
timestampIntervalUnbounded of
      MaybeUnboundedLow UTCTime
NothingUnboundedLow -> () -> Query SQLite ()
forall a. a -> Query SQLite a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
      JustUnboundedLow UTCTime
timestampBegin ->
        Col SQLite Bool -> Query SQLite ()
forall s t. Same s t => Col s Bool -> Query t ()
Selda.restrict (Col SQLite Bool -> Query SQLite ())
-> Col SQLite Bool -> Query SQLite ()
forall a b. (a -> b) -> a -> b
$ Row SQLite DbReservation
dbReservation Row SQLite DbReservation
-> Selector DbReservation UTCTime -> Col SQLite UTCTime
forall a s t. SqlType a => Row s t -> Selector t a -> Col s a
Selda.! Selector DbReservation UTCTime
#dbReservation_time_end Col SQLite UTCTime -> Col SQLite UTCTime -> Col SQLite Bool
forall s t a.
(Same s t, SqlOrd a) =>
Col s a -> Col t a -> Col s Bool
Selda..> UTCTime -> Col SQLite UTCTime
forall {k} a (s :: k). SqlType a => a -> Col s a
Selda.literal UTCTime
timestampBegin
    case IntervalUnbounded UTCTime -> MaybeUnboundedHigh UTCTime
forall a. IntervalUnbounded a -> MaybeUnboundedHigh a
intervalUnboundedEnd IntervalUnbounded UTCTime
timestampIntervalUnbounded of
      MaybeUnboundedHigh UTCTime
NothingUnboundedHigh -> () -> Query SQLite ()
forall a. a -> Query SQLite a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
      JustUnboundedHigh UTCTime
timestampEnd ->
        Col SQLite Bool -> Query SQLite ()
forall s t. Same s t => Col s Bool -> Query t ()
Selda.restrict (Col SQLite Bool -> Query SQLite ())
-> Col SQLite Bool -> Query SQLite ()
forall a b. (a -> b) -> a -> b
$ Row SQLite DbReservation
dbReservation Row SQLite DbReservation
-> Selector DbReservation UTCTime -> Col SQLite UTCTime
forall a s t. SqlType a => Row s t -> Selector t a -> Col s a
Selda.! Selector DbReservation UTCTime
#dbReservation_time_begin Col SQLite UTCTime -> Col SQLite UTCTime -> Col SQLite Bool
forall s t a.
(Same s t, SqlOrd a) =>
Col s a -> Col t a -> Col s Bool
Selda..< UTCTime -> Col SQLite UTCTime
forall {k} a (s :: k). SqlType a => a -> Col s a
Selda.literal UTCTime
timestampEnd
    Row SQLite DbReservation -> Query SQLite (Row SQLite DbReservation)
forall a. a -> Query SQLite a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Row SQLite DbReservation
dbReservation
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logInfo Text
"Looked up desk's reservations successfully."
  let toReservation :: DbReservation -> Reservation
toReservation
        MkDbReservation
          { ID DbReservation
dbReservation_id :: DbReservation -> ID DbReservation
dbReservation_id :: ID DbReservation
dbReservation_id
          , ID DbDesk
dbReservation_desk :: DbReservation -> ID DbDesk
dbReservation_desk :: ID DbDesk
dbReservation_desk
          , ID DbUser
dbReservation_user :: DbReservation -> ID DbUser
dbReservation_user :: ID DbUser
dbReservation_user
          , UTCTime
dbReservation_time_begin :: DbReservation -> UTCTime
dbReservation_time_begin :: UTCTime
dbReservation_time_begin
          , UTCTime
dbReservation_time_end :: DbReservation -> UTCTime
dbReservation_time_end :: UTCTime
dbReservation_time_end
          , DbReservationStatus
dbReservation_status :: DbReservation -> DbReservationStatus
dbReservation_status :: DbReservationStatus
dbReservation_status
          } =
          MkReservation
            { reservationId :: IdentifierReservation
reservationId = Int64 -> IdentifierReservation
MkIdentifierReservation (Int64 -> IdentifierReservation) -> Int64 -> IdentifierReservation
forall a b. (a -> b) -> a -> b
$ forall a. ID a -> Int64
Selda.fromId @DbReservation ID DbReservation
dbReservation_id
            , reservationDesk :: IdentifierDesk
reservationDesk = Int64 -> IdentifierDesk
MkIdentifierDesk (Int64 -> IdentifierDesk) -> Int64 -> IdentifierDesk
forall a b. (a -> b) -> a -> b
$ forall a. ID a -> Int64
Selda.fromId @DbDesk ID DbDesk
dbReservation_desk
            , reservationUser :: IdentifierUser
reservationUser = Int64 -> IdentifierUser
MkIdentifierUser (Int64 -> IdentifierUser) -> Int64 -> IdentifierUser
forall a b. (a -> b) -> a -> b
$ forall a. ID a -> Int64
Selda.fromId @DbUser ID DbUser
dbReservation_user
            , reservationTimeBegin :: UTCTime
reservationTimeBegin = UTCTime
dbReservation_time_begin
            , reservationTimeEnd :: UTCTime
reservationTimeEnd = UTCTime
dbReservation_time_end
            , reservationStatus :: StatusReservation
reservationStatus = case DbReservationStatus
dbReservation_status of
                DbReservationStatus
MkDbReservationStatus_planned -> StatusReservation
MkStatusReservationPlanned
                DbReservationStatus
MkDbReservationStatus_cancelled -> StatusReservation
MkStatusReservationCancelled
            }
  [Reservation] -> SeldaTransactionT m [Reservation]
forall a. a -> SeldaTransactionT m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Reservation] -> SeldaTransactionT m [Reservation])
-> [Reservation] -> SeldaTransactionT m [Reservation]
forall a b. (a -> b) -> a -> b
$ DbReservation -> Reservation
toReservation (DbReservation -> Reservation) -> [DbReservation] -> [Reservation]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [DbReservation]
dbReservations

-- | List all reservations of a user, that overlap with the given time window.
reservationListUser ::
  (MonadLogger m, MonadSeldaPool m) =>
  IdentifierUser ->
  IntervalUnbounded T.UTCTime ->
  SeldaTransactionT m [Reservation]
reservationListUser :: forall (m :: * -> *).
(MonadLogger m, MonadSeldaPool m) =>
IdentifierUser
-> IntervalUnbounded UTCTime -> SeldaTransactionT m [Reservation]
reservationListUser IdentifierUser
userIdentifier IntervalUnbounded UTCTime
timestampIntervalUnbounded = do
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ Text
"Looking up user's reservations: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> String -> Text
T.pack ((IdentifierUser, IntervalUnbounded UTCTime) -> String
forall a. Show a => a -> String
show (IdentifierUser
userIdentifier, IntervalUnbounded UTCTime
timestampIntervalUnbounded))
  [DbReservation]
dbReservations <- Query (Backend (SeldaTransactionT m)) (Row SQLite DbReservation)
-> SeldaTransactionT m [Res (Row SQLite DbReservation)]
forall (m :: * -> *) a.
(MonadSelda m, Result a) =>
Query (Backend m) a -> m [Res a]
Selda.query (Query (Backend (SeldaTransactionT m)) (Row SQLite DbReservation)
 -> SeldaTransactionT m [Res (Row SQLite DbReservation)])
-> Query (Backend (SeldaTransactionT m)) (Row SQLite DbReservation)
-> SeldaTransactionT m [Res (Row SQLite DbReservation)]
forall a b. (a -> b) -> a -> b
$ do
    Row SQLite DbReservation
dbReservation <- Table DbReservation -> Query SQLite (Row SQLite DbReservation)
forall a s. Relational a => Table a -> Query s (Row s a)
Selda.select Table DbReservation
tableReservation
    Col SQLite Bool -> Query SQLite ()
forall s t. Same s t => Col s Bool -> Query t ()
Selda.restrict (Col SQLite Bool -> Query SQLite ())
-> Col SQLite Bool -> Query SQLite ()
forall a b. (a -> b) -> a -> b
$ Row SQLite DbReservation
dbReservation Row SQLite DbReservation
-> Selector DbReservation (ID DbUser) -> Col SQLite (ID DbUser)
forall a s t. SqlType a => Row s t -> Selector t a -> Col s a
Selda.! Selector DbReservation (ID DbUser)
#dbReservation_user Col SQLite (ID DbUser) -> Col SQLite (ID DbUser) -> Col SQLite Bool
forall s t a.
(Same s t, SqlType a) =>
Col s a -> Col t a -> Col s Bool
Selda..== ID DbUser -> Col SQLite (ID DbUser)
forall {k} a (s :: k). SqlType a => a -> Col s a
Selda.literal (forall a. Int64 -> ID a
Selda.toId @DbUser (Int64 -> ID DbUser) -> Int64 -> ID DbUser
forall a b. (a -> b) -> a -> b
$ IdentifierUser -> Int64
unIdentifierUser IdentifierUser
userIdentifier)
    -- TODO: Improve overlapping behaviour (OR instead of AND?).
    case IntervalUnbounded UTCTime -> MaybeUnboundedLow UTCTime
forall a. IntervalUnbounded a -> MaybeUnboundedLow a
intervalUnboundedStart IntervalUnbounded UTCTime
timestampIntervalUnbounded of
      MaybeUnboundedLow UTCTime
NothingUnboundedLow -> () -> Query SQLite ()
forall a. a -> Query SQLite a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
      JustUnboundedLow UTCTime
timestampBegin ->
        Col SQLite Bool -> Query SQLite ()
forall s t. Same s t => Col s Bool -> Query t ()
Selda.restrict (Col SQLite Bool -> Query SQLite ())
-> Col SQLite Bool -> Query SQLite ()
forall a b. (a -> b) -> a -> b
$ Row SQLite DbReservation
dbReservation Row SQLite DbReservation
-> Selector DbReservation UTCTime -> Col SQLite UTCTime
forall a s t. SqlType a => Row s t -> Selector t a -> Col s a
Selda.! Selector DbReservation UTCTime
#dbReservation_time_end Col SQLite UTCTime -> Col SQLite UTCTime -> Col SQLite Bool
forall s t a.
(Same s t, SqlOrd a) =>
Col s a -> Col t a -> Col s Bool
Selda..> UTCTime -> Col SQLite UTCTime
forall {k} a (s :: k). SqlType a => a -> Col s a
Selda.literal UTCTime
timestampBegin
    case IntervalUnbounded UTCTime -> MaybeUnboundedHigh UTCTime
forall a. IntervalUnbounded a -> MaybeUnboundedHigh a
intervalUnboundedEnd IntervalUnbounded UTCTime
timestampIntervalUnbounded of
      MaybeUnboundedHigh UTCTime
NothingUnboundedHigh -> () -> Query SQLite ()
forall a. a -> Query SQLite a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
      JustUnboundedHigh UTCTime
timestampEnd ->
        Col SQLite Bool -> Query SQLite ()
forall s t. Same s t => Col s Bool -> Query t ()
Selda.restrict (Col SQLite Bool -> Query SQLite ())
-> Col SQLite Bool -> Query SQLite ()
forall a b. (a -> b) -> a -> b
$ Row SQLite DbReservation
dbReservation Row SQLite DbReservation
-> Selector DbReservation UTCTime -> Col SQLite UTCTime
forall a s t. SqlType a => Row s t -> Selector t a -> Col s a
Selda.! Selector DbReservation UTCTime
#dbReservation_time_begin Col SQLite UTCTime -> Col SQLite UTCTime -> Col SQLite Bool
forall s t a.
(Same s t, SqlOrd a) =>
Col s a -> Col t a -> Col s Bool
Selda..< UTCTime -> Col SQLite UTCTime
forall {k} a (s :: k). SqlType a => a -> Col s a
Selda.literal UTCTime
timestampEnd
    Row SQLite DbReservation -> Query SQLite (Row SQLite DbReservation)
forall a. a -> Query SQLite a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Row SQLite DbReservation
dbReservation
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logInfo Text
"Looked up user's reservations successfully."
  let toReservation :: DbReservation -> Reservation
toReservation
        MkDbReservation
          { ID DbReservation
dbReservation_id :: DbReservation -> ID DbReservation
dbReservation_id :: ID DbReservation
dbReservation_id
          , ID DbDesk
dbReservation_desk :: DbReservation -> ID DbDesk
dbReservation_desk :: ID DbDesk
dbReservation_desk
          , ID DbUser
dbReservation_user :: DbReservation -> ID DbUser
dbReservation_user :: ID DbUser
dbReservation_user
          , UTCTime
dbReservation_time_begin :: DbReservation -> UTCTime
dbReservation_time_begin :: UTCTime
dbReservation_time_begin
          , UTCTime
dbReservation_time_end :: DbReservation -> UTCTime
dbReservation_time_end :: UTCTime
dbReservation_time_end
          , DbReservationStatus
dbReservation_status :: DbReservation -> DbReservationStatus
dbReservation_status :: DbReservationStatus
dbReservation_status
          } =
          MkReservation
            { reservationId :: IdentifierReservation
reservationId = Int64 -> IdentifierReservation
MkIdentifierReservation (Int64 -> IdentifierReservation) -> Int64 -> IdentifierReservation
forall a b. (a -> b) -> a -> b
$ forall a. ID a -> Int64
Selda.fromId @DbReservation ID DbReservation
dbReservation_id
            , reservationDesk :: IdentifierDesk
reservationDesk = Int64 -> IdentifierDesk
MkIdentifierDesk (Int64 -> IdentifierDesk) -> Int64 -> IdentifierDesk
forall a b. (a -> b) -> a -> b
$ forall a. ID a -> Int64
Selda.fromId @DbDesk ID DbDesk
dbReservation_desk
            , reservationUser :: IdentifierUser
reservationUser = Int64 -> IdentifierUser
MkIdentifierUser (Int64 -> IdentifierUser) -> Int64 -> IdentifierUser
forall a b. (a -> b) -> a -> b
$ forall a. ID a -> Int64
Selda.fromId @DbUser ID DbUser
dbReservation_user
            , reservationTimeBegin :: UTCTime
reservationTimeBegin = UTCTime
dbReservation_time_begin
            , reservationTimeEnd :: UTCTime
reservationTimeEnd = UTCTime
dbReservation_time_end
            , reservationStatus :: StatusReservation
reservationStatus = case DbReservationStatus
dbReservation_status of
                DbReservationStatus
MkDbReservationStatus_planned -> StatusReservation
MkStatusReservationPlanned
                DbReservationStatus
MkDbReservationStatus_cancelled -> StatusReservation
MkStatusReservationCancelled
            }
  [Reservation] -> SeldaTransactionT m [Reservation]
forall a. a -> SeldaTransactionT m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([Reservation] -> SeldaTransactionT m [Reservation])
-> [Reservation] -> SeldaTransactionT m [Reservation]
forall a b. (a -> b) -> a -> b
$ DbReservation -> Reservation
toReservation (DbReservation -> Reservation) -> [DbReservation] -> [Reservation]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [DbReservation]
dbReservations

reservationCreate ::
  (MonadLogger m, MonadSeldaPool m) =>
  IdentifierDesk ->
  IdentifierUser ->
  IntervalNonDegenerate T.UTCTime ->
  SeldaTransactionT m IdentifierReservation
reservationCreate :: forall (m :: * -> *).
(MonadLogger m, MonadSeldaPool m) =>
IdentifierDesk
-> IdentifierUser
-> IntervalNonDegenerate UTCTime
-> SeldaTransactionT m IdentifierReservation
reservationCreate IdentifierDesk
deskIdentifier IdentifierUser
userIdentifier IntervalNonDegenerate UTCTime
timestampInterval = do
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug Text
"Creating reservation."
  let
    start :: UTCTime
start = Interval UTCTime -> UTCTime
forall a. Interval a -> a
intervalStart (Interval UTCTime -> UTCTime) -> Interval UTCTime -> UTCTime
forall a b. (a -> b) -> a -> b
$ IntervalNonDegenerate UTCTime -> Interval UTCTime
forall a. IntervalNonDegenerate a -> Interval a
unIntervalNonDegenerate IntervalNonDegenerate UTCTime
timestampInterval
    end :: UTCTime
end = Interval UTCTime -> UTCTime
forall a. Interval a -> a
intervalEnd (Interval UTCTime -> UTCTime) -> Interval UTCTime -> UTCTime
forall a b. (a -> b) -> a -> b
$ IntervalNonDegenerate UTCTime -> Interval UTCTime
forall a. IntervalNonDegenerate a -> Interval a
unIntervalNonDegenerate IntervalNonDegenerate UTCTime
timestampInterval
  [Reservation]
reservations <- IdentifierDesk
-> IntervalUnbounded UTCTime -> SeldaTransactionT m [Reservation]
forall (m :: * -> *).
(MonadLogger m, MonadSeldaPool m) =>
IdentifierDesk
-> IntervalUnbounded UTCTime -> SeldaTransactionT m [Reservation]
reservationList IdentifierDesk
deskIdentifier (IntervalUnbounded UTCTime -> SeldaTransactionT m [Reservation])
-> IntervalUnbounded UTCTime -> SeldaTransactionT m [Reservation]
forall a b. (a -> b) -> a -> b
$ Interval UTCTime -> IntervalUnbounded UTCTime
forall a. Interval a -> IntervalUnbounded a
mkIntervalUnboundedFromBounded (Interval UTCTime -> IntervalUnbounded UTCTime)
-> Interval UTCTime -> IntervalUnbounded UTCTime
forall a b. (a -> b) -> a -> b
$ IntervalNonDegenerate UTCTime -> Interval UTCTime
forall a. IntervalNonDegenerate a -> Interval a
mkIntervalFromNonDegenerate IntervalNonDegenerate UTCTime
timestampInterval
  case (Reservation -> Bool) -> [Reservation] -> [Reservation]
forall a. (a -> Bool) -> [a] -> [a]
filter ((StatusReservation -> StatusReservation -> Bool
forall a. Eq a => a -> a -> Bool
== StatusReservation
MkStatusReservationPlanned) (StatusReservation -> Bool)
-> (Reservation -> StatusReservation) -> Reservation -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Reservation -> StatusReservation
reservationStatus) [Reservation]
reservations of
    Reservation
_ : [Reservation]
_ -> do
      m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logWarn Text
"Desk is already reserved."
      SqlErrorMensamDeskAlreadyReserved -> SeldaTransactionT m ()
forall e a.
(HasCallStack, Exception e) =>
e -> SeldaTransactionT m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM SqlErrorMensamDeskAlreadyReserved
MkSqlErrorMensamDeskAlreadyReserved
    [] -> m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug Text
"Desk is still free."
  let dbReservation :: DbReservation
dbReservation =
        MkDbReservation
          { dbReservation_id :: ID DbReservation
dbReservation_id = ID DbReservation
forall a. SqlType a => a
Selda.def
          , dbReservation_desk :: ID DbDesk
dbReservation_desk = forall a. Int64 -> ID a
Selda.toId @DbDesk (Int64 -> ID DbDesk) -> Int64 -> ID DbDesk
forall a b. (a -> b) -> a -> b
$ IdentifierDesk -> Int64
unIdentifierDesk IdentifierDesk
deskIdentifier
          , dbReservation_user :: ID DbUser
dbReservation_user = forall a. Int64 -> ID a
Selda.toId @DbUser (Int64 -> ID DbUser) -> Int64 -> ID DbUser
forall a b. (a -> b) -> a -> b
$ IdentifierUser -> Int64
unIdentifierUser IdentifierUser
userIdentifier
          , dbReservation_time_begin :: UTCTime
dbReservation_time_begin = UTCTime
start
          , dbReservation_time_end :: UTCTime
dbReservation_time_end = UTCTime
end
          , dbReservation_status :: DbReservationStatus
dbReservation_status = DbReservationStatus
MkDbReservationStatus_planned
          }
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug Text
"Inserting reservation into database."
  ID DbReservation
dbReservationId <- Table DbReservation
-> [DbReservation] -> SeldaTransactionT m (ID DbReservation)
forall (m :: * -> *) a.
(MonadSelda m, Relational a) =>
Table a -> [a] -> m (ID a)
Selda.insertWithPK Table DbReservation
tableReservation [DbReservation
dbReservation]
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logInfo Text
"Created reservation successfully."
  IdentifierReservation -> SeldaTransactionT m IdentifierReservation
forall a. a -> SeldaTransactionT m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (IdentifierReservation
 -> SeldaTransactionT m IdentifierReservation)
-> IdentifierReservation
-> SeldaTransactionT m IdentifierReservation
forall a b. (a -> b) -> a -> b
$ Int64 -> IdentifierReservation
MkIdentifierReservation (Int64 -> IdentifierReservation) -> Int64 -> IdentifierReservation
forall a b. (a -> b) -> a -> b
$ forall a. ID a -> Int64
Selda.fromId @DbReservation ID DbReservation
dbReservationId

type SqlErrorMensamDeskAlreadyReserved :: Type
data SqlErrorMensamDeskAlreadyReserved = MkSqlErrorMensamDeskAlreadyReserved
  deriving stock (SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
(SqlErrorMensamDeskAlreadyReserved
 -> SqlErrorMensamDeskAlreadyReserved -> Bool)
-> (SqlErrorMensamDeskAlreadyReserved
    -> SqlErrorMensamDeskAlreadyReserved -> Bool)
-> Eq SqlErrorMensamDeskAlreadyReserved
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
== :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
$c/= :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
/= :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
Eq, (forall x.
 SqlErrorMensamDeskAlreadyReserved
 -> Rep SqlErrorMensamDeskAlreadyReserved x)
-> (forall x.
    Rep SqlErrorMensamDeskAlreadyReserved x
    -> SqlErrorMensamDeskAlreadyReserved)
-> Generic SqlErrorMensamDeskAlreadyReserved
forall x.
Rep SqlErrorMensamDeskAlreadyReserved x
-> SqlErrorMensamDeskAlreadyReserved
forall x.
SqlErrorMensamDeskAlreadyReserved
-> Rep SqlErrorMensamDeskAlreadyReserved x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
SqlErrorMensamDeskAlreadyReserved
-> Rep SqlErrorMensamDeskAlreadyReserved x
from :: forall x.
SqlErrorMensamDeskAlreadyReserved
-> Rep SqlErrorMensamDeskAlreadyReserved x
$cto :: forall x.
Rep SqlErrorMensamDeskAlreadyReserved x
-> SqlErrorMensamDeskAlreadyReserved
to :: forall x.
Rep SqlErrorMensamDeskAlreadyReserved x
-> SqlErrorMensamDeskAlreadyReserved
Generic, Eq SqlErrorMensamDeskAlreadyReserved
Eq SqlErrorMensamDeskAlreadyReserved =>
(SqlErrorMensamDeskAlreadyReserved
 -> SqlErrorMensamDeskAlreadyReserved -> Ordering)
-> (SqlErrorMensamDeskAlreadyReserved
    -> SqlErrorMensamDeskAlreadyReserved -> Bool)
-> (SqlErrorMensamDeskAlreadyReserved
    -> SqlErrorMensamDeskAlreadyReserved -> Bool)
-> (SqlErrorMensamDeskAlreadyReserved
    -> SqlErrorMensamDeskAlreadyReserved -> Bool)
-> (SqlErrorMensamDeskAlreadyReserved
    -> SqlErrorMensamDeskAlreadyReserved -> Bool)
-> (SqlErrorMensamDeskAlreadyReserved
    -> SqlErrorMensamDeskAlreadyReserved
    -> SqlErrorMensamDeskAlreadyReserved)
-> (SqlErrorMensamDeskAlreadyReserved
    -> SqlErrorMensamDeskAlreadyReserved
    -> SqlErrorMensamDeskAlreadyReserved)
-> Ord SqlErrorMensamDeskAlreadyReserved
SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Ordering
SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Ordering
compare :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Ordering
$c< :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
< :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
$c<= :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
<= :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
$c> :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
> :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
$c>= :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
>= :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved -> Bool
$cmax :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved
max :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved
$cmin :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved
min :: SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved
-> SqlErrorMensamDeskAlreadyReserved
Ord, ReadPrec [SqlErrorMensamDeskAlreadyReserved]
ReadPrec SqlErrorMensamDeskAlreadyReserved
Int -> ReadS SqlErrorMensamDeskAlreadyReserved
ReadS [SqlErrorMensamDeskAlreadyReserved]
(Int -> ReadS SqlErrorMensamDeskAlreadyReserved)
-> ReadS [SqlErrorMensamDeskAlreadyReserved]
-> ReadPrec SqlErrorMensamDeskAlreadyReserved
-> ReadPrec [SqlErrorMensamDeskAlreadyReserved]
-> Read SqlErrorMensamDeskAlreadyReserved
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS SqlErrorMensamDeskAlreadyReserved
readsPrec :: Int -> ReadS SqlErrorMensamDeskAlreadyReserved
$creadList :: ReadS [SqlErrorMensamDeskAlreadyReserved]
readList :: ReadS [SqlErrorMensamDeskAlreadyReserved]
$creadPrec :: ReadPrec SqlErrorMensamDeskAlreadyReserved
readPrec :: ReadPrec SqlErrorMensamDeskAlreadyReserved
$creadListPrec :: ReadPrec [SqlErrorMensamDeskAlreadyReserved]
readListPrec :: ReadPrec [SqlErrorMensamDeskAlreadyReserved]
Read, Int -> SqlErrorMensamDeskAlreadyReserved -> ShowS
[SqlErrorMensamDeskAlreadyReserved] -> ShowS
SqlErrorMensamDeskAlreadyReserved -> String
(Int -> SqlErrorMensamDeskAlreadyReserved -> ShowS)
-> (SqlErrorMensamDeskAlreadyReserved -> String)
-> ([SqlErrorMensamDeskAlreadyReserved] -> ShowS)
-> Show SqlErrorMensamDeskAlreadyReserved
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SqlErrorMensamDeskAlreadyReserved -> ShowS
showsPrec :: Int -> SqlErrorMensamDeskAlreadyReserved -> ShowS
$cshow :: SqlErrorMensamDeskAlreadyReserved -> String
show :: SqlErrorMensamDeskAlreadyReserved -> String
$cshowList :: [SqlErrorMensamDeskAlreadyReserved] -> ShowS
showList :: [SqlErrorMensamDeskAlreadyReserved] -> ShowS
Show)
  deriving anyclass (Show SqlErrorMensamDeskAlreadyReserved
Typeable SqlErrorMensamDeskAlreadyReserved
(Typeable SqlErrorMensamDeskAlreadyReserved,
 Show SqlErrorMensamDeskAlreadyReserved) =>
(SqlErrorMensamDeskAlreadyReserved -> SomeException)
-> (SomeException -> Maybe SqlErrorMensamDeskAlreadyReserved)
-> (SqlErrorMensamDeskAlreadyReserved -> String)
-> Exception SqlErrorMensamDeskAlreadyReserved
SomeException -> Maybe SqlErrorMensamDeskAlreadyReserved
SqlErrorMensamDeskAlreadyReserved -> String
SqlErrorMensamDeskAlreadyReserved -> SomeException
forall e.
(Typeable e, Show e) =>
(e -> SomeException)
-> (SomeException -> Maybe e) -> (e -> String) -> Exception e
$ctoException :: SqlErrorMensamDeskAlreadyReserved -> SomeException
toException :: SqlErrorMensamDeskAlreadyReserved -> SomeException
$cfromException :: SomeException -> Maybe SqlErrorMensamDeskAlreadyReserved
fromException :: SomeException -> Maybe SqlErrorMensamDeskAlreadyReserved
$cdisplayException :: SqlErrorMensamDeskAlreadyReserved -> String
displayException :: SqlErrorMensamDeskAlreadyReserved -> String
Exception)

reservationCancel ::
  (MonadIO m, MonadLogger m, MonadSeldaPool m) =>
  IdentifierReservation ->
  SeldaTransactionT m ()
reservationCancel :: forall (m :: * -> *).
(MonadIO m, MonadLogger m, MonadSeldaPool m) =>
IdentifierReservation -> SeldaTransactionT m ()
reservationCancel IdentifierReservation
reservationIdentifier = do
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug Text
"Cancelling reservation."
  Reservation
reservation <- IdentifierReservation -> SeldaTransactionT m Reservation
forall (m :: * -> *).
(MonadLogger m, MonadSeldaPool m) =>
IdentifierReservation -> SeldaTransactionT m Reservation
reservationGet IdentifierReservation
reservationIdentifier
  case Reservation -> StatusReservation
reservationStatus Reservation
reservation of
    StatusReservation
MkStatusReservationCancelled -> do
      m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug Text
"Reservation is already cancelled."
      SqlErrorMensamReservationAlreadyCancelled -> SeldaTransactionT m ()
forall e a.
(HasCallStack, Exception e) =>
e -> SeldaTransactionT m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM SqlErrorMensamReservationAlreadyCancelled
MkSqlErrorMensamReservationAlreadyCancelled
    StatusReservation
MkStatusReservationPlanned ->
      m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug Text
"Reservation is currently still planned."
  UTCTime
timeCurrent <- m UTCTime -> SeldaTransactionT m UTCTime
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m UTCTime -> SeldaTransactionT m UTCTime)
-> m UTCTime -> SeldaTransactionT m UTCTime
forall a b. (a -> b) -> a -> b
$ IO UTCTime -> m UTCTime
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO UTCTime
T.getCurrentTime
  if UTCTime
timeCurrent UTCTime -> UTCTime -> Bool
forall a. Ord a => a -> a -> Bool
>= Reservation -> UTCTime
reservationTimeBegin Reservation
reservation
    then do
      m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug Text
"Reservation has already started."
      SqlErrorMensamReservationIsInThePast -> SeldaTransactionT m ()
forall e a.
(HasCallStack, Exception e) =>
e -> SeldaTransactionT m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM SqlErrorMensamReservationIsInThePast
MkSqlErrorMensamReservationIsInThePast
    else m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logDebug Text
"Reservation is set for a time in the future."
  Table DbReservation
-> (Row (Backend (SeldaTransactionT m)) DbReservation
    -> Col (Backend (SeldaTransactionT m)) Bool)
-> (Row (Backend (SeldaTransactionT m)) DbReservation
    -> Row (Backend (SeldaTransactionT m)) DbReservation)
-> SeldaTransactionT m ()
forall (m :: * -> *) a.
(MonadSelda m, Relational a) =>
Table a
-> (Row (Backend m) a -> Col (Backend m) Bool)
-> (Row (Backend m) a -> Row (Backend m) a)
-> m ()
Selda.update_
    Table DbReservation
tableReservation
    (\Row (Backend (SeldaTransactionT m)) DbReservation
dbReservation -> Row (Backend (SeldaTransactionT m)) DbReservation
Row SQLite DbReservation
dbReservation Row SQLite DbReservation
-> Selector DbReservation (ID DbReservation)
-> Col SQLite (ID DbReservation)
forall a s t. SqlType a => Row s t -> Selector t a -> Col s a
Selda.! Selector DbReservation (ID DbReservation)
#dbReservation_id Col SQLite (ID DbReservation)
-> Col SQLite (ID DbReservation) -> Col SQLite Bool
forall s t a.
(Same s t, SqlType a) =>
Col s a -> Col t a -> Col s Bool
Selda..== ID DbReservation -> Col SQLite (ID DbReservation)
forall {k} a (s :: k). SqlType a => a -> Col s a
Selda.literal (forall a. Int64 -> ID a
Selda.toId @DbReservation (Int64 -> ID DbReservation) -> Int64 -> ID DbReservation
forall a b. (a -> b) -> a -> b
$ IdentifierReservation -> Int64
unIdentifierReservation IdentifierReservation
reservationIdentifier))
    (\Row (Backend (SeldaTransactionT m)) DbReservation
dbReservation -> Row (Backend (SeldaTransactionT m)) DbReservation
Row SQLite DbReservation
dbReservation Row SQLite DbReservation
-> [Assignment SQLite DbReservation] -> Row SQLite DbReservation
forall s a. Row s a -> [Assignment s a] -> Row s a
`Selda.with` [Selector DbReservation DbReservationStatus
#dbReservation_status Selector DbReservation DbReservationStatus
-> Col SQLite DbReservationStatus
-> Assignment SQLite DbReservation
forall a a1 s. Selector a a1 -> Col s a1 -> Assignment s a
Selda.:= DbReservationStatus -> Col SQLite DbReservationStatus
forall {k} a (s :: k). SqlType a => a -> Col s a
Selda.literal DbReservationStatus
MkDbReservationStatus_cancelled])
  m () -> SeldaTransactionT m ()
forall (m :: * -> *) a. Monad m => m a -> SeldaTransactionT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> SeldaTransactionT m ()) -> m () -> SeldaTransactionT m ()
forall a b. (a -> b) -> a -> b
$ Text -> m ()
forall (m :: * -> *). (HasCallStack, MonadLogger m) => Text -> m ()
logInfo Text
"Cancelled reservation successfully."

type SqlErrorMensamReservationAlreadyCancelled :: Type
data SqlErrorMensamReservationAlreadyCancelled = MkSqlErrorMensamReservationAlreadyCancelled
  deriving stock (SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
(SqlErrorMensamReservationAlreadyCancelled
 -> SqlErrorMensamReservationAlreadyCancelled -> Bool)
-> (SqlErrorMensamReservationAlreadyCancelled
    -> SqlErrorMensamReservationAlreadyCancelled -> Bool)
-> Eq SqlErrorMensamReservationAlreadyCancelled
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
== :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
$c/= :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
/= :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
Eq, (forall x.
 SqlErrorMensamReservationAlreadyCancelled
 -> Rep SqlErrorMensamReservationAlreadyCancelled x)
-> (forall x.
    Rep SqlErrorMensamReservationAlreadyCancelled x
    -> SqlErrorMensamReservationAlreadyCancelled)
-> Generic SqlErrorMensamReservationAlreadyCancelled
forall x.
Rep SqlErrorMensamReservationAlreadyCancelled x
-> SqlErrorMensamReservationAlreadyCancelled
forall x.
SqlErrorMensamReservationAlreadyCancelled
-> Rep SqlErrorMensamReservationAlreadyCancelled x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
SqlErrorMensamReservationAlreadyCancelled
-> Rep SqlErrorMensamReservationAlreadyCancelled x
from :: forall x.
SqlErrorMensamReservationAlreadyCancelled
-> Rep SqlErrorMensamReservationAlreadyCancelled x
$cto :: forall x.
Rep SqlErrorMensamReservationAlreadyCancelled x
-> SqlErrorMensamReservationAlreadyCancelled
to :: forall x.
Rep SqlErrorMensamReservationAlreadyCancelled x
-> SqlErrorMensamReservationAlreadyCancelled
Generic, Eq SqlErrorMensamReservationAlreadyCancelled
Eq SqlErrorMensamReservationAlreadyCancelled =>
(SqlErrorMensamReservationAlreadyCancelled
 -> SqlErrorMensamReservationAlreadyCancelled -> Ordering)
-> (SqlErrorMensamReservationAlreadyCancelled
    -> SqlErrorMensamReservationAlreadyCancelled -> Bool)
-> (SqlErrorMensamReservationAlreadyCancelled
    -> SqlErrorMensamReservationAlreadyCancelled -> Bool)
-> (SqlErrorMensamReservationAlreadyCancelled
    -> SqlErrorMensamReservationAlreadyCancelled -> Bool)
-> (SqlErrorMensamReservationAlreadyCancelled
    -> SqlErrorMensamReservationAlreadyCancelled -> Bool)
-> (SqlErrorMensamReservationAlreadyCancelled
    -> SqlErrorMensamReservationAlreadyCancelled
    -> SqlErrorMensamReservationAlreadyCancelled)
-> (SqlErrorMensamReservationAlreadyCancelled
    -> SqlErrorMensamReservationAlreadyCancelled
    -> SqlErrorMensamReservationAlreadyCancelled)
-> Ord SqlErrorMensamReservationAlreadyCancelled
SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Ordering
SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Ordering
compare :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Ordering
$c< :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
< :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
$c<= :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
<= :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
$c> :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
> :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
$c>= :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
>= :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled -> Bool
$cmax :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled
max :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled
$cmin :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled
min :: SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled
-> SqlErrorMensamReservationAlreadyCancelled
Ord, ReadPrec [SqlErrorMensamReservationAlreadyCancelled]
ReadPrec SqlErrorMensamReservationAlreadyCancelled
Int -> ReadS SqlErrorMensamReservationAlreadyCancelled
ReadS [SqlErrorMensamReservationAlreadyCancelled]
(Int -> ReadS SqlErrorMensamReservationAlreadyCancelled)
-> ReadS [SqlErrorMensamReservationAlreadyCancelled]
-> ReadPrec SqlErrorMensamReservationAlreadyCancelled
-> ReadPrec [SqlErrorMensamReservationAlreadyCancelled]
-> Read SqlErrorMensamReservationAlreadyCancelled
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS SqlErrorMensamReservationAlreadyCancelled
readsPrec :: Int -> ReadS SqlErrorMensamReservationAlreadyCancelled
$creadList :: ReadS [SqlErrorMensamReservationAlreadyCancelled]
readList :: ReadS [SqlErrorMensamReservationAlreadyCancelled]
$creadPrec :: ReadPrec SqlErrorMensamReservationAlreadyCancelled
readPrec :: ReadPrec SqlErrorMensamReservationAlreadyCancelled
$creadListPrec :: ReadPrec [SqlErrorMensamReservationAlreadyCancelled]
readListPrec :: ReadPrec [SqlErrorMensamReservationAlreadyCancelled]
Read, Int -> SqlErrorMensamReservationAlreadyCancelled -> ShowS
[SqlErrorMensamReservationAlreadyCancelled] -> ShowS
SqlErrorMensamReservationAlreadyCancelled -> String
(Int -> SqlErrorMensamReservationAlreadyCancelled -> ShowS)
-> (SqlErrorMensamReservationAlreadyCancelled -> String)
-> ([SqlErrorMensamReservationAlreadyCancelled] -> ShowS)
-> Show SqlErrorMensamReservationAlreadyCancelled
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SqlErrorMensamReservationAlreadyCancelled -> ShowS
showsPrec :: Int -> SqlErrorMensamReservationAlreadyCancelled -> ShowS
$cshow :: SqlErrorMensamReservationAlreadyCancelled -> String
show :: SqlErrorMensamReservationAlreadyCancelled -> String
$cshowList :: [SqlErrorMensamReservationAlreadyCancelled] -> ShowS
showList :: [SqlErrorMensamReservationAlreadyCancelled] -> ShowS
Show)
  deriving anyclass (Show SqlErrorMensamReservationAlreadyCancelled
Typeable SqlErrorMensamReservationAlreadyCancelled
(Typeable SqlErrorMensamReservationAlreadyCancelled,
 Show SqlErrorMensamReservationAlreadyCancelled) =>
(SqlErrorMensamReservationAlreadyCancelled -> SomeException)
-> (SomeException
    -> Maybe SqlErrorMensamReservationAlreadyCancelled)
-> (SqlErrorMensamReservationAlreadyCancelled -> String)
-> Exception SqlErrorMensamReservationAlreadyCancelled
SomeException -> Maybe SqlErrorMensamReservationAlreadyCancelled
SqlErrorMensamReservationAlreadyCancelled -> String
SqlErrorMensamReservationAlreadyCancelled -> SomeException
forall e.
(Typeable e, Show e) =>
(e -> SomeException)
-> (SomeException -> Maybe e) -> (e -> String) -> Exception e
$ctoException :: SqlErrorMensamReservationAlreadyCancelled -> SomeException
toException :: SqlErrorMensamReservationAlreadyCancelled -> SomeException
$cfromException :: SomeException -> Maybe SqlErrorMensamReservationAlreadyCancelled
fromException :: SomeException -> Maybe SqlErrorMensamReservationAlreadyCancelled
$cdisplayException :: SqlErrorMensamReservationAlreadyCancelled -> String
displayException :: SqlErrorMensamReservationAlreadyCancelled -> String
Exception)

type SqlErrorMensamReservationIsInThePast :: Type
data SqlErrorMensamReservationIsInThePast = MkSqlErrorMensamReservationIsInThePast
  deriving stock (SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
(SqlErrorMensamReservationIsInThePast
 -> SqlErrorMensamReservationIsInThePast -> Bool)
-> (SqlErrorMensamReservationIsInThePast
    -> SqlErrorMensamReservationIsInThePast -> Bool)
-> Eq SqlErrorMensamReservationIsInThePast
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
== :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
$c/= :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
/= :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
Eq, (forall x.
 SqlErrorMensamReservationIsInThePast
 -> Rep SqlErrorMensamReservationIsInThePast x)
-> (forall x.
    Rep SqlErrorMensamReservationIsInThePast x
    -> SqlErrorMensamReservationIsInThePast)
-> Generic SqlErrorMensamReservationIsInThePast
forall x.
Rep SqlErrorMensamReservationIsInThePast x
-> SqlErrorMensamReservationIsInThePast
forall x.
SqlErrorMensamReservationIsInThePast
-> Rep SqlErrorMensamReservationIsInThePast x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
SqlErrorMensamReservationIsInThePast
-> Rep SqlErrorMensamReservationIsInThePast x
from :: forall x.
SqlErrorMensamReservationIsInThePast
-> Rep SqlErrorMensamReservationIsInThePast x
$cto :: forall x.
Rep SqlErrorMensamReservationIsInThePast x
-> SqlErrorMensamReservationIsInThePast
to :: forall x.
Rep SqlErrorMensamReservationIsInThePast x
-> SqlErrorMensamReservationIsInThePast
Generic, Eq SqlErrorMensamReservationIsInThePast
Eq SqlErrorMensamReservationIsInThePast =>
(SqlErrorMensamReservationIsInThePast
 -> SqlErrorMensamReservationIsInThePast -> Ordering)
-> (SqlErrorMensamReservationIsInThePast
    -> SqlErrorMensamReservationIsInThePast -> Bool)
-> (SqlErrorMensamReservationIsInThePast
    -> SqlErrorMensamReservationIsInThePast -> Bool)
-> (SqlErrorMensamReservationIsInThePast
    -> SqlErrorMensamReservationIsInThePast -> Bool)
-> (SqlErrorMensamReservationIsInThePast
    -> SqlErrorMensamReservationIsInThePast -> Bool)
-> (SqlErrorMensamReservationIsInThePast
    -> SqlErrorMensamReservationIsInThePast
    -> SqlErrorMensamReservationIsInThePast)
-> (SqlErrorMensamReservationIsInThePast
    -> SqlErrorMensamReservationIsInThePast
    -> SqlErrorMensamReservationIsInThePast)
-> Ord SqlErrorMensamReservationIsInThePast
SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Ordering
SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Ordering
compare :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Ordering
$c< :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
< :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
$c<= :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
<= :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
$c> :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
> :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
$c>= :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
>= :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast -> Bool
$cmax :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast
max :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast
$cmin :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast
min :: SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast
-> SqlErrorMensamReservationIsInThePast
Ord, ReadPrec [SqlErrorMensamReservationIsInThePast]
ReadPrec SqlErrorMensamReservationIsInThePast
Int -> ReadS SqlErrorMensamReservationIsInThePast
ReadS [SqlErrorMensamReservationIsInThePast]
(Int -> ReadS SqlErrorMensamReservationIsInThePast)
-> ReadS [SqlErrorMensamReservationIsInThePast]
-> ReadPrec SqlErrorMensamReservationIsInThePast
-> ReadPrec [SqlErrorMensamReservationIsInThePast]
-> Read SqlErrorMensamReservationIsInThePast
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS SqlErrorMensamReservationIsInThePast
readsPrec :: Int -> ReadS SqlErrorMensamReservationIsInThePast
$creadList :: ReadS [SqlErrorMensamReservationIsInThePast]
readList :: ReadS [SqlErrorMensamReservationIsInThePast]
$creadPrec :: ReadPrec SqlErrorMensamReservationIsInThePast
readPrec :: ReadPrec SqlErrorMensamReservationIsInThePast
$creadListPrec :: ReadPrec [SqlErrorMensamReservationIsInThePast]
readListPrec :: ReadPrec [SqlErrorMensamReservationIsInThePast]
Read, Int -> SqlErrorMensamReservationIsInThePast -> ShowS
[SqlErrorMensamReservationIsInThePast] -> ShowS
SqlErrorMensamReservationIsInThePast -> String
(Int -> SqlErrorMensamReservationIsInThePast -> ShowS)
-> (SqlErrorMensamReservationIsInThePast -> String)
-> ([SqlErrorMensamReservationIsInThePast] -> ShowS)
-> Show SqlErrorMensamReservationIsInThePast
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SqlErrorMensamReservationIsInThePast -> ShowS
showsPrec :: Int -> SqlErrorMensamReservationIsInThePast -> ShowS
$cshow :: SqlErrorMensamReservationIsInThePast -> String
show :: SqlErrorMensamReservationIsInThePast -> String
$cshowList :: [SqlErrorMensamReservationIsInThePast] -> ShowS
showList :: [SqlErrorMensamReservationIsInThePast] -> ShowS
Show)
  deriving anyclass (Show SqlErrorMensamReservationIsInThePast
Typeable SqlErrorMensamReservationIsInThePast
(Typeable SqlErrorMensamReservationIsInThePast,
 Show SqlErrorMensamReservationIsInThePast) =>
(SqlErrorMensamReservationIsInThePast -> SomeException)
-> (SomeException -> Maybe SqlErrorMensamReservationIsInThePast)
-> (SqlErrorMensamReservationIsInThePast -> String)
-> Exception SqlErrorMensamReservationIsInThePast
SomeException -> Maybe SqlErrorMensamReservationIsInThePast
SqlErrorMensamReservationIsInThePast -> String
SqlErrorMensamReservationIsInThePast -> SomeException
forall e.
(Typeable e, Show e) =>
(e -> SomeException)
-> (SomeException -> Maybe e) -> (e -> String) -> Exception e
$ctoException :: SqlErrorMensamReservationIsInThePast -> SomeException
toException :: SqlErrorMensamReservationIsInThePast -> SomeException
$cfromException :: SomeException -> Maybe SqlErrorMensamReservationIsInThePast
fromException :: SomeException -> Maybe SqlErrorMensamReservationIsInThePast
$cdisplayException :: SqlErrorMensamReservationIsInThePast -> String
displayException :: SqlErrorMensamReservationIsInThePast -> String
Exception)