UNPKG

fauna-gql-upload

Version:

Manage your FaunaDB resources in within your project and upload them using a single command

232 lines (168 loc) 6.82 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Upload roles - Fauna GQL Upload</title> <link rel="preconnect" href="https://cdnjs.cloudflare.com" /> <link rel="preconnect" href="https://arc.io" /> <link rel="preconnect" href="https://viewm.moonicorn.network" /> <link rel="preconnect" href="https://plausible.io" /> <link rel="stylesheet" href="../../css/main.css" /> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/themes/prism-okaidia.css" integrity="sha512-lTmd0bFMM2Ttm/S8V5dywYNiJaSyF5PILZosvAIzW4EJ7JLEYflk9ImyYIxw5KlFz7e9ZCJN53rnvPnefD240w==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/prism.min.js" integrity="sha512-YBk7HhgDZvBxmtOfUdvX0z8IH2d10Hp3aEygaMNhtF8fSOvBZ16D/1bXZTJV6ndk/L/DlXxYStP8jrF77v2MIg==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script async src="https://arc.io/widget.min.js#3ua6mscf"></script> <script async defer data-domain="fgu-docs.com" src="https://plausible.io/js/plausible.js"></script> </head> <body> <header> <button class="icon-button hamburger"> <img src="../../img/hamburger.svg" /> </button> <h1 class="title">Fauna GQL Upload</h1> <div class="social"> <a href="https://github.com/Plazide/fauna-gql-upload"> <img alt="Github" src="../../img/github.png" /> </a> <a href="https://twitter.com/chj_web"> <img alt="Twitter" src="../../img/twitter.png" /> </a> </div> </header> <nav class="nav"> <header> <button onclick="toggleNavigation()" class="icon-button backburger"> <img src="../../img/backburger.svg" /> </button> <h1 class="title">Fauna GQL Upload</h1> </header> <ul class="list"> <li > <a href="../..">✨ Introduction</a> </li> <li > <a href="../../getting-started/">🏹 Getting started</a> </li> <li class="dropdown"> <button class="dropdown-button"> ⌨️ Configuration <img class="chevron" alt="chevron" src="../../img/chevron.svg" /> </button> <ul class="closed list"> <li > <a href="../../configuration/config-file/">Config file</a> </li> <li > <a href="../../configuration/command-line-options/">Command-line options</a> </li> <li > <a href="../../configuration/local-development/">Local development</a> </li> </ul> </li> <li class="active dropdown"> <button class="dropdown-button"> 🤹 Usage <img class="chevron" alt="chevron" src="../../img/chevron.svg" /> </button> <ul class="list"> <li > <a href="../upload-schema/">Upload schema</a> </li> <li > <a href="../upload-functions/">Upload functions</a> </li> <li > <a href="../upload-indexes/">Upload indexes</a> </li> <li class="active"> <a href="./">Upload roles</a> </li> <li > <a href="../upload-data/">Upload data</a> </li> <li > <a href="../upload-access-providers/">Upload access providers</a> </li> <li > <a href="../graphql-code-generator/">GraphQL code generator</a> </li> <li > <a href="../with-typescript/">With typescript</a> </li> </ul> </li> <li > <a href="../../contributing/">💡 Contributing</a> </li> <li > <a href="../../problems-or-issues/">❌ Problems or issues?</a> </li> </ul> <footer> <a href="https://github.com/Plazide/fauna-gql-upload"> <img alt="Github" src="../../img/github.png" /> </a> <a href="https://twitter.com/chj_web"> <img alt="Twitter" src="../../img/twitter.png" /> </a> </footer> </nav> <main class="main"><h1 id="upload-roles">Upload roles</h1> <p>To upload roles, you need a <code>fauna/roles</code> directory containing a <code>.js</code> file for each of your roles. These files describe the role and look like the following example.</p> <pre><code class="language-js">import { query as q } from &quot;faunadb&quot;; import onlyDeleteByOwner from &quot;../predicates/onlyDeleteByOwner&quot;; export default { name: &quot;user&quot;, privileges: [ { resource: Collection(&quot;Comment&quot;), actions: { read: true, create: true, delete: onlyDeleteByOwner } } ], membership: [ { resource: q.Collection(&quot;User&quot;) } ] } </code></pre> <p>Here, we create a role called <code>"user"</code> that is allowed to <code>read</code> and <code>create</code> comments, but only the owner of the comment can <code>delete</code> it. We use the the membership field to specify which collection the role will be attached to, in this case it is the <code>"User"</code> collection.</p> <p>For more info on roles, see the <a href="https://docs.fauna.com/fauna/current/security/roles">official documentation</a>.</p> <h2 id="predicate-functions">Predicate functions</h2> <p>Another detail that you've probably noticed is the <code>onlyDeleteByOwner</code> function. This is a <a href="https://docs.fauna.com/fauna/current/security/roles#mco">predicate function</a>. It lets you define your own permissions based on the user making the request and the document's fields. You would normally have to write these inline with the permissions. But in this case, we can create these in separate files and reuse them multiple times for different resources.</p> <p>The <code>onlyDeleteByOwner.js</code> file would like this:</p> <pre><code class="language-js">import { query as q } from &quot;faunadb&quot;; export default q.Query( q.Lambda( &quot;ref&quot;, q.Equals(q.CurrentIdentity(), q.Select([&quot;data&quot;, &quot;user&quot;], q.Get(q.Var(&quot;ref&quot;)))) ) ); </code></pre></main> <iframe src="https://viewm.moonicorn.network/#%7B%22options%22%3A%7B%22publisherAddr%22%3A%220x60C1D3c8E5FE51bEE5546F6240E18230be4C7Ab2%22%2C%22whitelistedTokens%22%3A%5B%220x6B175474E89094C44Da98b954EedeAC495271d0F%22%5D%2C%22whitelistedType%22%3A%22legacy_160x600%22%2C%22randomize%22%3Atrue%2C%22targeting%22%3A%5B%5D%2C%22width%22%3A%22160%22%2C%22height%22%3A%22600%22%2C%22minPerImpression%22%3A%220%22%2C%22fallbackUnit%22%3Anull%2C%22marketSlot%22%3A%22QmREYH6teaTWQF7uD7TfKuVvqRY3P5WauxDeHoQoJJJ4aA%22%7D%7D" width="160" height="600" scrolling="no" frameborder="0" style="border: 0;" class="ad-frame" onload="window.addEventListener('message', function(ev) { if (ev.data.hasOwnProperty('adexHeight') && ('https://viewm.moonicorn.network' === ev.origin)) { for (let f of document.getElementsByTagName('iframe')) { if (f.contentWindow === ev.source) { f.height = ev.data.adexHeight; } } } }, false)" ></iframe> <script src="../../js/main.js"></script> </body> </html>