# DrawDB Writer

Generates DrawDB-compatible JSON files from database schema information.

## Overview

The DrawDB Writer converts RelSpec's internal database model representation into JSON format compatible with DrawDB, a free online database design tool.

## Features

- Generates DrawDB JSON format
- Creates table and field definitions
- Defines relationships
- Includes visual layout information
- Preserves constraints and indexes

## Usage

### Basic Example

```go
package main

import (
    "git.warky.dev/wdevs/relspecgo/pkg/models"
    "git.warky.dev/wdevs/relspecgo/pkg/writers"
    "git.warky.dev/wdevs/relspecgo/pkg/writers/drawdb"
)

func main() {
    options := &writers.WriterOptions{
        OutputPath: "diagram.json",
    }

    writer := drawdb.NewWriter(options)
    err := writer.WriteDatabase(db)
    if err != nil {
        panic(err)
    }
}
```

### CLI Examples

```bash
# Generate DrawDB diagram from PostgreSQL database
relspec --input pgsql \
  --conn "postgres://localhost/mydb" \
  --output drawdb \
  --out-file diagram.json

# Convert GORM models to DrawDB for visualization
relspec --input gorm --in-file models.go --output drawdb --out-file design.json

# Convert JSON schema to DrawDB
relspec --input json --in-file schema.json --output drawdb --out-file diagram.json
```

## Generated JSON Example

```json
{
  "version": "1.0",
  "database": "PostgreSQL",
  "tables": [
    {
      "id": "1",
      "name": "users",
      "x": 100,
      "y": 100,
      "fields": [
        {
          "id": "1",
          "name": "id",
          "type": "BIGINT",
          "primary": true,
          "autoIncrement": true,
          "notNull": true
        },
        {
          "id": "2",
          "name": "username",
          "type": "VARCHAR",
          "size": 50,
          "notNull": true,
          "unique": true
        },
        {
          "id": "3",
          "name": "email",
          "type": "VARCHAR",
          "size": 100,
          "notNull": true
        }
      ],
      "indexes": [
        {
          "name": "idx_users_email",
          "fields": ["email"]
        }
      ]
    },
    {
      "id": "2",
      "name": "posts",
      "x": 400,
      "y": 100,
      "fields": [
        {
          "id": "1",
          "name": "id",
          "type": "BIGINT",
          "primary": true
        },
        {
          "id": "2",
          "name": "user_id",
          "type": "BIGINT",
          "notNull": true
        },
        {
          "id": "3",
          "name": "title",
          "type": "VARCHAR",
          "size": 200,
          "notNull": true
        }
      ]
    }
  ],
  "relationships": [
    {
      "id": "1",
      "source": "2",
      "target": "1",
      "sourceField": "user_id",
      "targetField": "id",
      "type": "many-to-one",
      "onDelete": "CASCADE"
    }
  ]
}
```

## DrawDB Features

### Table Properties
- `id` - Unique table identifier
- `name` - Table name
- `x`, `y` - Position in diagram
- `fields` - Array of field definitions
- `indexes` - Array of index definitions

### Field Properties
- `id` - Unique field identifier
- `name` - Field name
- `type` - Data type (BIGINT, VARCHAR, etc.)
- `size` - Length for string types
- `primary` - Primary key flag
- `notNull` - NOT NULL constraint
- `unique` - Unique constraint
- `autoIncrement` - Auto-increment flag
- `default` - Default value

### Relationship Properties
- `id` - Unique relationship identifier
- `source` - Source table ID
- `target` - Target table ID
- `sourceField` - Foreign key field
- `targetField` - Referenced field
- `type` - Relationship type (one-to-one, one-to-many, many-to-one)
- `onDelete` - Delete action
- `onUpdate` - Update action

## Notes

- DrawDB is available at drawdb.vercel.app
- Generated files can be imported for visual editing
- Visual positions (x, y) are auto-generated
- Ideal for creating ERD diagrams
- Supports modern database features
- Free and open-source tool
