diff --git a/CHANGELOG-draft.md b/CHANGELOG-draft.md index 1fbca391cd..2f7c81b095 100644 --- a/CHANGELOG-draft.md +++ b/CHANGELOG-draft.md @@ -19,6 +19,8 @@ THIS FILE ACCUMULATES THE RELEASE NOTES FOR THE UPCOMING RELEASE. ## Documentation * Added documentation of federation errors (#1674) +* Better swagger schema for the Range type (#1748) +* Add better example for Domain in swagger (#1748) ## Internal changes diff --git a/libs/types-common/src/Data/Domain.hs b/libs/types-common/src/Data/Domain.hs index 82ab246614..7656834b43 100644 --- a/libs/types-common/src/Data/Domain.hs +++ b/libs/types-common/src/Data/Domain.hs @@ -19,6 +19,7 @@ module Data.Domain where +import Control.Lens ((?~)) import Data.Aeson (FromJSON, FromJSONKey, FromJSONKeyFunction (FromJSONKeyTextParser), ToJSON, ToJSONKey (toJSONKey)) import qualified Data.Aeson as Aeson import Data.Aeson.Types (toJSONKeyText) @@ -66,7 +67,9 @@ newtype Domain = Domain {_domainText :: Text} deriving (FromJSON, ToJSON, S.ToSchema) via Schema Domain instance ToSchema Domain where - schema = domainText .= parsedText "Domain" mkDomain + schema = + domainText .= parsedText "Domain" mkDomain + & doc . S.schema . S.example ?~ "example.com" domainText :: Domain -> Text domainText = _domainText diff --git a/libs/types-common/src/Data/Range.hs b/libs/types-common/src/Data/Range.hs index 9ed5be7950..832746ccc1 100644 --- a/libs/types-common/src/Data/Range.hs +++ b/libs/types-common/src/Data/Range.hs @@ -55,7 +55,7 @@ module Data.Range where import Cassandra (ColumnType, Cql (..), Tagged, retag) -import Control.Lens ((?~)) +import Control.Lens ((%~), (?~)) import Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON)) import Data.Aeson.Types as Aeson (Parser) import qualified Data.Attoparsec.ByteString as Atto @@ -121,7 +121,7 @@ instance (Within a n m, FromJSON a) => FromJSON (Range n m a) where msg sn sm = fail (errorMsg (fromSing sn) (fromSing sm) "") rangedSchema :: - (Within a n m, Bounds b) => + (Within a n m, HasRangedSchemaDocModifier d b) => SNat n -> SNat m -> SchemaP d v w a b -> @@ -131,18 +131,55 @@ rangedSchema sn sm sch = Range <$> untypedRangedSchema (get sn) (get sm) sch get = toInteger . fromSing untypedRangedSchema :: - Bounds b => + forall d v w a b. + (HasRangedSchemaDocModifier d b) => Integer -> Integer -> SchemaP d v w a b -> SchemaP d v w a b -untypedRangedSchema n m sch = sch `withParser` check +untypedRangedSchema n m sch = (sch `withParser` check) & doc %~ rangedSchemaDocModifier (Proxy @b) n m where check x = x <$ guard (within x n m) <|> fail (errorMsg n m "") -instance (Within a n m, ToSchema a) => ToSchema (Range n m a) where +class Bounds a => HasRangedSchemaDocModifier d a where + rangedSchemaDocModifier :: Proxy a -> Integer -> Integer -> d -> d + +listRangedSchemaDocModifier :: S.HasSchema d S.Schema => Integer -> Integer -> d -> d +listRangedSchemaDocModifier n m = S.schema %~ ((S.minItems ?~ n) . (S.maxItems ?~ m)) + +stringRangedSchemaDocModifier :: S.HasSchema d S.Schema => Integer -> Integer -> d -> d +stringRangedSchemaDocModifier n m = S.schema %~ ((S.minLength ?~ n) . (S.maxLength ?~ m)) + +numRangedSchemaDocModifier :: S.HasSchema d S.Schema => Integer -> Integer -> d -> d +numRangedSchemaDocModifier n m = S.schema %~ ((S.minimum_ ?~ fromIntegral n) . (S.maximum_ ?~ fromIntegral m)) + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d [a] where rangedSchemaDocModifier _ = listRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d Text where rangedSchemaDocModifier _ = stringRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d String where rangedSchemaDocModifier _ = stringRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d (AsciiText c) where rangedSchemaDocModifier _ = stringRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d Int where rangedSchemaDocModifier _ = numRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d Int32 where rangedSchemaDocModifier _ = numRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d Integer where rangedSchemaDocModifier _ = numRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d Word where rangedSchemaDocModifier _ = numRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d Word8 where rangedSchemaDocModifier _ = numRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d Word16 where rangedSchemaDocModifier _ = numRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d Word32 where rangedSchemaDocModifier _ = numRangedSchemaDocModifier + +instance S.HasSchema d S.Schema => HasRangedSchemaDocModifier d Word64 where rangedSchemaDocModifier _ = numRangedSchemaDocModifier + +instance (Within a n m, ToSchema a, HasRangedSchemaDocModifier NamedSwaggerDoc a) => ToSchema (Range n m a) where schema = fromRange .= rangedSchema sing sing schema instance (Within a n m, Cql a) => Cql (Range n m a) where