diff --git a/src/Handler/Utils/Sheet.hs b/src/Handler/Utils/Sheet.hs new file mode 100644 index 000000000..61c5736dc --- /dev/null +++ b/src/Handler/Utils/Sheet.hs @@ -0,0 +1,49 @@ +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE QuasiQuotes #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} + +module Handler.Utils.Sheet where + +import Import + +import qualified Database.Esqueleto as E +import qualified Database.Esqueleto.Internal.Sql as E + + + + +fetchSheetAux :: ( BaseBackend backend ~ SqlBackend + , E.SqlSelect b a + , Typeable a, MonadHandler m, IsPersistBackend backend + , PersistQueryRead backend, PersistUniqueRead backend + ) + => (E.SqlExpr (Entity Sheet) -> b) + -> TermId -> Text -> Text -> ReaderT backend m a +fetchSheetAux prj tid csh shn = + let cachId = encodeUtf8 $ tshow (tid,csh,shn) + in cachedBy cachId $ do + -- Mit Yesod: + -- cid <- getKeyBy404 $ CourseTermShort tid csh + -- getBy404 $ CourseSheet cid shn + -- Mit Esqueleto: + sheetList <- E.select . E.from $ \(course `E.InnerJoin` sheet) -> do + E.on $ course E.^. CourseId E.==. sheet E.^. SheetCourseId + E.where_ $ course E.^. CourseTermId E.==. E.val tid + E.&&. course E.^. CourseShorthand E.==. E.val csh + E.&&. sheet E.^. SheetName E.==. E.val shn + return $ prj sheet + case sheetList of + [sheet] -> return sheet + _other -> notFound + +fetchSheet :: TermId -> Text -> Text -> YesodDB UniWorX (Entity Sheet) +fetchSheet = fetchSheetAux id + +fetchSheetId :: TermId -> Text -> Text -> YesodDB UniWorX (Key Sheet) +fetchSheetId tid cid shn = E.unValue <$> fetchSheetAux (E.^. SheetId) tid cid shn