API Prototypes with dbb: Another step to better prototypes
Tags: elixir, phoenix, dbb
Published: 2024-05-09 06:20:22

---
title: API Prototypes with dbb: Another step to better prototypes
published: true
description: New features, more stuff to use and even more to do
tags: elixir, phoenix, dbb
# cover_image: https://direct_url_to_image.jpg
# Use a ratio of 100:42 for best results.
# published_at: 2024-05-08 20:05 +0000
---

[Second Post](https://dev.to/nicolkill/api-prototypes-with-dbb-a-little-more-than-a-prototype-1a07) to know the other features in dbb

# Introduction

In the previous post i added more features that i added to [dbb](https://github.com/nicolkill/dbb) and in this time, its not different, i added more stuff to build even more good stuff

## Admin UI

This stuff are inside since the last post hehe, but i forgot to mention in the post so here is the missing part

It's really simple, just open your server on the `/` route and will load the admin page, the API it's on the `/api/v1` route so will not conflict with the other routes

Will show obviously the schemas, basic CRUD for any of them, with cool create/edit forms based on the datatypes, the basic that any schema scan admin needs to have

## New datatype

In this case it's just one type, that it's list of values, you can define just one type or more, and will be saved in database in the same way

To define in your schema, just add mark your type inside the list brackets `["string"]`

```json
{
  "schemas": [
    {
      "name": "some_schema_name",
      "fields": {
        "name": "string",
        "flags": ["string"],
      }
    }
  ]
}
```

In the Admin UI will show a input with the elements on text separated by comma, so `["some", "value"]` will be displayed as `"some, value"` and in the same format will save as list

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

## Value generator

Maybe in some case you need generate some key or some like that, so you can define this generator format in the `generate` key in the json

```json
{
  "schemas": [
    {
      "name": "some_schema_name",
      "fields": {
        "name": "string",
        "sku": "string",
      },
      "generate": {
        "sku": "$str(4)$-$num(4)$-$sym(4)$-$str_num(4)$-$any(4)$"
      }
    }
  ]
}
```

The way to create a generator it's simple, just define in the generator your format with the function with `$` on start and end of the function, will works in this format `$str(4)$` and you can use this generator functions `str, num, sym, str_num, any`

In the Admin UI just just with keep empty to generate the value

## Relations

You can relate one schema to another using the in the `relations` key in the json

```json
{
  "schemas": [
    {
      "name": "orders",
      "fields": {
        "estimated_delivery_time": "datetime"
      }
    },
    {
      "name": "order_product",
      "fields": {
        "order_id": "string",
        "product_id": "string"
      },
      "relations": {
        "order_id": "orders",
        "product_id": "products"
      }
    },
    {
      "name": "products",
      "fields": {
        "name": "string",
        "description": "string",
      }
    }
  ]
}
```

> You can define also if some relation is mandatory adding `:mandatory` to your key name

## Load relations in query

Why have relations if you can't load this related data in the same call, so of course you can, adding `relations` as query param with your relations to load (yes, allow multiple)

```
GET /api/v1/:schema?relations=relation_1,relation_2
```

Pretty simple to use

## Admin UI basic auth

The last is a basic auth to Admin UI, simple to configure, with env vars, not much secure it's just to not have unsecured page in the system

```
ADMIN_AUTH_USERNAME: user
ADMIN_AUTH_PASSWORD: pass
```

# Next steps

The next to complete it's create a more complete experience on the admin, add functions like operations on query calls, some seeds to populate the system as demo and more features to create a complete solution as prototype