module HalbumView where import CGIUtils import Config import ImageInfo import ImageStore import MetaDataStore import HtmlView import Network.NewCGI hiding (Html) import Text.XHtml data Action = AllTags | AllImages ImageOrder Range | TagImages Tag ImageOrder Range | ViewImage ImageID | CompleteTag String (Maybe Int) deriving (Show,Eq) getAction :: CGI Action getAction = do ma <- getInput "action" case ma of Nothing -> return AllTags Just a -> case a of "alltags" -> return AllTags "allimages" -> do order <- getOrder range <- getRange return $ AllImages order range "tagimages" -> do tag <- getInputOrFail "tag" order <- getOrder range <- getRange return $ TagImages tag order range "viewimage" -> do imgid <- getInputOrFail "image" >>= readImageID return $ ViewImage imgid "completetag" -> do prefix <- getInputOrFail "prefix" limit <- readInput "limit" return $ CompleteTag prefix limit c -> fail $ "Unknown command: " ++ c getOrder :: CGI ImageOrder getOrder = do mo <- getInput "order" case mo of Just "datedesc" -> return OrderByDateDesc Just "storeasc" -> return OrderByStoreDateAsc Just "storedesc" -> return OrderByStoreDateDesc _ -> return OrderByDateAsc getRange :: CGI Range getRange = do start <- readInputWithDefault 0 "start" count <- readInputWithDefault 0 "count" return Range { rStart = start, rCount = count } viewAction :: Config -> Action -> CGI CGIResult viewAction conf action = case action of AllTags -> do tags <- liftIO $ getAllTags (metaDataStore conf) let view = viewAllTags (viewConfig conf) tags outputHtml view AllImages o r -> do imgs <- liftIO $ getAllImages (metaDataStore conf) o r let view = viewIndex (viewConfig conf) imgs outputHtml view TagImages t o r -> do imgs <- liftIO $ getImagesByTag (metaDataStore conf) o r t let view = viewTagIndex (viewConfig conf) t imgs outputHtml view ViewImage i -> do img <- liftIO $ getImageByID (metaDataStore conf) i let view = viewImage (viewConfig conf) img outputHtml view CompleteTag p l -> do tags <- liftIO $ getTagsWithPrefix (metaDataStore conf) p l setHeader "Content/type" "text/plain" output $ unlines (map tagName tags)