openfga / language

Grammar for the OpenFGA modeling language
https://openfga.dev
Apache License 2.0
15 stars 7 forks source link

Add a function that returns the modules in a model #284

Open rhamzeh opened 1 week ago

rhamzeh commented 1 week ago

The list returned should be in alphabetical order

If the schema version is not 1.2, throw an error (model schema version does not support modules)

An example model:

{
  "schema_version": "1.2",
  "type_definitions": [
    {
      "type": "user",
      "relations": {},
      "metadata": {
        "module": "core",
        "source_info": {
          "file": "core.fga"
        }
      }
    },
    {
      "type": "organization",
      "relations": {
        "member": {
          "this": {}
        },
        "admin": {
          "this": {}
        },
        "can_create_project": {
          "computedUserset": {
            "relation": "member"
          }
        },
        "can_create_page": {
          "computedUserset": {
            "relation": "member"
          }
        }
      },
      "metadata": {
        "relations": {
          "member": {
            "directly_related_user_types": [
              {
                "type": "user"
              }
            ]
          },
          "admin": {
            "directly_related_user_types": [
              {
                "type": "user"
              }
            ]
          },
          "can_create_project": {
            "directly_related_user_types": [],
            "module": "jira",
            "source_info": {
              "file": "jira/projects.fga"
            }
          },
          "can_create_page": {
            "directly_related_user_types": [],
            "module": "confluence",
            "source_info": {
              "file": "confluence.fga"
            }
          }
        },
        "module": "core",
        "source_info": {
          "file": "core.fga"
        }
      }
    },
    {
      "type": "group",
      "relations": {
        "member": {
          "this": {}
        }
      },
      "metadata": {
        "relations": {
          "member": {
            "directly_related_user_types": [
              {
                "type": "user"
              }
            ]
          }
        },
        "module": "core",
        "source_info": {
          "file": "core.fga"
        }
      }
    },
    {
      "type": "project",
      "relations": {
        "organization": {
          "this": {}
        },
        "viewer": {
          "tupleToUserset": {
            "computedUserset": {
              "relation": "member"
            },
            "tupleset": {
              "relation": "organization"
            }
          }
        }
      },
      "metadata": {
        "relations": {
          "organization": {
            "directly_related_user_types": [
              {
                "type": "organization"
              }
            ]
          },
          "viewer": {
            "directly_related_user_types": []
          }
        },
        "module": "jira",
        "source_info": {
          "file": "jira/projects.fga"
        }
      }
    },
    {
      "type": "ticket",
      "relations": {
        "project": {
          "this": {}
        },
        "owner": {
          "this": {}
        }
      },
      "metadata": {
        "relations": {
          "project": {
            "directly_related_user_types": [
              {
                "type": "project"
              }
            ]
          },
          "owner": {
            "directly_related_user_types": [
              {
                "type": "user"
              }
            ]
          }
        },
        "module": "jira",
        "source_info": {
          "file": "jira/tickets.fga"
        }
      }
    },
    {
      "type": "space",
      "relations": {
        "organization": {
          "this": {}
        },
        "can_view_pages": {
          "tupleToUserset": {
            "computedUserset": {
              "relation": "member"
            },
            "tupleset": {
              "relation": "organization"
            }
          }
        }
      },
      "metadata": {
        "relations": {
          "organization": {
            "directly_related_user_types": [
              {
                "type": "organization"
              }
            ]
          },
          "can_view_pages": {
            "directly_related_user_types": []
          }
        },
        "module": "confluence",
        "source_info": {
          "file": "confluence.fga"
        }
      }
    },
    {
      "type": "page",
      "relations": {
        "space": {
          "this": {}
        },
        "owner": {
          "this": {}
        }
      },
      "metadata": {
        "relations": {
          "space": {
            "directly_related_user_types": [
              {
                "type": "space"
              }
            ]
          },
          "owner": {
            "directly_related_user_types": [
              {
                "type": "user"
              }
            ]
          }
        },
        "module": "confluence",
        "source_info": {
          "file": "confluence.fga"
        }
      }
    }
  ],
  "conditions": {}
}