Skip to content

Commit d37b43a

Browse files
author
Auke Booij
committed
Only output deprecated enum values when requested
1 parent 779ccae commit d37b43a

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

server/src-lib/Hasura/GraphQL/Resolve/InputValue.hs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ module Hasura.GraphQL.Resolve.InputValue
1010
, asPGColumnValueM
1111
, asPGColumnValue
1212

13+
, asScalarValM
14+
, asScalarVal
1315
, asEnumVal
1416
, asEnumValM
1517
, withObject
@@ -26,6 +28,8 @@ module Hasura.GraphQL.Resolve.InputValue
2628

2729
import Hasura.Prelude
2830

31+
import qualified Text.Builder as TB
32+
2933
import qualified Language.GraphQL.Draft.Syntax as G
3034

3135
import qualified Hasura.RQL.Types as RQL
@@ -120,6 +124,19 @@ asPGColumnValue v = do
120124
openInputValue :: (MonadReusability m) => AnnInpVal -> m AnnGValue
121125
openInputValue v = when (isJust $ _aivVariable v) markNotReusable $> _aivValue v
122126

127+
asScalarValM :: (MonadReusability m, MonadError QErr m) => AnnInpVal -> PGScalarType -> m (Maybe PGScalarValue)
128+
asScalarValM v tp = openInputValue v >>= \case
129+
AGScalar tp' vM ->
130+
if tp == tp'
131+
then pure vM
132+
else tyMismatch "scalar" v
133+
_ -> tyMismatch "scalar" v
134+
135+
asScalarVal :: (MonadReusability m, MonadError QErr m) => AnnInpVal -> PGScalarType -> m PGScalarValue
136+
asScalarVal v tp = asScalarValM v tp >>= \case
137+
Just val -> pure val
138+
Nothing -> throw500 $ "unexpected null for ty " <> TB.run (toSQL tp)
139+
123140
-- | Note: only handles “synthetic” enums (see 'EnumValuesInfo'). Enum table references are handled
124141
-- by 'asPGColumnType' and its variants.
125142
asEnumVal :: (MonadReusability m, MonadError QErr m) => AnnInpVal -> m (G.NamedType, G.EnumValue)

server/src-lib/Hasura/GraphQL/Resolve/Introspect.hs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import qualified Data.HashMap.Strict as Map
1111
import qualified Data.HashSet as Set
1212
import qualified Data.Text as T
1313
import qualified Language.GraphQL.Draft.Syntax as G
14+
import qualified Hasura.SQL.Value as S
15+
import qualified Hasura.SQL.Types as S
1416

1517
import Hasura.GraphQL.Context
1618
import Hasura.GraphQL.Resolve.Context
@@ -156,7 +158,7 @@ ifaceR' i@(IFaceTyInfo descM n flds) fld =
156158

157159
-- 4.5.2.5
158160
enumTypeR
159-
:: ( Monad m )
161+
:: ( Monad m, MonadReusability m, MonadError QErr m )
160162
=> EnumTyInfo
161163
-> Field
162164
-> m J.Object
@@ -167,9 +169,20 @@ enumTypeR (EnumTyInfo descM n vals _) fld =
167169
"kind" -> retJ TKENUM
168170
"name" -> retJ $ namedTyToTxt n
169171
"description" -> retJ $ fmap G.unDescription descM
170-
"enumValues" -> fmap J.toJSON $ mapM (enumValueR subFld) $
171-
sortOn _eviVal $ Map.elems (normalizeEnumValues vals)
172+
"enumValues" -> do
173+
includeDeprecated <- readIncludeDeprecated subFld
174+
fmap J.toJSON $ mapM (enumValueR subFld) $
175+
filter (\val -> includeDeprecated || _eviIsDeprecated val) $
176+
sortOn _eviVal $ Map.elems (normalizeEnumValues vals)
172177
_ -> return J.Null
178+
where
179+
readIncludeDeprecated subFld = do
180+
let argM = Map.lookup "includeDeprecated" (_fArguments subFld)
181+
case argM of
182+
Nothing -> pure False
183+
Just arg -> asScalarVal arg S.PGBoolean >>= \case
184+
S.PGValBoolean b -> pure b
185+
_ -> throw500 "unexpected non-Boolean argument for includeDeprecated"
173186

174187
-- 4.5.2.6
175188
inputObjR

0 commit comments

Comments
 (0)