Add Security field; update docs

This commit is contained in:
Rashad Gover 2023-04-24 03:50:45 +00:00
parent ef00e7aa67
commit 2b8c8e0eb4
4 changed files with 23 additions and 14 deletions

View File

@ -172,7 +172,7 @@ Request. These operations are covered in more detail below.
Its type is `StdMethod` from the `http-types` library. Its type is `StdMethod` from the `http-types` library.
Only the standard methods mentioned in RFC-1234 are allowed. [HTTP standard method (as defined by RFC 2616, and PATCH which is defined by RFC 5789).](https://hackage.haskell.org/package/http-types-0.12.3/docs/Network-HTTP-Types-Method.html#t:StdMethod)
2. #### Path Script 2. #### Path Script

View File

@ -187,7 +187,10 @@ detail below.</p>
Endpoint accepts.</p> Endpoint accepts.</p>
<p>Its type is <code>StdMethod</code> from the <code>http-types</code> <p>Its type is <code>StdMethod</code> from the <code>http-types</code>
library.</p> library.</p>
<p>Only the standard methods mentioned in RFC-1234 are allowed.</p></li> <p><a
href="https://hackage.haskell.org/package/http-types-0.12.3/docs/Network-HTTP-Types-Method.html#t:StdMethod">HTTP
standard method (as defined by RFC 2616, and PATCH which is defined by
RFC 5789).</a></p></li>
<li><h4>Path Script</h4> <li><h4>Path Script</h4>
<p>The <code>path</code> field defines the Request Path that the <p>The <code>path</code> field defines the Request Path that the
Endpoint accepts, including Path parameters.</p> Endpoint accepts, including Path parameters.</p>

View File

@ -38,6 +38,7 @@ library
Okapi.Script.Body Okapi.Script.Body
Okapi.Script.Responder Okapi.Script.Responder
Okapi.Script.AddHeader Okapi.Script.AddHeader
Okapi.Script.Security
other-modules: other-modules:
Paths_okapi Paths_okapi
hs-source-dirs: hs-source-dirs:

View File

@ -47,9 +47,11 @@ import Okapi.Script.Headers qualified as Headers
import Okapi.Script.Path qualified as Path import Okapi.Script.Path qualified as Path
import Okapi.Script.Query qualified as Query import Okapi.Script.Query qualified as Query
import Okapi.Script.Responder qualified as Responder import Okapi.Script.Responder qualified as Responder
import Okapi.Script.Security qualified as Security
data Endpoint p q h b r = Endpoint data Endpoint s p q h b r = Endpoint
{ method :: HTTP.StdMethod, { security :: Security.Security s,
method :: HTTP.StdMethod,
path :: Path.Script p, path :: Path.Script p,
query :: Query.Script q, query :: Query.Script q,
headers :: Headers.Script h, headers :: Headers.Script h,
@ -57,7 +59,7 @@ data Endpoint p q h b r = Endpoint
responder :: Responder.Script r responder :: Responder.Script r
} }
toPathItem :: Endpoint p q h b r -> (FilePath, OAPI.PathItem) toPathItem :: Endpoint s p q h b r -> (FilePath, OAPI.PathItem)
toPathItem endpoint = (pathName, pathItem) toPathItem endpoint = (pathName, pathItem)
where where
pathName :: FilePath pathName :: FilePath
@ -188,10 +190,10 @@ toPathItem endpoint = (pathName, pathItem)
Path.Static t -> "/" <> Text.unpack t Path.Static t -> "/" <> Text.unpack t
Path.Param @p name -> "/{" <> Text.unpack name <> "}" Path.Param @p name -> "/{" <> Text.unpack name <> "}"
data Plan m p q h b r = Plan data Plan m s p q h b r = Plan
{ transformer :: m ~> IO, { transformer :: m ~> IO,
endpoint :: Endpoint p q h b r, endpoint :: Endpoint s p q h b r,
handler :: Monad m => p -> q -> b -> h -> r -> m Response handler :: Monad m => s -> p -> q -> b -> h -> r -> m Response
} }
data Executable = Run (IO WAI.Response) | Null data Executable = Run (IO WAI.Response) | Null
@ -204,9 +206,9 @@ data Artifact = Artifact
} }
build :: build ::
forall m p q h b r. forall m s p q h b r.
Monad m => Monad m =>
Plan m p q h b r -> Plan m s p q h b r ->
Artifact Artifact
build plan = Artifact {..} build plan = Artifact {..}
where where
@ -214,14 +216,17 @@ build plan = Artifact {..}
compiler (method, path, query, body, headers) = compiler (method, path, query, body, headers) =
if method == plan.endpoint.method if method == plan.endpoint.method
then then
let pathResult = fst $ Path.eval plan.endpoint.path path let securityResult = case plan.endpoint.security of
Security.NotSecure -> Ok ()
Security.Secure script -> fst $ Security.eval script $ Security.State query headers []
pathResult = fst $ Path.eval plan.endpoint.path path
queryResult = fst $ Query.eval plan.endpoint.query query queryResult = fst $ Query.eval plan.endpoint.query query
bodyResult = fst $ Body.eval plan.endpoint.body body bodyResult = fst $ Body.eval plan.endpoint.body body
headersResult = fst $ Headers.eval plan.endpoint.headers headers headersResult = fst $ Headers.eval plan.endpoint.headers headers
responderResult = fst $ Responder.eval plan.endpoint.responder () responderResult = fst $ Responder.eval plan.endpoint.responder ()
in case (pathResult, queryResult, bodyResult, headersResult, responderResult) of in case (securityResult, pathResult, queryResult, bodyResult, headersResult, responderResult) of
(Ok p, Ok q, Ok b, Ok h, Ok r) -> Run do (Ok s, Ok p, Ok q, Ok b, Ok h, Ok r) -> Run do
response <- transformer plan $ handler plan p q b h r response <- transformer plan $ handler plan s p q b h r
return $ toWaiResponse response return $ toWaiResponse response
_ -> Null _ -> Null
else Null else Null