1.3.0 â€Ē Published 8 months ago

@basefloor/api v1.3.0

Weekly downloads
-
License
MIT
Repository
github
Last release
8 months ago

BasefloorAPI

BasefloorAPI is a comprehensive API framework built on Express and MongoDB that provides a minimum viable API setup with built-in authentication, permissions, CRUD operations, and resource management.

âœĻ Key Features

  • 🔐 Built-in Authentication - JWT, permissions, user management
  • 📝 Auto CRUD Operations - Generate REST APIs from model definitions
  • 🚀 Smart Dependencies - Only installs providers you actually use
  • 🗄ïļ MongoDB Integration - Seamless database operations
  • ðŸ“Ļ Multi-Provider Email - SendGrid, Mailgun, Postmark support
  • ðŸĪ– AI Integration - OpenAI, Anthropic, Google AI support
  • 🖞ïļ File Management - Local, S3, Cloudinary storage options
  • 🔒 Security First - Rate limiting, validation, sanitization

🚀 Smart Provider System

BasefloorAPI uses dynamic dependency installation - you only install what you configure:

// Your config determines what gets installed
module.exports = (API) => ({
  email: { provider: 'sendgrid' },    // ✅ Installs sendgrid
  ai: { provider: 'openai' }          // ✅ Installs openai
  // ❌ Does NOT install: mailgun, anthropic, postmark, etc.
})

Benefits:

  • ðŸŠķ Lightweight: ~50% smaller node_modules
  • ⚡ Faster: Quick installs and startup
  • 🔒 Secure: Fewer dependencies, smaller attack surface

Installation

npm install @basefloor/api

Supported Providers

TypeProvidersAuto-Installed
EmailSendGrid, Mailgun, Postmark, NodemailerBased on config
AIOpenAI, Anthropic, Google GeminiBased on config
StorageAWS S3, Cloudinary, LocalBased on config
DatabaseMongoDB, MongooseAlways included

Features

  • 🔐 Built-in Authentication & JWT
  • ðŸ‘Ĩ User Management & Permissions
  • 📝 CRUD Operations
  • ðŸ“Ļ Email Notifications (Postmark integration)
  • 🗄ïļ MongoDB Integration
  • 🖞ïļ File Management & Image Processing
  • 🎙ïļ Audio-to-Text Transcription
  • 🔄 File Format Conversions
  • 🔒 Security Features
  • ðŸ“ą Phone Number Validation
  • ☁ïļ AWS S3 Integration

Installation

npm install basefloor
# or
yarn add basefloor

System Requirements

The following system dependencies are required:

LibreOffice (for document processing and text-to-image conversion)

# Ubuntu
sudo apt install libreoffice

# Mac
brew install libreoffice

Ghostscript (for PDF processing)

# Mac
brew install ghostscript

# Ubuntu
sudo apt-get install ghostscript

Google Cloud SDK (for audio transcription)

To use the audio transcription features, you'll need Google Cloud credentials:

  1. Create a Google Cloud project and enable the Speech-to-Text API
  2. Create a service account with access to the Speech-to-Text API
  3. Download the service account key file (JSON)

These need to be installed before running npm install or yarn.

Quick Start

  1. Create a new project and install Basefloor:
mkdir my-api
cd my-api
npm init -y
npm install basefloor
  1. Create a configuration file (basefloor.config.js):
module.exports = (API) => {
  return {
    mongodb: {
      uri: 'your-mongodb-uri',
    },
    jwt: {
      secret: 'your-jwt-secret',
    },
    // For audio transcription
    transcription: {
      enabled: true,
      provider: '@google/transcription',
    },
    providers: {
      '@google/transcription': {
        keyFilename: '/path/to/your-google-credentials.json',
      },
    },
    // Add other configurations as needed
  }
}
  1. Create your main file:
const Basefloor = require('basefloor');

const api = new Basefloor({
  config: require('./basefloor.config.js')
});

api.start();

Configuration

Basefloor is configured through a basefloor.config.js file in your project root. Here's a complete configuration reference:

module.exports = (API) => {
  return {
    // API Name
    name: 'Your API Name',

    // Authentication Configuration
    auth: {
      // JWT configuration
      jwt: {
        expirations: {
          auth: '7d',    // Authentication token expiration
          verify: '24h', // Verification token expiration
          reset: '1h'    // Password reset token expiration
        }
      }
    },

    // Database Models Configuration
    models: [
      {
        _name: 'user',           // Model name
        _label: 'Users',         // Display label
        _collection: 'users',    // MongoDB collection name
        _values: {
          // Define model fields with their types and CRUD permissions
          email: ['string', 'c,r,u'],
          password_hash: ['string', 'c,r'],
          email_verified: ['boolean', 'c,r,u'],
          created_at: ['date', 'r'],
          updated_at: ['date', 'r']
        }
      }
    ],

    // Important: When referencing models in foreign key relationships, always use the
    // `_collection` name as the prefix for the foreign key field. For example, if a model
    // has `_collection: 'users'`, other models should reference it as `users_id`, not
    // `UserId` or `User_id`.

    // Routes Configuration
    routes: () => [
      {
        _id: '/users(user)',  // Route pattern
        _create: {
          allow: true         // Permission rules
        },
        _read: {
          allow: true,
          where: '_id'        // URL parameter mapping
        },
        _update: {
          allow: '@_user._id=@user._id'  // Permission rule example
        },
        _delete: {
          allow: false
        }
      }
    ],

    // Notification Configuration
    notifications: {
      email: {
        provider: 'postmark',
        from: 'noreply@yourdomain.com',
        templates: {
          welcomeEmail: 'template-id',
          passwordReset: 'template-id',
          emailVerification: 'template-id'
        }
      }
    },

    // File Storage Configuration
    files: {
      storage: {
        provider: 's3',    // 's3' or 'local'
        s3: {
          bucket: process.env.AWS_BUCKET,
          region: process.env.AWS_REGION
        },
        local: {
          uploadDir: './uploads'
        }
      }
    }
  }
}

Environment Variables

Required environment variables:

# Server
PORT=3000
NODE_ENV=development

# MongoDB
MONGODB_URI=mongodb://localhost:27017/your-database
MONGODB_DATABASE=your-database-name

# Authentication
JWT_SECRET=your-secure-jwt-secret

# AWS S3 (if using S3 storage)
AWS_ACCESS_KEY_ID=your-access-key
AWS_SECRET_ACCESS_KEY=your-secret-key
AWS_REGION=your-region
AWS_BUCKET=your-bucket-name

# Email (if using Postmark)
POSTMARK_SERVER_TOKEN=your-postmark-token

# Application
APP_NAME=Your App Name
APP_URL_VERIFY=https://your-app.com/verify/:token
APP_AUTHOR=Your Name
APP_AUTHOR_EMAIL=your@email.com

Permission Rules

The allow property in routes supports complex permission rules:

// Basic permission
allow: true  // Allow all
allow: false // Deny all

// Compare values
allow: '@_user._id=@user._id'  // Current user matches resource user

// Array membership
allow: 'admin=in=@_user.roles'  // User has admin role

// Logical operations
allow: {
  and: [
    '@_user._id=@user._id',
    'admin=in=@_user.roles'
  ]
}
allow: {
  or: [
    '@_user._id=@user._id',
    'admin=in=@_user.roles'
  ]
}

Features in Detail

Authentication

  • JWT-based authentication
  • Password hashing with bcrypt
  • Two-factor authentication support
  • Password reset functionality
  • Email verification

File Management

  • Image processing with Sharp
  • AWS S3 integration for file storage
  • Document processing capabilities
  • Text-to-image conversion
  • Audio transcription to text

Notifications

  • Email notifications via Postmark
  • Customizable email templates

Database

  • MongoDB integration
  • CRUD operation helpers
  • Query builders
  • Data validation

File Conversion Capabilities

Basefloor provides robust file conversion capabilities:

FromToProvider
Documents (.doc, .docx, etc.)PDFLibreOffice
PDFPNG imagesSharp
ImagesOptimized PNGSharp
Audio files (.mp3, .wav, etc.)Text (.txt)Google Transcription
Text (.txt)Image (.png)LibreOffice

Converting Audio to Text

With Google Cloud Speech-to-Text integration, Basefloor can transcribe audio files:

// Example: Convert an audio file to text
const result = await API.Files.convertFile({
  inType: '.mp3', 
  outType: '.txt',
  inPath: '/path/to/audio.mp3',
  outPath: '/output/directory'
});

Converting Text to Images

Convert plain text files to PNG images:

// Example: Convert a text file to an image
const result = await API.Files.convertFile({
  inType: '.txt', 
  outType: '.png',
  inPath: '/path/to/text.txt',
  outPath: '/output/directory'
});

API Reference

Documentation to be added

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT ÂĐ Haseeb Qureshi (HQ)

Support

For issues and feature requests, please use the GitHub issues page.