This was introduced in d5b92a433a. Before
this change, the OpenApi output would have <pk/> annotations for views,
too. After this change, they got lost for mode follow-privileges, because
the pks are refined in haskell code, but the request only fetches all
the tables again, but not the view dependencies.
This fix changes follow-privileges to only fetch a list of accessible
tables, which is then used to filter the tables in the schema cache.
Fixes #2356
Signed-off-by: Wolfgang Walther <walther@technowledgy.de>
47 lines
1.2 KiB
Haskell
47 lines
1.2 KiB
Haskell
{-# LANGUAGE DeriveAnyClass #-}
|
|
{-# LANGUAGE DeriveGeneric #-}
|
|
|
|
module PostgREST.SchemaCache.Identifiers
|
|
( QualifiedIdentifier(..)
|
|
, Schema
|
|
, TableName
|
|
, FieldName
|
|
, AccessSet
|
|
, dumpQi
|
|
, toQi
|
|
) where
|
|
|
|
import qualified Data.Aeson as JSON
|
|
import qualified Data.Set as S
|
|
import qualified Data.Text as T
|
|
|
|
import Protolude
|
|
|
|
|
|
-- | Represents a pg identifier with a prepended schema name "schema.table".
|
|
-- When qiSchema is "", the schema is defined by the pg search_path.
|
|
data QualifiedIdentifier = QualifiedIdentifier
|
|
{ qiSchema :: Schema
|
|
, qiName :: TableName
|
|
}
|
|
deriving (Eq, Ord, Generic, JSON.ToJSON, JSON.ToJSONKey)
|
|
|
|
instance Hashable QualifiedIdentifier
|
|
|
|
dumpQi :: QualifiedIdentifier -> Text
|
|
dumpQi (QualifiedIdentifier s i) =
|
|
(if T.null s then mempty else s <> ".") <> i
|
|
|
|
-- TODO: Handle a case where the QI comes like this: "my.fav.schema"."my.identifier"
|
|
-- Right now it only handles the schema.identifier case
|
|
toQi :: Text -> QualifiedIdentifier
|
|
toQi txt = case T.drop 1 <$> T.breakOn "." txt of
|
|
(i, "") -> QualifiedIdentifier mempty i
|
|
(s, i) -> QualifiedIdentifier s i
|
|
|
|
type Schema = Text
|
|
type TableName = Text
|
|
type FieldName = Text
|
|
|
|
type AccessSet = S.Set QualifiedIdentifier
|