Building A Product Management Tool Using Appsmith and FaunaDB
Published: 2021-10-24 23:24:13

In this article, I'll be showing you how to create a product management tool that helps, small business signed up on a mythical e-commerce platform manage products in their catalogue. This tool will allow users to view products and edit them from their catalogues. This article will also help to show how you can integrate Appsmith with other serverless tools like FaunaDB.

### Table of Contents
- [Setting Up A FaunaDB Database](#setting-up-a-faunadb-database)
- [Building The Management Tool Using Appsmith](#building-the-management-tool-using-appsmith)
- [Conclusion](#conclusion)

Fauna is a flexible, developer-friendly, NoSQL database delivered as a secure and scalable cloud API with native GraphQL. It is a serverless solution for hosting data without having to worry about setting up or configuring your backend architecture to host data, as with traditional applications. This allows developers to focus more on building application logic with little to no involvement in database hassles - Fauna handles all that for you.

<br>

### Setting Up A FaunaDB Database

In order to follow along, you'll need to have a FaunaDB account, if you don't have one you can easily sign up in a few minutes via this [link](https://dashboard.fauna.com/accounts/register).

Once you're signed up, log in to your Fauna dashboard and use the `Create Database` button to create a new database, fill in the details as shown below:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fj2jjjnpx2fm9ea4zcpp.png)

Observe the `Use demo data` option and see that it is checked, this will tell Fauna to help us prepopulate this new database with demo data that we can use to play around, and co-incidentally (or not), this data is related to customers and businesses. Fauna will add collections, documents as well as indexes, and you can find them in the correspoding sections of your database dashboard as shown below:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pug6lptwvrpj5vkcl0iv.PNG)

<br>

#### Generating An API Key

Now that this is done, what we need now is an Api key, which will allow us communicate with our database from other applications, like our appsmith tool for instance. To get this head over to the `Security` tab of the database dashboard and click on the `New key` option to generate a new key, you can give the key a name if you want, leave the other options as they are and click the `Save` button to generate a new key.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wdyrnta84n3xwvflffzv.PNG)

Once you get the key, you need to copy it and save it somewhere for later when we need it. That's it for setting up the database, prettu easy as you can see, now lets create the interface for our tool.

<br>

### Building The Management Tool Using Appsmith
To begin with you want to make sure you've signed up with Appsmith, its super-easy you can sign up [here](https://app.appsmith.com/user/signup). Once you have that login to your dashboard and create a new application, this should bring you to the development environment like the one shown below:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zqvuk4rf3gh3x2w2ror0.PNG)

This environment is where we'd be building our "application" and its mostly a drag and drop environment with widgets and other build tools on the left pane and the wider space to the right is the development area where you drag widgets on. 

We'll start by clicking and dragging a `table` widget unto the right area, this table will display a business's product listings, and the details of each one:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3lopxptep770g0yu62xi.PNG)

You can resize the table by dragging on the edges, however leave some space so that we can add one more widget - a form. This form will collect information for a new product to be added to the list and will also serve as a means of editing already existing products in the catalogue.

Click and drag the form widget onto the right area so that it fits to the right of the table as shown below, you may need to do some resizing to get it to fit in there:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvdmejrqgfpif34nvcyt.PNG)

#### Populating The Table

In order to populate the table with data from our database, we'll be using the GraphQL api that Fauna automatically created for us when we created the database - again this is courtesy of the option we checked earlier on when we created the database to allow Fauna pre-populate the database with data on our behalf.

In order to see what queries we can run head over to the `GraphQL` section in the database dashboard to view the queries Fauna created on our behalf:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9wxbi96hqhpcgnxjp8gw.PNG)

The link to this graphql api is in the searchbox on this page, copy it and head over to the appsmith dashboard from  before, and click on the `Datasources` option to create a new api.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ekjn5x5wva6jomcb6qdb.PNG)

It should prompt you to enter details about your api on a new page, these includes a name for the API (I called mine FaunaApi), the URL, headers and data or request body to be sent to the Api. Fill the details as shown below:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r5oevz3g27fp9c4iyn7e.PNG)

For the value of `Authorization` in the headers, its usually in the format of `Bearer [Fauna Secret]` which is what we got from previous steps, copy that and paste it in, as I have done.

Next we must now write the query that fetches data from our api, so in the body of the request select type `JSON` and add the following piece of query to fetch all products on our hypothetical platform:

```js
{{
	JSON.stringify(
		{
			variable: null,
			query: `
				{
					allProducts{
						data{
							_id
							name
							description
							price
							backordered
							backorderLimit
							quantity
							store{
								name
							}
						}
					}
				}
			`
		}
	)
}}
```
<br>

Observe that we use the JSON.stringify method provided by appsmith (via the moustache syntax) to ignore the line breaks. Inside the query we have the query name - `allProducts` and is one specified by Fauna on our behalf you can check its doc back at the Fauna dashboard under the `GraphQL` section to see available queries and mutations. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/071c5fh1dplknvj9tsbd.PNG)

Now head back to the table widget and we'll ask the table to fetch data from this api instead of the hard-coded data in it. Click on the table widget and its context manager should pop-up right beside it, and under the field that reads - `Table Data`, you want to clear out the hard-coded data in it and add the following instead:

```js
{{FaunaApi.data.data.allProducts.data}}
```
This will populate the table with results from the api instead.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7o1xk0lobsi3zlgy41t5.PNG)

The store column seems to come as an object, as opposed to a simple string. This is because stores are independent documents in the database too, and have other attributes as well, however in this query we only fetch their name but the result comes in an object format regardless. 

Appsmith allows us the flexibility of editing columns too, so we can click on the settings icon on the `store` column in the `Columns` section and in the `computed value` option from the menu that shows up, we change the value to

```js
{{currentRow.store.name}}
```
<br>

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bnl3vyv2op7yos51qfti.PNG)

We also want to set the `Column Type` on the `price`, `backorderLimit` and `quantity` columns to a type of `Number` so that Appsmith can properly handle the data.

#### <u>Building The Form</u>

To create a form, we'll need the `Text` and `Input` widgets which will help us to name and create the input fields for the form. For this form we need fields that correspond to the title of each column except of course the `_id` and `store` column, those should be immutable ideally.

So drag and drop the widget and position them so that the form looks like the one shown below:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3p6l0uju4akmgzvr0u5f.PNG)

>Observe that for the `backordered` column, we drag a `Switch` widget to the form as opposed to an input widget because it's values are boolean and that corresponds to a switch or a checkbox widget which can represent both states as checked or unchecked.

Now we want to be able to prefill these fields when any product is selected on the table so that we can edit them on the form. To do this we leverage on the `Default value` property of the input widget and add moustache syntax to fetch data on the selected row and add it to the field. 

Add the following to the `Default value` entry on the `Product name` field to prefill it with the name of the product on a selected row. 

```js
{{Table1.selectedRow.name}}
```

If you don't see the details of the input widget, click on the settings icon beside it to bring up the properties of the widegt, as shown below:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dn851teszb4krh7pdvig.PNG)

Do this for the other fields adding in the corresponding column name for each one. Also set the `Data type` property for the input fields: `quantity`, `backorderLimit`, and `price` to type of `Number`.

For the `"backordered"` switch use the _`Default Selected`_ option to add the moustache syntax as with the other fields, as shown below, this will automatically change the state of the switch depending on what value on the "backordered" column is for the selected row.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/98pyf4ambwblncx1sk7i.PNG)

<br>

#### <u>Updating A Product</u>

Once this is done, we need to write a query that helps to update the document in the database when we change something in the form and hit the submit button. This query will be tethered to the `Submit` button widget, which was automatically added when the form was created.

We will now create a new Api to handle this, using the same steps as we have done for the first one, give this a name, and use the same headers from before. In the body of the request, we want to add the following to pick data from the input fields and send them to the graphQL api:

```js
{{
	JSON.stringify(
	{
		query: `mutation ($object: ProductInput!){
							updateProduct(
								id: "${Table1.selectedRow._id}",
								data: $object
							)
							{
								name
							}
						}`,
		variables: {
			"object": {
					name: Input1.text,
					description: Input2.text,
					price: Input3.text,                        
					quantity: Input4.text,
					backorderLimit: Input6.text,
					backordered: Switch1.isSwitchedOn
				}
		}
	}
)}}
```

This query fetches the ID of the currently selected row, and uses the data from the pre-filled and or edited form to update the details of the produt on the Fauna database. 

Let's now tie this with the submit button so that when we edit the form and click submit the this api is called. Head over to the submit widget and bring up the settings pane, and under the `Actions` section choose the option to `Execute a query` and then select the `updateProduct` api from the list of options showed.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ehr0nu8owtwo816pb3s7.PNG)

<br>

We also want the table to refresh its data `onSuccess` of the api query, and we do this by specifying an `onSuccess` action right beneath the `onClick` action of the submit button, this also `Executes a query` via the FaunaApi which we created first - remember this api is responsible for populating the table with data from the database. You can now select any row from the table, edit it in the form and send the request to update the database, which in turn updates the table accordingly.

### Conclusion

In this article, we have seen a brief introduction to Fauna, and the kind of flexibility it offers, we created a FaunaDB database, and generated data automatically with the help of Fauna including a full fledged GraphQL API, which helped us to intereact with Appsmith later on, lastly we worked with Appsmith to build a simple product management tool for business owners, and connected it to our Fauna API, using `datasources` from Appsmith. Hopefully this tutorial has further shown you what is possible with serverless technologies like Appsmith and Fauna. Thanks for sticking with me till the end, happy coding!.