Skip to main content

Practical Gtree Examples

This section contains real-world, production-ready examples of code generation using Gtree. Each example demonstrates complete, working templates that generate functional code for modern frameworks and languages.

All examples assume you have a database table in your Gtree. For demonstration, we'll use a users table with fields like id, email, first_name, last_name, password, created_at.


Example 1: Laravel Eloquent Model

Generate a complete, fully-featured Laravel Eloquent model from your table definition.

{:code:}
const table = gtree.project.tables[0];
const modelName = table.tablename
.split('_')
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join('');

const fillableFields = table.fields
.filter(f => !f.isprimarykey && f.controltype !== 'hidden')
.map(f => `'${f.name}'`);

const casts = {};
for (const field of table.fields) {
if (field.type === 'BOOLEAN') {
casts[field.name] = 'boolean';
} else if (field.type === 'DATETIME' || field.type === 'DATE') {
casts[field.name] = 'datetime';
} else if (field.type === 'INT' || field.type === 'BIGINT') {
casts[field.name] = 'integer';
} else if (field.type === 'DECIMAL') {
casts[field.name] = 'float';
}
}

const castString = Object.entries(casts)
.map(([key, value]) => `'${key}' => '${value}'`)
.join(",\n ");

let model = `<?php

namespace App\\Models;

use Illuminate\\Database\\Eloquent\\Model;
use Illuminate\\Database\\Eloquent\\Casts\\Attribute;

class ${modelName} extends Model
{
protected $table = '${table.tablename}';

protected $fillable = [
${fillableFields.join(",\n ")}
];

protected $casts = [
${castString}
];

protected $hidden = [
'password'
];

// Add custom relationships
// public function otherModel()
// {
// return $this->hasMany(OtherModel::class);
// }
}
`;

return model;
{:codeend:}

Generated Output:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
protected $table = 'users';

protected $fillable = [
'email',
'first_name',
'last_name',
'password',
'created_at'
];

protected $casts = [
'created_at' => 'datetime',
'password' => 'string'
];

protected $hidden = [
'password'
];
}

Example 2: React Form Component with Validation

Generate a fully-functional React form component with Formik validation.

{:code:}
const table = gtree.project.tables[0];

// Convert table name to component name
const componentName = table.tablename
.split('_')
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join('');

// Fields to include (exclude id and timestamps)
const formFields = table.fields.filter(f =>
!f.isprimarykey &&
!f.name.includes('_at') &&
f.controltype !== 'hidden'
);

// Build initial values
const initialValues = {};
for (const field of formFields) {
initialValues[field.camelcase] = field.type === 'BOOLEAN' ? false : '';
}

const initialValuesStr = Object.entries(initialValues)
.map(([key, value]) => `${key}: ${typeof value === 'boolean' ? value : "''"}`)
.join(',\n ');

// Build validation schema
const validationRules = [];
for (const field of formFields) {
let rules = [];

if (!field.isnullable) {
rules.push('Yup.string().required("This field is required")');
} else {
rules.push('Yup.string().optional()');
}

if (field.length > 0) {
rules.push(`.max(${field.length})`);
}

if (field.controltype === 'email') {
rules = ['Yup.string().email("Invalid email").required()'];
} else if (field.controltype === 'number') {
rules = ['Yup.number().required()'];
}

validationRules.push(` ${field.camelcase}: ${rules.join('.')}`);
}

// Build form fields JSX
const fieldElements = formFields.map(field => {
const label = field.caption;
const inputType = field.controltype === 'email' ? 'email' :
field.controltype === 'password' ? 'password' :
field.controltype === 'number' ? 'number' : 'text';

return ` <div className="form-group">
<label htmlFor="${field.camelcase}">${label}</label>
<input
type="${inputType}"
id="${field.camelcase}"
name="${field.camelcase}"
className="form-control"
placeholder="Enter ${label.toLowerCase()}"
onChange={formik.handleChange}
onBlur={formik.handleBlur}
value={formik.values.${field.camelcase}}
${!field.isnullable ? 'required' : ''}
/>
{formik.touched.${field.camelcase} && formik.errors.${field.camelcase} && (
<div className="error">{formik.errors.${field.camelcase}}</div>
)}
</div>`;
}).join('\n\n');

let component = `import React from 'react';
import { useFormik } from 'formik';
import * as Yup from 'yup';

const validationSchema = Yup.object().shape({
${validationRules.join(',\n')}
});

const ${componentName}Form = ({ onSubmit }) => {
const formik = useFormik({
initialValues: {
${initialValuesStr}
},
validationSchema,
onSubmit: (values) => {
onSubmit(values);
}
});

return (
<form onSubmit={formik.handleSubmit} className="form-container">
<h2>${componentName} Form</h2>

${fieldElements}

<button type="submit" className="btn-primary">
Submit
</button>
</form>
);
};

export default ${componentName}Form;
`;

return component;
{:codeend:}

Generated Output:

import React from 'react';
import { useFormik } from 'formik';
import * as Yup from 'yup';

const validationSchema = Yup.object().shape({
email: Yup.string().email("Invalid email").required(),
firstName: Yup.string().required("This field is required").max(255),
lastName: Yup.string().required("This field is required").max(255),
password: Yup.string().required("This field is required")
});

const UserForm = ({ onSubmit }) => {
const formik = useFormik({
initialValues: {
email: '',
firstName: '',
lastName: '',
password: ''
},
validationSchema,
onSubmit: (values) => {
onSubmit(values);
}
});

return (
<form onSubmit={formik.handleSubmit} className="form-container">
<h2>User Form</h2>
{/* Form fields */}
<button type="submit" className="btn-primary">Submit</button>
</form>
);
};

export default UserForm;

Example 3: RESTful API Routes (Express.js)

Generate complete Express.js API routes with CRUD operations.

{:code:}
const table = gtree.project.tables[0];
const modelName = table.tablename
.split('_')
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
.join('');
const routePath = table.tablename;
const variableName = table.tablename.charAt(0).toLowerCase() + table.tablename.slice(1);

const primaryKeyField = table.fields.find(f => f.isprimarykey);
const pkName = primaryKeyField ? primaryKeyField.name : 'id';

let routes = `const express = require('express');
const router = express.Router();
const ${modelName} = require('../models/${modelName}');

// GET all ${routePath}
router.get('/${routePath}', async (req, res) => {
try {
const items = await ${modelName}.findAll();
res.json(items);
} catch (error) {
res.status(500).json({ error: error.message });
}
});

// GET single ${routePath}
router.get('/${routePath}/:id', async (req, res) => {
try {
const item = await ${modelName}.findByPk(req.params.id);
if (!item) {
return res.status(404).json({ error: '${modelName} not found' });
}
res.json(item);
} catch (error) {
res.status(500).json({ error: error.message });
}
});

// CREATE ${routePath}
router.post('/${routePath}', async (req, res) => {
try {
const ${variableName} = await ${modelName}.create(req.body);
res.status(201).json(${variableName});
} catch (error) {
res.status(400).json({ error: error.message });
}
});

// UPDATE ${routePath}
router.put('/${routePath}/:id', async (req, res) => {
try {
const ${variableName} = await ${modelName}.findByPk(req.params.id);
if (!${variableName}) {
return res.status(404).json({ error: '${modelName} not found' });
}
await ${variableName}.update(req.body);
res.json(${variableName});
} catch (error) {
res.status(400).json({ error: error.message });
}
});

// DELETE ${routePath}
router.delete('/${routePath}/:id', async (req, res) => {
try {
const ${variableName} = await ${modelName}.findByPk(req.params.id);
if (!${variableName}) {
return res.status(404).json({ error: '${modelName} not found' });
}
await ${variableName}.destroy();
res.status(204).send();
} catch (error) {
res.status(500).json({ error: error.message });
}
});

module.exports = router;
`;

return routes;
{:codeend:}

Example 4: SQL Migration File

Generate a complete Laravel migration with all fields and constraints.

{:code:}
const table = gtree.project.tables[0];
const timestamp = new Date().toISOString().split('T')[0].replace(/-/g, '');
const migrationName = `Create${table.tablename.split('_').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join('')}Table`;

const typeMap = {
'BIGINT': 'bigInteger',
'INT': 'integer',
'VARCHAR': 'string',
'TEXT': 'text',
'BOOLEAN': 'boolean',
'DATETIME': 'dateTime',
'DATE': 'date',
'DECIMAL': 'decimal',
'JSON': 'json',
'ENUM': 'enum'
};

// Group fields by type for organization
const columnDefs = [];
for (const field of table.fields) {
let definition = '';
const methodName = typeMap[field.type] || 'string';

if (field.isprimarykey && field.type === 'BIGINT') {
definition = `$table->id('${field.name}')`;
} else if (methodName === 'string' || methodName === 'enum') {
const params = field.length > 0 ? `, ${field.length}` : '';
definition = `$table->${methodName}('${field.name}'${params})`;
} else if (methodName === 'decimal') {
definition = `$table->${methodName}('${field.name}', ${field.length || 8}, ${field.decimals || 2})`;
} else {
definition = `$table->${methodName}('${field.name}')`;
}

if (!field.isnullable && !field.isprimarykey) {
definition += '->nullable(false)';
} else if (field.isnullable && !field.isprimarykey) {
definition += '->nullable()';
}

if (field.isunique) {
definition += '->unique()';
}

if (field.defaultvalue) {
definition += `->default('${field.defaultvalue}')`;
}

columnDefs.push(definition + ';');
}

const migration = `<?php

use Illuminate\\Database\\Migrations\\Migration;
use Illuminate\\Database\\Schema\\Blueprint;
use Illuminate\\Support\\Facades\\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('${table.tablename}', function (Blueprint $table) {
${columnDefs.join('\n ')}
$table->timestamps();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('${table.tablename}');
}
};
`;

return migration;
{:codeend:}

Example 5: TypeScript Interface and Types

Generate TypeScript interfaces with proper typing for your API responses and frontend models.

{:code:}
const table = gtree.project.tables[0];
const interfaceName = 'I' + table.tablename
.split('_')
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
.join('');

const typeMap = {
'BIGINT': 'number',
'INT': 'number',
'VARCHAR': 'string',
'TEXT': 'string',
'BOOLEAN': 'boolean',
'DATETIME': 'Date | string',
'DATE': 'Date | string',
'DECIMAL': 'number',
'JSON': 'Record<string, any>',
'ENUM': 'string'
};

// Build interface properties
const properties = [];
for (const field of table.fields) {
const tsType = typeMap[field.type] || 'unknown';
const optional = field.isnullable ? '?' : '';
const comment = field.caption ? `/** ${field.caption} */\n ` : '';

properties.push(`${comment}${field.camelcase}${optional}: ${tsType};`);
}

// Build type for create (exclude id, timestamps)
const createFields = table.fields.filter(f =>
!f.isprimarykey &&
!f.name.includes('_at')
);

const createProperties = [];
for (const field of createFields) {
const tsType = typeMap[field.type] || 'unknown';
const optional = field.isnullable ? '?' : '';
createProperties.push(` ${field.camelcase}${optional}: ${tsType};`);
}

let types = `// Auto-generated types

/**
* ${interfaceName}
* ${table.tablename} table model
*/
export interface ${interfaceName} {
${properties.join('\n ')}
}

/**
* ${interfaceName}Create
* Request payload for creating a new ${table.tablename}
*/
export interface ${interfaceName}Create {
${createProperties.join('\n')}
}

/**
* ${interfaceName}Update
* Request payload for updating a ${table.tablename}
*/
export interface ${interfaceName}Update extends Partial<${interfaceName}Create> {}

/**
* API Response wrapper
*/
export interface ApiResponse<T> {
data: T;
message?: string;
timestamp: number;
}

/**
* Paginated response
*/
export interface PaginatedResponse<T> {
data: T[];
total: number;
page: number;
pageSize: number;
totalPages: number;
}
`;

return types;
{:codeend:}

Example 6: Database Seeder

Generate a Laravel seeder with realistic sample data.

{:code:}
const table = gtree.project.tables[0];
const modelName = table.tablename
.split('_')
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
.join('');

// Determine sample data based on field type
const getSampleValue = (field, index) => {
if (field.name === 'email') return `'user${index}@example.com'`;
if (field.name.includes('name')) return `'Sample ${field.caption} ${index}'`;
if (field.type === 'BOOLEAN') return 'true';
if (field.type === 'INT' || field.type === 'BIGINT') return index.toString();
if (field.type === 'DATETIME') return `now()`;
if (field.type === 'DECIMAL') return '99.99';
return `'Sample ${field.caption}'`;
};

const seedData = [];
for (let i = 1; i <= 5; i++) {
const record = [];
for (const field of table.fields) {
if (field.isprimarykey && field.isautoinc) continue;
record.push(`'${field.name}' => ${getSampleValue(field, i)}`);
}
seedData.push(`[\n ${record.join(',\n ')}\n ]`);
}

const seeder = `<?php

namespace Database\\Seeders;

use Illuminate\\Database\\Seeder;
use Illuminate\\Support\\Facades\\DB;

class ${modelName}Seeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
DB::table('${table.tablename}')->insert([
${seedData.join(',\n ')}
]);
}
}
`;

return seeder;
{:codeend:}

Example 7: GraphQL Schema Definition

Generate a GraphQL schema (SDL) for your table.

{:code:}
const table = gtree.project.tables[0];
const typeName = table.tablename
.split('_')
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
.join('');

const graphqlTypeMap = {
'BIGINT': 'Int!',
'INT': 'Int!',
'VARCHAR': 'String!',
'TEXT': 'String!',
'BOOLEAN': 'Boolean!',
'DATETIME': 'DateTime!',
'DATE': 'Date!',
'DECIMAL': 'Float!',
'JSON': 'JSON!'
};

// Build type definition
const typeFields = [];
for (const field of table.fields) {
const graphqlType = graphqlTypeMap[field.type] || 'String!';
const actualType = field.isnullable ? graphqlType.replace('!', '') : graphqlType;
typeFields.push(` ${field.camelcase}: ${actualType}`);
}

const createInputFields = table.fields
.filter(f => !f.isprimarykey && !f.name.includes('_at'))
.map(f => {
const graphqlType = graphqlTypeMap[f.type] || 'String!';
const actualType = f.isnullable ? graphqlType.replace('!', '') : graphqlType;
return ` ${f.camelcase}: ${actualType}`;
});

const schema = `# Auto-generated GraphQL Schema

"""
${typeName} type
"""
type ${typeName} {
${typeFields.join('\n')}
}

"""
${typeName}Create input
"""
input ${typeName}CreateInput {
${createInputFields.join('\n')}
}

"""
${typeName}Update input
"""
input ${typeName}UpdateInput {
${createInputFields.map(f => f.replace(': ', ': ')).join('\n')}
}

type Query {
${table.tablename}(id: Int!): ${typeName}
all${typeName}(limit: Int, offset: Int): [${typeName}!]!
}

type Mutation {
create${typeName}(input: ${typeName}CreateInput!): ${typeName}!
update${typeName}(id: Int!, input: ${typeName}UpdateInput!): ${typeName}!
delete${typeName}(id: Int!): Boolean!
}
`;

return schema;
{:codeend:}

Example 8: Prisma Schema

Generate Prisma ORM schema definition.

{:code:}
const table = gtree.project.tables[0];
const modelName = table.tablename
.split('_')
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
.join('');

const prismaTypeMap = {
'BIGINT': 'BigInt',
'INT': 'Int',
'VARCHAR': 'String',
'TEXT': 'String',
'BOOLEAN': 'Boolean',
'DATETIME': 'DateTime',
'DATE': 'DateTime',
'DECIMAL': 'Decimal',
'JSON': 'Json'
};

const fields = [];
for (const field of table.fields) {
const prismaType = prismaTypeMap[field.type] || 'String';
const optional = field.isnullable ? '?' : '';

let attributes = [];
if (field.isprimarykey) attributes.push('@id');
if (field.isautoinc) attributes.push('@default(autoincrement())');
if (field.isunique && !field.isprimarykey) attributes.push('@unique');

const attrString = attributes.length > 0 ? ` ${attributes.join(' ')}` : '';

fields.push(` ${field.camelcase} ${prismaType}${optional}${attrString}`);
}

// Add relationships
for (const field of table.fields) {
if (field.isforeignkey) {
const relatedModel = field.linktable
.split('_')
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
.join('');

const relationshipName = field.linktable;
fields.push(` ${relationshipName} ${relatedModel} @relation(fields: [${field.name}], references: [${field.linkfield}])`);
}
}

// Add timestamps if not already present
const hasCreatedAt = table.fields.some(f => f.name === 'created_at');
const hasUpdatedAt = table.fields.some(f => f.name === 'updated_at');

if (!hasCreatedAt) fields.push(` createdAt DateTime @default(now())`);
if (!hasUpdatedAt) fields.push(` updatedAt DateTime @updatedAt`);

const schema = `model ${modelName} {
${fields.join('\n')}

@@table("${table.tablename}")
}
`;

return schema;
{:codeend:}

Example 9: Complete API Request/Response Documentation

Generate API documentation with request and response examples.

{:code:}
const table = gtree.project.tables[0];
const resourceName = table.tablename;
const modelName = table.tablename
.split('_')
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
.join('');

// Create sample response object
const sampleResponse = {};
for (const field of table.fields) {
if (field.type === 'BIGINT' || field.type === 'INT') {
sampleResponse[field.camelcase] = 1;
} else if (field.type === 'BOOLEAN') {
sampleResponse[field.camelcase] = true;
} else if (field.type === 'DATETIME' || field.type === 'DATE') {
sampleResponse[field.camelcase] = '2024-01-15T10:30:00Z';
} else {
sampleResponse[field.camelcase] = `Sample ${field.caption}`;
}
}

const doc = `# ${modelName} API Documentation

## Endpoints

### GET /${resourceName}
Get all ${resourceName}

**Query Parameters:**
- \`limit\`: Number of records (default: 20)
- \`offset\`: Starting position (default: 0)

**Response:**
\`\`\`json
{
"data": [
${JSON.stringify(sampleResponse, null, 4)}
],
"total": 100,
"page": 1
}
\`\`\`

### GET /${resourceName}/:id
Get a single ${resourceName} by ID

**Response:**
\`\`\`json
{
"data": ${JSON.stringify(sampleResponse, null, 2)}
}
\`\`\`

### POST /${resourceName}
Create a new ${resourceName}

**Request Body:**
\`\`\`json
{
${table.fields
.filter(f => !f.isprimarykey && !f.name.includes('_at'))
.map(f => `"${f.camelcase}": "${f.caption} value"`)
.join(',\n ')}
}
\`\`\`

**Response:**
\`\`\`json
{
"data": ${JSON.stringify(sampleResponse, null, 2)}
}
\`\`\`

### PUT /${resourceName}/:id
Update an existing ${resourceName}

**Request Body:**
Same as POST (all fields optional)

**Response:**
\`\`\`json
{
"data": ${JSON.stringify(sampleResponse, null, 2)}
}
\`\`\`

### DELETE /${resourceName}/:id
Delete a ${resourceName}

**Response:**
\`\`\`
204 No Content
\`\`\`

## Error Responses

\`\`\`json
{
"error": "Error message",
"code": "ERROR_CODE",
"timestamp": "2024-01-15T10:30:00Z"
}
\`\`\`

## Field Descriptions

${table.fields.map(f => `- **${f.camelcase}** (${f.type}): ${f.caption}${f.isnullable ? ' (optional)' : ' (required)'}`).join('\n')}
`;

return doc;
{:codeend:}

Example 10: Complete Authentication Controller (Laravel)

Generate a complete auth controller with registration, login, and logout.

{:code:}
const userTable = gtree.project.tables.find(t => t.tablename === 'users');
if (!userTable) return "// Users table not found";

const model = 'User';

const controller = `<?php

namespace App\\Http\\Controllers;

use App\\Models\\${model};
use Illuminate\\Http\\Request;
use Illuminate\\Support\\Facades\\Hash;
use Illuminate\\Support\\Facades\\Validator;

class AuthController extends Controller
{
/**
* User registration
*/
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
'first_name' => 'required|string',
'last_name' => 'required|string'
]);

if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}

$user = ${model}::create([
'email' => $request->email,
'password' => Hash::make($request->password),
'first_name' => $request->first_name,
'last_name' => $request->last_name
]);

return response()->json(['message' => 'User registered successfully', 'data' => $user], 201);
}

/**
* User login
*/
public function login(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'password' => 'required'
]);

if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}

$user = ${model}::where('email', $request->email)->first();

if (!$user || !Hash::check($request->password, $user->password)) {
return response()->json(['message' => 'Invalid credentials'], 401);
}

$token = $user->createToken('auth_token')->plainTextToken;

return response()->json([
'message' => 'Login successful',
'token' => $token,
'user' => $user
]);
}

/**
* User logout
*/
public function logout(Request $request)
{
$request->user()->currentAccessToken()->delete();

return response()->json(['message' => 'Logged out successfully']);
}

/**
* Get authenticated user
*/
public function profile(Request $request)
{
return response()->json(['user' => $request->user()]);
}
}
`;

return controller;
{:codeend:}

Tips for Writing Powerful Templates

:::tip Start Simple, Build Complex Begin with accessing single properties, then nest loops, then add conditionals. Test each level before combining. :::

:::info Use Helper Functions Break repetitive logic into smaller functions for reusability:

const toPascalCase = (str) =>
str.split('_').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join('');
const toCamelCase = (str) =>
str.charAt(0).toLowerCase() + toPascalCase(str).slice(1);

:::

:::tip Comment Your Code When templates get complex, add comments explaining what each section does:

{:code:}
// Get the first table
const table = gtree.project.tables[0];

// Filter non-primary-key fields
const fields = table.fields.filter(f => !f.isprimarykey);

// Generate field list
const fieldList = fields.map(f => f.name).join(', ');
{:codeend:}

:::

:::caution Handle Edge Cases Always check for empty arrays and missing properties:

const fields = table.fields || [];
if (fields.length === 0) return "// No fields found";

:::


Next Steps