dartapi 0.1.15
dartapi: ^0.1.15 copied to clipboard
DartAPI is a CLI-driven project generator and toolset for building typed REST APIs in Dart.
DartAPI CLI #
DartAPI is a modular and developer-friendly CLI tool for building robust, typed REST APIs using the Dart language.
Rather than acting as a heavy, opinionated framework, DartAPI provides powerful code generation tools that let you build scalable backend applications with clean architecture, JWT authentication, request validation, and PostgreSQL/MySQL support.
๐ฆ What It Does #
- โ
Project scaffolding (
dartapi create) - โ
Controller generation (
dartapi generate controller) - โ
Hot-reload style dev server with keyboard controls (
dartapi run) - โ Integrated with:
๐ Installation #
Activate globally:
dart pub global activate dartapi
๐ CLI Commands #
dartapi create <project_name> #
Creates a full DartAPI project with:
bin/main.dart- Controllers (
UserController,AuthController,ProductController) - Middleware (
logging,auth) - JWT setup with
dartapi_auth - DB support with
dartapi_db - DTOs and validation helpers
- Auto schema definitions for future Swagger support
There are no additional items we need to required to run the generated project.
Note: that this is not mandatory. You can remove the product controller and DB related code from
the main.dart file if you don't need it.
But if you want to use the product controller, you need to install the postgres DB.
๐ง Step 1: Install PostgreSQL
โ On macOS (using Homebrew):
brew install postgresql@14
brew services start postgresql@14
โ On Ubuntu / Debian:
sudo apt update
sudo apt install postgresql postgresql-contrib
sudo systemctl enable postgresql
sudo systemctl start postgresql
โ On Windows:
โข Download the PostgreSQL installer from: https://www.postgresql.org/download/windows/
โข Use the graphical installer to complete the setup.
๐ฆ Step 2: Create a Database
Run the following commands in your terminal or psql:
psql postgres
Then in the psql prompt:
CREATE DATABASE dartapi_test;
CREATE USER dartuser WITH ENCRYPTED PASSWORD 'postgres';
GRANT ALL PRIVILEGES ON DATABASE dartapi_test TO dartuser;
Update your DbConfig in main.dart as per your configuration:
dartapi generate controller <Name> #
Adds a controller to an existing DartAPI project:
dartapi generate controller Product
Generates lib/src/controllers/product_controller.dart with GET and POST methods and proper typing.
dartapi run --port <port> #
Runs your DartAPI server using bin/main.dart.
You can control it interactively:
- Type
:qto quit - Type
rto reload
dartapi run --port=8080
โถ๏ธ Running a Generated Project #
After scaffolding, follow these steps to get the server running:
1. Create and enter your project
dartapi create my_app
cd my_app
2. Install dependencies
dart pub get
3. (Optional) Set up the database
If you want to use ProductController, make sure PostgreSQL is running and update the DbConfig in bin/main.dart with your credentials:
final config = const DbConfig(
type: DbType.postgres,
host: 'localhost',
port: 5432,
database: 'dartapi_test',
username: 'postgres',
password: 'yourpassword', // โ change this
poolConfig: PoolConfig(maxConnections: 10),
);
Then create the products table:
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC(10, 2) NOT NULL,
quantity INTEGER NOT NULL
);
If you don't need DB support, remove ProductController from main.dart and delete product_controller.dart.
4. Start the server
dartapi run --port=8080
You should see:
๐ Server running on http://localhost:8080
๐งช Testing with Postman #
The generated project includes three controllers with the following endpoints. Import the requests below into Postman to test them.
Auth endpoints #
POST /auth/login
Returns a JWT access token and refresh token.
- URL:
http://localhost:8080/auth/login - Method: POST
- Body (raw JSON):
{
"username": "admin@mail.com",
"password": "1234"
}
- Response:
{
"accessToken": "<jwt_access_token>",
"refreshToken": "<jwt_refresh_token>"
}
Copy the accessToken value โ you'll need it as a Bearer token for protected routes.
POST /auth/refresh
Exchanges a valid refresh token for a new access token.
- URL:
http://localhost:8080/auth/refresh - Method: POST
- Body (x-www-form-urlencoded):
| Key | Value |
|---|---|
refresh_token |
<your_refresh_token> |
- Response:
{
"access_token": "<new_jwt_access_token>"
}
User endpoints #
GET /users
Returns a list of users. Requires authentication.
- URL:
http://localhost:8080/users - Method: GET
- Headers:
| Key | Value |
|---|---|
Authorization |
Bearer <access_token> |
- Response:
["Christy", "Akash"]
POST /users
Creates a new user.
- URL:
http://localhost:8080/users - Method: POST
- Body (raw JSON):
{
"name": "Jane",
"age": 28,
"email": "jane@example.com"
}
- Response:
User Jane created
Product endpoints #
Requires a running PostgreSQL database with the
productstable created (see setup above).
All product endpoints require an Authorization: Bearer <access_token> header.
GET /products
Returns all products from the database.
- URL:
http://localhost:8080/products - Method: GET
- Headers:
| Key | Value |
|---|---|
Authorization |
Bearer <access_token> |
- Response:
[
{ "id": 1, "name": "Keyboard", "price": 29.99, "quantity": 15 }
]
POST /products
Inserts a new product into the database.
- URL:
http://localhost:8080/products - Method: POST
- Headers:
| Key | Value |
|---|---|
Authorization |
Bearer <access_token> |
- Body (raw JSON):
ain
- Response:
{ "id": 1, "name": "Keyboard", "price": 29.99, "quantity": 15 }
Suggested Postman flow #
- Call
POST /auth/loginโ copyaccessToken - Set a Postman environment variable
token=<accessToken> - Use
Authorization: Bearer {{token}}in all protected requests - Call
POST /productsto insert a product, thenGET /productsto verify
๐งฑ Generated Project Structure #
my_app/
โโโ bin/
โ โโโ main.dart
โโโ lib/
โ โโโ src/
โ โโโ core/ # Server/router setup
โ โโโ controllers/ # UserController, AuthController, etc.
โ โโโ dto/ # DTOs with schema
โ โโโ db/ # DB connection logic
โ โโโ middleware/ # Auth/logging middleware
โ โโโ utils/ # Validation, helpers
โโโ pubspec.yaml
โโโ analysis_options.yaml
โ Why Use DartAPI? #
- Minimal but powerful
- Follows clean architecture principles
- Type-safe routing using
ApiRoute<ApiInput, ApiOutput> - Built-in JWT auth and DB integration
- Ready to extend with OpenAPI/Swagger
Checkout the Medium article for more details.
๐ License #
BSD 3-Clause License ยฉ 2025 Akash G Krishnan
LICENSE
๐ Links #
- ๐ฆ Pub.dev: dartapi
- ๐ ๏ธ GitHub: github.com/akashgk/dartapi