fauna-gql-upload
Version:
Manage your FaunaDB resources in within your project and upload them using a single command
259 lines (196 loc) • 8.4 kB
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 data - 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 >
<a href="../upload-roles/">Upload roles</a>
</li>
<li class="active">
<a href="./">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-data">Upload data</h1>
<p>To upload data, you need a <code>fauna/data</code> directory containing a <code>.js</code> file for each of your data definition sets. These files describe the data and look like the following example.</p>
<p>Data is idempotent, meaning multiple calls of the <code>fauna-gql</code> command will not yield duplicates. Documents that already exist (determined by the specified <code>key</code>) will be updated. This is why you must define a unique index and also specify which field to use for uniqueness with the <code>key</code> property.</p>
<pre><code class="language-js">export default {
collection: "Languages",
index: "languages_by_key",
key: "key",
data: [
{ key: "en", name: "English" },
{ key: "es", name: "Spanish" },
{ key: "fr", name: "French" },
],
};
</code></pre>
<blockquote>
<p><strong>NOTE:</strong> You need to create the index yourself. See <a href="/usage/upload-indexes">Uploading indexes</a> for more info.</p>
</blockquote>
<h2 id="adding-credentials-to-your-data">Adding credentials to your data</h2>
<p>You can attach credentials to your data. This is useful for, among other things, creating initial admin users. Simply create a <code>credentials</code> field and specify which piece of data the credentials will be attached to.</p>
<pre><code class="language-js">export default {
collection: "Admin",
index: "admin_by_email",
key: "email",
data: [
{ email: "carl@chjweb.se", name: "chjweb" }
],
credentials: [
{
key: "carl@chjweb.se",
password: "VerySecurePassword"
}
]
}
</code></pre>
<p>Here, we say that the <code>key</code> for our data is the <code>email</code> field. In the <code>credentials</code> field, we say that we are looking for a <code>key</code> with a value of <code>"carl@chjweb.se"</code> and want to assign the password to the corresponding data entry.</p>
<p>You can then use the FQL <code>Login()</code> function to get an access key for the admin user, like so:</p>
<pre><code class="language-js">Login(
Match(
Index("admin_by_email"),
"carl@chjweb.se"
),
{
password: "VerySecurePassword"
}
)
</code></pre>
<p>You would also need to create a role and specify the <code>Admin</code> collection in the membership field. See <a href="/usage/upload-roles">Uploading roles</a> for more info.</p>
<h2 id="specifying-refs">Specifying refs</h2>
<p>As of version 2.5.0, it is possible to specify the exact ref that uploaded document should use. This is useful when you need to manage relations between specific documents.</p>
<p>To specify a ref, simply add the <code>ref</code> property to the document data. Like so:</p>
<pre><code class="language-js">export default {
collection: "Admin",
index: "admin_by_email",
key: "email",
data: [
{
email: "carl@chjweb.se",
name: "chjweb",
ref: q.Ref(q.Collection("Admin"), '334248970957095424')
}
]
}
</code></pre>
<p>Notice how we specify the collection twice. First, in the <code>collection</code> property and then in the <code>ref</code> property on the data document using the <code>q.Collection()</code> function. The collection specified inside the <code>q.Ref()</code> will be the collection your data will reside in, no matter the value of the <code>collection</code> property.</p></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>