Skip to content

Commit 05b9e5f

Browse files
authored
Merge pull request #2218 from digitallyinduced/add-request-implicit-parameter
Add (?request :: Request) implicit parameter alongside ?context
2 parents 39868ca + 8c83a7d commit 05b9e5f

File tree

34 files changed

+231
-152
lines changed

34 files changed

+231
-152
lines changed

ihp-ide/IHP/IDE/Prelude.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,11 @@ import qualified IHP.Modal.ControllerFunctions as Modal
3131
import IHP.ViewSupport (View)
3232
import qualified IHP.ViewSupport as ViewSupport
3333
import IHP.ValidationSupport
34+
import qualified Network.Wai
3435

3536
-- | Renders a view and stores it as modal HTML in the context for later rendering.
3637
--
3738
-- > setModal MyModalView { .. }
3839
--
39-
setModal :: (?context :: ControllerContext, View view) => view -> IO ()
40-
setModal view = Modal.setModal (let ?view = view in ViewSupport.html view)
40+
setModal :: (?context :: ControllerContext, ?request :: Network.Wai.Request, View view) => view -> IO ()
41+
setModal view = let ?view = view in Modal.setModal (ViewSupport.html view)

ihp-ide/IHP/IDE/SchemaDesigner/Controller/Helper.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import qualified IHP.IDE.SchemaDesigner.Compiler as SchemaCompiler
88
import IHP.IDE.SchemaDesigner.View.Schema.Error
99
import IHP.IDE.ToolServer.Helper.Controller
1010
import IHP.RequestBodyMiddleware (Respond)
11+
import qualified Network.Wai
1112

1213
instance ParamReader PostgresType where
1314
readParameter byteString = case Megaparsec.runParser Parser.sqlType "" (cs byteString) of
@@ -29,6 +30,7 @@ readSchema ::
2930
, ?modelContext::ModelContext
3031
, ?theAction::controller
3132
, ?respond::Respond
33+
, ?request :: Network.Wai.Request
3234
) => IO [Statement]
3335
readSchema = Parser.parseSchemaSql >>= \case
3436
Left error -> do render ErrorView { error }; pure []
@@ -44,6 +46,7 @@ updateSchema ::
4446
, ?modelContext::ModelContext
4547
, ?theAction::controller
4648
, ?respond::Respond
49+
, ?request :: Network.Wai.Request
4750
) => ([Statement] -> [Statement]) -> IO ()
4851
updateSchema updateFn = do
4952
statements <- readSchema

ihp-job-dashboard/IHP/Job/Dashboard.hs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import IHP.Pagination.Types
4141
import qualified Database.PostgreSQL.Simple.Types as PG
4242
import qualified Database.PostgreSQL.Simple.FromField as PG
4343
import qualified Database.PostgreSQL.Simple.ToField as PG
44+
import qualified Network.Wai as Wai
4445
import Network.Wai (requestMethod)
4546
import Network.HTTP.Types.Method (methodPost)
4647

@@ -112,32 +113,32 @@ class ( job ~ GetModelByTableName (GetTableName job)
112113
-- so you'll get a compile error if you try and include a type that is not a job.
113114
class JobsDashboard (jobs :: [Type]) where
114115
-- | Creates the entire dashboard by recursing on the type list and calling 'makeDashboardSection' on each type.
115-
makeDashboard :: (?context :: ControllerContext, ?modelContext :: ModelContext) => IO SomeView
116+
makeDashboard :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?request :: Wai.Request) => IO SomeView
116117

117118
includedJobTables :: [Text]
118119

119120
-- | Renders the index page, which is the view returned from 'makeDashboard'.
120-
indexPage :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => IO ()
121+
indexPage :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => IO ()
121122

122-
listJob :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => Text -> IO ()
123-
listJob' :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => Bool -> IO ()
123+
listJob :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => Text -> IO ()
124+
listJob' :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => Bool -> IO ()
124125

125126
-- | Renders the detail view page. Rescurses on the type list to find a type with the
126127
-- same table name as the "tableName" query parameter.
127-
viewJob :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => Text -> UUID -> IO ()
128-
viewJob' :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => Bool -> IO ()
128+
viewJob :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => Text -> UUID -> IO ()
129+
viewJob' :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => Bool -> IO ()
129130

130131
-- | If performed in a POST request, creates a new job depending on the "tableName" query parameter.
131132
-- If performed in a GET request, renders the new job from depending on said parameter.
132-
newJob :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => Text -> IO ()
133-
newJob' :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => Bool -> IO ()
133+
newJob :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => Text -> IO ()
134+
newJob' :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => Bool -> IO ()
134135

135136
-- | Deletes a job from the database.
136-
deleteJob :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => Text -> UUID -> IO ()
137-
deleteJob' :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => Bool -> IO ()
137+
deleteJob :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => Text -> UUID -> IO ()
138+
deleteJob' :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => Bool -> IO ()
138139

139-
retryJob :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => Text -> UUID -> IO ()
140-
retryJob' :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond) => IO ()
140+
retryJob :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => Text -> UUID -> IO ()
141+
retryJob' :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?respond :: Respond, ?request :: Wai.Request) => IO ()
141142

142143
-- If no types are passed, try to get all tables dynamically and render them as BaseJobs
143144
instance JobsDashboard '[] where
@@ -347,7 +348,7 @@ extractText = \(Only t) -> t
347348
getNotIncludedTableNames includedNames = map extractText <$> sqlQuery
348349
"SELECT table_name FROM information_schema.tables WHERE table_name LIKE '%_jobs' AND table_name NOT IN ?"
349350
(Only $ In $ includedNames)
350-
buildBaseJobTable :: (?modelContext :: ModelContext, ?context :: ControllerContext) => Text -> IO SomeView
351+
buildBaseJobTable :: (?modelContext :: ModelContext, ?context :: ControllerContext, ?request :: Wai.Request) => Text -> IO SomeView
351352
buildBaseJobTable tableName = do
352353
baseJobs <- sqlQuery (PG.Query $ cs $ queryString) (Only tableName)
353354
baseJobs

ihp-job-dashboard/IHP/Job/Dashboard/Auth.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module IHP.Job.Dashboard.Auth (
1414
import IHP.Prelude
1515
import IHP.ControllerPrelude
1616
import qualified IHP.EnvVar as EnvVar
17+
import qualified Network.Wai as Wai
1718

1819
-- | Defines one method, 'authenticate', called before every action. Use to authenticate user.
1920
--
@@ -24,7 +25,7 @@ import qualified IHP.EnvVar as EnvVar
2425
--
2526
-- Define your own implementation to use custom authentication for production.
2627
class AuthenticationMethod a where
27-
authenticate :: (?context :: ControllerContext, ?modelContext :: ModelContext) => IO ()
28+
authenticate :: (?context :: ControllerContext, ?modelContext :: ModelContext, ?request :: Wai.Request) => IO ()
2829

2930
-- | Don't use any authentication for jobs.
3031
data NoAuth

ihp-ssc/IHP/ServerSideComponent/ControllerFunctions.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import IHP.ControllerPrelude
1010
import IHP.ServerSideComponent.Types as SSC
1111

1212
import qualified Network.WebSockets as WebSocket
13+
import qualified Network.Wai as Wai
1314
import qualified Text.Blaze.Html.Renderer.Text as Blaze
1415

1516
import qualified Data.Aeson as Aeson
@@ -23,7 +24,7 @@ $(Aeson.deriveJSON Aeson.defaultOptions { sumEncoding = defaultTaggedObject { ta
2324
$(Aeson.deriveJSON Aeson.defaultOptions { sumEncoding = defaultTaggedObject { tagFieldName = "type" }} ''Node)
2425
$(Aeson.deriveJSON Aeson.defaultOptions { sumEncoding = defaultTaggedObject { tagFieldName = "type" }} ''NodeOperation)
2526

26-
setState :: (?instanceRef :: IORef (ComponentInstance state), ?connection :: WebSocket.Connection, Component state action, ?context :: ControllerContext) => state -> IO ()
27+
setState :: (?instanceRef :: IORef (ComponentInstance state), ?connection :: WebSocket.Connection, Component state action, ?context :: ControllerContext, ?request :: Wai.Request) => state -> IO ()
2728
setState state = do
2829
oldState <- (.state) <$> readIORef ?instanceRef
2930
let oldHtml = oldState

ihp/IHP/AuthSupport/Controller/Sessions.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@ import Data.Data
2020
import qualified IHP.AuthSupport.Lockable as Lockable
2121
import System.IO.Unsafe (unsafePerformIO)
2222
import IHP.RequestBodyMiddleware (Respond)
23+
import qualified Network.Wai
2324

2425
-- | Displays the login form.
2526
--
2627
-- In case the user is already logged in, redirects to the home page ('afterLoginRedirectPath').
2728
newSessionAction :: forall record action.
2829
( ?theAction :: action
2930
, ?context :: ControllerContext
31+
, ?request :: Network.Wai.Request
3032
, ?respond :: Respond
3133
, HasNewSessionUrl record
3234
, ?modelContext :: ModelContext
@@ -53,6 +55,7 @@ newSessionAction = do
5355
createSessionAction :: forall record action.
5456
(?theAction :: action
5557
, ?context :: ControllerContext
58+
, ?request :: Network.Wai.Request
5659
, ?respond :: Respond
5760
, ?modelContext :: ModelContext
5861
, Data action
@@ -107,6 +110,7 @@ createSessionAction = do
107110
deleteSessionAction :: forall record action id.
108111
( ?theAction :: action
109112
, ?context :: ControllerContext
113+
, ?request :: Network.Wai.Request
110114
, ?respond :: Respond
111115
, ?modelContext :: ModelContext
112116
, Data action

ihp/IHP/AutoRefresh.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ autoRefresh :: (
3939
, Controller action
4040
, ?modelContext :: ModelContext
4141
, ?context :: ControllerContext
42+
, ?request :: Request
4243
) => ((?modelContext :: ModelContext) => IO ()) -> IO ()
4344
autoRefresh runAction = do
4445
autoRefreshState <- fromContext @AutoRefreshState
@@ -135,7 +136,7 @@ instance WSApp AutoRefreshWSApp where
135136

136137
async $ forever do
137138
MVar.takeMVar event
138-
let currentRequest = ?context.request
139+
let currentRequest = ?request
139140
-- Create a dummy respond function that does nothing, since actual response
140141
-- is handled by the handleResponseException handler
141142
let dummyRespond _ = error "AutoRefresh: respond should not be called directly"
@@ -188,7 +189,7 @@ registerNotificationTrigger touchedTablesVar autoRefreshServer = do
188189
pure ()
189190

190191
-- | Returns the ids of all sessions available to the client based on what sessions are found in the session cookie
191-
getAvailableSessions :: (?context :: ControllerContext) => IORef AutoRefreshServer -> IO [UUID]
192+
getAvailableSessions :: (?request :: Request) => IORef AutoRefreshServer -> IO [UUID]
192193
getAvailableSessions autoRefreshServer = do
193194
allSessions <- (.sessions) <$> readIORef autoRefreshServer
194195
text <- fromMaybe "" <$> getSession "autoRefreshSessions"

ihp/IHP/Controller/AccessDenied.hs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import qualified Text.Blaze.Html.Renderer.Utf8 as Blaze
1616
import qualified Data.ByteString.Lazy as LBS
1717
import IHP.HSX.QQ (hsx)
1818
import qualified System.Directory as Directory
19-
import IHP.Controller.Context
2019
import IHP.Controller.Response (respondAndExit)
2120

2221

@@ -31,7 +30,7 @@ import IHP.Controller.Response (respondAndExit)
3130
-- > renderHtml EditView { .. }
3231
--
3332
-- This will throw an error and prevent the view from being rendered when the current user is not the author of the post.
34-
accessDeniedWhen :: (?context :: ControllerContext) => Bool -> IO ()
33+
accessDeniedWhen :: Bool -> IO ()
3534
accessDeniedWhen condition = when condition renderAccessDenied
3635

3736
-- | Stops the action execution with an access denied message (403) when the access condition is False.
@@ -45,7 +44,7 @@ accessDeniedWhen condition = when condition renderAccessDenied
4544
-- > renderHtml EditView { .. }
4645
--
4746
-- This will throw an error and prevent the view from being rendered when the current user is not the author of the post.
48-
accessDeniedUnless :: (?context :: ControllerContext) => Bool -> IO ()
47+
accessDeniedUnless :: Bool -> IO ()
4948
accessDeniedUnless condition = unless condition renderAccessDenied
5049

5150
-- | Renders a 403 access denied response. If a static/403.html exists, that is rendered instead of the IHP access denied page.
@@ -153,7 +152,7 @@ customAccessDeniedResponse = do
153152
--
154153
-- You can override the default access denied page by creating a new file at @static/403.html@. Then IHP will render that HTML file instead of displaying the default IHP access denied page.
155154
--
156-
renderAccessDenied :: (?context :: ControllerContext) => IO ()
155+
renderAccessDenied :: IO ()
157156
renderAccessDenied = do
158157
response <- buildAccessDeniedResponse
159158
respondAndExit response

ihp/IHP/Controller/BasicAuth.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ module IHP.Controller.BasicAuth (basicAuth) where
88
import IHP.Prelude
99
import IHP.ControllerSupport
1010
import Network.HTTP.Types (status401)
11-
import Network.Wai (responseLBS)
11+
import Network.Wai (responseLBS, Request)
1212
import Network.Wai.Middleware.HttpAuth (extractBasicAuth)
1313
import Network.HTTP.Types.Header (hWWWAuthenticate)
1414

@@ -19,7 +19,7 @@ import Network.HTTP.Types.Header (hWWWAuthenticate)
1919
--
2020
-- > beforeAction = basicAuth ...
2121
--
22-
basicAuth :: (?context :: ControllerContext) => Text -> Text -> Text -> IO ()
22+
basicAuth :: (?request :: Request) => Text -> Text -> Text -> IO ()
2323
basicAuth uid pw realm = do
2424
let mein = Just (cs uid, cs pw)
2525
let cred = join $ fmap extractBasicAuth (getHeader "Authorization")

ihp/IHP/Controller/Cookie.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import IHP.ControllerSupport
1010
import Web.Cookie
1111
import qualified Data.Binary.Builder as Binary
1212
import qualified Data.ByteString.Lazy as LBS
13+
import qualified Network.Wai
1314

1415
-- | Sets a @Set-Cookie@ header
1516
--
@@ -34,11 +35,11 @@ setCookie cookie = setHeader ("Set-Cookie", cookieString)
3435
-- > getCookie "fbc"
3536
-- Just "1234"
3637
--
37-
getCookie :: (?context :: ControllerContext) => Text -> Maybe Text
38+
getCookie :: (?request :: Network.Wai.Request) => Text -> Maybe Text
3839
getCookie name =
3940
lookup name allCookies
4041

4142
-- | Returns all cookies sent with the current request
42-
allCookies :: (?context :: ControllerContext) => [(Text, Text)]
43+
allCookies :: (?request :: Network.Wai.Request) => [(Text, Text)]
4344
allCookies =
4445
maybe [] parseCookiesText $ lookup "Cookie" request.requestHeaders

0 commit comments

Comments
 (0)