openfga/syntax-transformer

feat: support nested userset rewrite operands in the DSL

jon-whit opened this issue · 0 comments

The DSL today does not support nested userset rewrite operands and/or compound expressions delineated by parenthetical expressions. The DSL language should be extended to support compound expressions with parenthetical expressions so that it supports the same expressiveness of the JSON support existing today.

Below are some examples of the unsupported functionality.

# sample1
type document
  relations
    define restricted as self
    define editor as self
    define viewer as editor or (self but not restricted)
# sample2
type document
  relations
    define restricted as self
    define parent as self
    define editor as self
    define (viewer but not restricted) or (editor and viewer from parent)

These same models are supported in the JSON structure today, for example:

# sample 1
{
  "type_definitions": [
    {
      "type": "document",
      "relations": {
        "restricted": { "this": {} },
        "editor": { "this": {} },
        "viewer": {
          "union": {
            "child": [
              { "computedUserset": { "object": "", "relation": "editor" } },
              {
                "union": {
                    "child": [
                        { "this": {} },
                        {
                            "difference": {
                                "base": {
                                    "this": {} 
                                },
                                "subtract": {
                                    "object": "",
                                    "relation": "restricted"
                                }
                            }
                        }
                    ]
                }
              }
            ]
          }
        }
      }
    }
  ]
}
# sample2
{
  "type_definitions": [
    {
      "type": "document",
      "relations": {
        "parent": { "this": {} },
        "restricted": { "this": {} },
        "editor": { "this": {} },
        "viewer": {
          "union": {
            "child": [
              {
                "difference": {
                    "base": {
                        "this": {} 
                    },
                    "subtract": {
                        "object": "",
                        "relation": "restricted"
                    }
                }
              },
              {
                "intersection": {
                    "child": [
                        {
                            "computedUserset": {
                                "object": "",
                                "relation": "editor"
                            }
                        },
                        {
                            "tupleToUserset": {
                                "tupleset": {
                                    "object": "",
                                    "relation": "parent"
                                },
                                "computedUserset": {
                                    "object": "",
                                    "relation": "viewer"
                                }
                            }
                        }
                    ]
                }
              }
            ]
          }
        }
      }
    }
  ]
}