refactor: move PUT checks to ApiRequest
This commit is contained in:
committed by
Steve Chavez
parent
e90391b7ac
commit
50b275d3e2
@@ -370,9 +370,6 @@ handleUpdate identifier context@(RequestContext _ _ ApiRequest{..} _) = do
|
|||||||
|
|
||||||
handleSingleUpsert :: QualifiedIdentifier -> RequestContext-> DbHandler Wai.Response
|
handleSingleUpsert :: QualifiedIdentifier -> RequestContext-> DbHandler Wai.Response
|
||||||
handleSingleUpsert identifier context@(RequestContext _ ctxDbStructure ApiRequest{..} _) = do
|
handleSingleUpsert identifier context@(RequestContext _ ctxDbStructure ApiRequest{..} _) = do
|
||||||
when (iTopLevelRange /= RangeQuery.allRange) $
|
|
||||||
throwError Error.PutRangeNotAllowedError
|
|
||||||
|
|
||||||
let pkCols = maybe mempty tablePKCols $ M.lookup identifier $ dbTables ctxDbStructure
|
let pkCols = maybe mempty tablePKCols $ M.lookup identifier $ dbTables ctxDbStructure
|
||||||
|
|
||||||
WriteQueryResult{..} <- writeQuery MutationSingleUpsert identifier False pkCols context
|
WriteQueryResult{..} <- writeQuery MutationSingleUpsert identifier False pkCols context
|
||||||
|
|||||||
+20
-21
@@ -54,20 +54,21 @@ class (JSON.ToJSON a) => PgrstError a where
|
|||||||
errorResponseFor err = responseLBS (status err) (headers err) $ errorPayload err
|
errorResponseFor err = responseLBS (status err) (headers err) $ errorPayload err
|
||||||
|
|
||||||
instance PgrstError ApiRequestError where
|
instance PgrstError ApiRequestError where
|
||||||
status ActionInappropriate = HTTP.status405
|
status ActionInappropriate = HTTP.status405
|
||||||
status AmbiguousRelBetween{} = HTTP.status300
|
status AmbiguousRelBetween{} = HTTP.status300
|
||||||
status AmbiguousRpc{} = HTTP.status300
|
status AmbiguousRpc{} = HTTP.status300
|
||||||
status ContentTypeError{} = HTTP.status415
|
status ContentTypeError{} = HTTP.status415
|
||||||
status InvalidBody{} = HTTP.status400
|
status InvalidBody{} = HTTP.status400
|
||||||
status InvalidFilters = HTTP.status405
|
status InvalidFilters = HTTP.status405
|
||||||
status InvalidRange = HTTP.status416
|
status InvalidRange = HTTP.status416
|
||||||
status NoRelBetween{} = HTTP.status400
|
status NoRelBetween{} = HTTP.status400
|
||||||
status NoRpc{} = HTTP.status404
|
status NoRpc{} = HTTP.status404
|
||||||
status NotEmbedded{} = HTTP.status400
|
status NotEmbedded{} = HTTP.status400
|
||||||
status ParseRequestError{} = HTTP.status400
|
status ParseRequestError{} = HTTP.status400
|
||||||
status QueryParamError{} = HTTP.status400
|
status PutRangeNotAllowedError = HTTP.status400
|
||||||
status UnacceptableSchema{} = HTTP.status406
|
status QueryParamError{} = HTTP.status400
|
||||||
status LimitNoOrderError = HTTP.status400
|
status UnacceptableSchema{} = HTTP.status406
|
||||||
|
status LimitNoOrderError = HTTP.status400
|
||||||
|
|
||||||
headers _ = [ContentType.toHeader CTApplicationJSON]
|
headers _ = [ContentType.toHeader CTApplicationJSON]
|
||||||
|
|
||||||
@@ -97,6 +98,11 @@ instance JSON.ToJSON ApiRequestError where
|
|||||||
"message" .= message,
|
"message" .= message,
|
||||||
"details" .= details,
|
"details" .= details,
|
||||||
"hint" .= JSON.Null]
|
"hint" .= JSON.Null]
|
||||||
|
toJSON PutRangeNotAllowedError = JSON.object [
|
||||||
|
"code" .= GeneralErrorCode03,
|
||||||
|
"message" .= ("Range header and limit/offset querystring parameters are not allowed for PUT" :: Text),
|
||||||
|
"details" .= JSON.Null,
|
||||||
|
"hint" .= JSON.Null]
|
||||||
toJSON InvalidFilters = JSON.object [
|
toJSON InvalidFilters = JSON.object [
|
||||||
"code" .= ApiRequestErrorCode05,
|
"code" .= ApiRequestErrorCode05,
|
||||||
"message" .= ("Filters must include all and only primary key columns with 'eq' operators" :: Text),
|
"message" .= ("Filters must include all and only primary key columns with 'eq' operators" :: Text),
|
||||||
@@ -326,7 +332,6 @@ data Error
|
|||||||
| OffLimitsChangesError Int64 Integer
|
| OffLimitsChangesError Int64 Integer
|
||||||
| PgErr PgError
|
| PgErr PgError
|
||||||
| PutMatchingPkError
|
| PutMatchingPkError
|
||||||
| PutRangeNotAllowedError
|
|
||||||
| SingularityError Integer
|
| SingularityError Integer
|
||||||
| UnsupportedVerb Text
|
| UnsupportedVerb Text
|
||||||
|
|
||||||
@@ -343,7 +348,6 @@ instance PgrstError Error where
|
|||||||
status OffLimitsChangesError{} = HTTP.status400
|
status OffLimitsChangesError{} = HTTP.status400
|
||||||
status (PgErr err) = status err
|
status (PgErr err) = status err
|
||||||
status PutMatchingPkError = HTTP.status400
|
status PutMatchingPkError = HTTP.status400
|
||||||
status PutRangeNotAllowedError = HTTP.status400
|
|
||||||
status SingularityError{} = HTTP.status406
|
status SingularityError{} = HTTP.status406
|
||||||
status UnsupportedVerb{} = HTTP.status405
|
status UnsupportedVerb{} = HTTP.status405
|
||||||
|
|
||||||
@@ -393,11 +397,6 @@ instance JSON.ToJSON Error where
|
|||||||
"details" .= JSON.Null,
|
"details" .= JSON.Null,
|
||||||
"hint" .= JSON.Null]
|
"hint" .= JSON.Null]
|
||||||
|
|
||||||
toJSON PutRangeNotAllowedError = JSON.object [
|
|
||||||
"code" .= GeneralErrorCode03,
|
|
||||||
"message" .= ("Range header and limit/offset querystring parameters are not allowed for PUT" :: Text),
|
|
||||||
"details" .= JSON.Null,
|
|
||||||
"hint" .= JSON.Null]
|
|
||||||
toJSON PutMatchingPkError = JSON.object [
|
toJSON PutMatchingPkError = JSON.object [
|
||||||
"code" .= GeneralErrorCode04,
|
"code" .= GeneralErrorCode04,
|
||||||
"message" .= ("Payload values do not match URL in primary key column(s)" :: Text),
|
"message" .= ("Payload values do not match URL in primary key column(s)" :: Text),
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ apiRequest conf@AppConfig{..} dbStructure req reqBody queryparams@QueryParams{..
|
|||||||
| shouldParsePayload && isLeft payload = either (Left . InvalidBody) witness payload
|
| shouldParsePayload && isLeft payload = either (Left . InvalidBody) witness payload
|
||||||
| not expectParams && not (L.null qsParams) = Left $ ParseRequestError "Unexpected param or filter missing operator" ("Failed to parse " <> show qsParams)
|
| not expectParams && not (L.null qsParams) = Left $ ParseRequestError "Unexpected param or filter missing operator" ("Failed to parse " <> show qsParams)
|
||||||
| method `elem` ["PATCH", "DELETE"] && not (null qsRanges) && null qsOrder = Left LimitNoOrderError
|
| method `elem` ["PATCH", "DELETE"] && not (null qsRanges) && null qsOrder = Left LimitNoOrderError
|
||||||
|
| method == "PUT" && topLevelRange /= allRange = Left PutRangeNotAllowedError
|
||||||
| otherwise = do
|
| otherwise = do
|
||||||
acceptContentType <- findAcceptContentType conf action path accepts
|
acceptContentType <- findAcceptContentType conf action path accepts
|
||||||
checkedTarget <- target
|
checkedTarget <- target
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ data ApiRequestError
|
|||||||
| NoRpc Text Text [Text] Bool ContentType Bool
|
| NoRpc Text Text [Text] Bool ContentType Bool
|
||||||
| NotEmbedded Text
|
| NotEmbedded Text
|
||||||
| ParseRequestError Text Text
|
| ParseRequestError Text Text
|
||||||
|
| PutRangeNotAllowedError
|
||||||
| QueryParamError QPError
|
| QueryParamError QPError
|
||||||
| UnacceptableSchema [Text]
|
| UnacceptableSchema [Text]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user