summaryrefslogtreecommitdiff
path: root/Assistant/Threads/WebApp.hs
blob: 06909fd5315eb8ea01b24ed36362cc4e70d2f8aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
{- git-annex assistant webapp
 -
 - Copyright 2012 Joey Hess <joey@kitenet.net>
 -
 - Licensed under the GNU GPL version 3 or higher.
 -}

{-# LANGUAGE TypeFamilies, QuasiQuotes, MultiParamTypeClasses, TemplateHaskell, OverloadedStrings #-}

module Assistant.Threads.WebApp where

import Assistant.Common
import Assistant.ThreadedMonad
import Assistant.DaemonStatus
import Utility.WebApp
import Utility.Yesod
import Utility.FileMode
import Utility.TempFile
import Git

import Yesod
import Yesod.Static
import Text.Hamlet
import Network.Socket (PortNumber)
import Text.Blaze.Renderer.String

data WebApp = WebApp
	{ daemonStatus :: DaemonStatusHandle
	, secretToken :: String
	, baseTitle :: String
	, getStatic :: Static
	}

staticFiles "static"

mkYesod "WebApp" [parseRoutes|
/static StaticR Static getStatic
/ HomeR GET
/config ConfigR GET
|]

instance Yesod WebApp where
	defaultLayout contents = do
		page <- widgetToPageContent contents
		mmsg <- getMessage
		webapp <- getYesod
		hamletToRepHtml $(hamletFile $ hamletTemplate "default-layout")

getHomeR :: Handler RepHtml
getHomeR = defaultLayout $ do
	[whamlet|Hello, World<p><a href=@{ConfigR}>config|]

getConfigR :: Handler RepHtml
getConfigR = defaultLayout $ do
	setTitle "configuration"
	[whamlet|<a href=@{HomeR}>main|]

webAppThread :: ThreadState -> DaemonStatusHandle -> IO ()
webAppThread st dstatus = do
	webapp <- mkWebApp st dstatus
	app <- toWaiApp webapp
	app' <- ifM debugEnabled
		( return $ httpDebugLogger app
		, return app
		)
	runWebApp app' $ \port -> runThreadState st $ writeHtmlShim webapp port

mkWebApp :: ThreadState -> DaemonStatusHandle -> IO WebApp
mkWebApp st dstatus = do
	dir <- absPath =<< runThreadState st (fromRepo repoPath)
	home <- myHomeDir
	let reldir = if dirContains home dir
		then relPathDirToFile home dir
		else dir
	token <- genRandomToken 
	return $ WebApp 
		{ daemonStatus = dstatus
		, secretToken = token
		, baseTitle = reldir
		, getStatic = $(embed "static")
		}

{- Creates a html shim file that's used to redirect into the webapp. -}
writeHtmlShim :: WebApp -> PortNumber -> Annex ()
writeHtmlShim webapp port = do
	htmlshim <- fromRepo gitAnnexHtmlShim
	liftIO $ viaTmp go htmlshim $ genHtmlShim webapp port
	where
		go file content = do
			h <- openFile file WriteMode
			modifyFileMode file $ removeModes [groupReadMode, otherReadMode]
			hPutStr h content
			hClose h

{- TODO: generate this static file using Yesod. -}
genHtmlShim :: WebApp -> PortNumber -> String
genHtmlShim webapp port = renderHtml $(shamletFile $ hamletTemplate "htmlshim")
	where
		url = "http://localhost:" ++ show port ++ "/?" ++ secretToken webapp