gonito/Handler/AchievementUtils.hs

57 lines
2.1 KiB
Haskell
Raw Normal View History

2017-05-15 13:55:56 +02:00
module Handler.AchievementUtils where
import Import
import Handler.TagUtils
import qualified Yesod.Table as Table
data AchievementInfo = AchievementInfo {
achievementInfoId :: AchievementId,
achievementInfoName :: Text,
2017-10-03 07:23:52 +02:00
achievementInfoCourse :: Entity Course,
2017-05-15 13:55:56 +02:00
achievementInfoChallenge :: Entity Challenge,
achievementInfoDescription :: Maybe Text,
achievementInfoPoints :: Int,
achievementInfoDeadline :: UTCTime,
achievementInfoMaxWinners :: Maybe Int,
achievementInfoWorkingOn :: [Entity User],
achievementInfoCurrentUser :: Maybe (Entity User),
achievementInfoTags :: [Entity Tag] }
achievementDescriptionCell fun = Table.widget "description" ((
\ainfo -> fragmentWithTags (fromMaybe (""::Text) $ achievementInfoDescription ainfo) (achievementInfoTags ainfo)) . fun)
getAchievementInfo mUser (Entity achievementId achievement) = do
es <- selectList [WorkingOnAchievement ==. achievementId] []
let userIds = Import.map (workingOnUser . entityVal) es
users <- mapM get404 userIds
tags <- getAchievementTags achievementId
let challengeId = achievementChallenge achievement
challenge <- get404 challengeId
2017-10-03 07:23:52 +02:00
let courseId = achievementCourse achievement
course <- get404 courseId
2017-05-15 13:55:56 +02:00
return $ AchievementInfo {
achievementInfoId = achievementId,
achievementInfoName = achievementName achievement,
2017-10-03 07:23:52 +02:00
achievementInfoCourse = Entity courseId course,
2017-05-15 13:55:56 +02:00
achievementInfoChallenge = Entity challengeId challenge,
achievementInfoDescription = achievementDescription achievement,
achievementInfoPoints = achievementPoints achievement,
achievementInfoDeadline = achievementDeadline achievement,
achievementInfoMaxWinners = achievementMaxWinners achievement,
achievementInfoWorkingOn = Import.map (\(i,v) -> Entity i v) $ Import.zip userIds users,
achievementInfoCurrentUser = mUser,
achievementInfoTags = tags }
getAchievementTags achievementId = do
sts <- selectList [AchievementTagAchievement ==. achievementId] []
let tagIds = Import.map (achievementTagTag . entityVal) sts
tags <- mapM get404 $ tagIds
return $ Import.map (\(k, v) -> Entity k v) $ Import.zip tagIds tags