boing_data_dpa 0.0.1 copy "boing_data_dpa: ^0.0.1" to clipboard
boing_data_dpa: ^0.0.1 copied to clipboard

Boing Data DPA is a Dart/Flutter package inspired by Spring Data JPA, offering simplified data persistence using annotations. It supports SQLite, PostgreSQL, and MySQL databases.

Boing Data - Dart Persistent API (DPA) 🚀 #

Boing Data DPA is a Dart/Flutter package inspired by Spring Data JPA, offering simplified data persistence using annotations. It supports SQLite, PostgreSQL, and MySQL databases.

Installation 🔧 #

Add the dependency to your pubspec.yaml:

dependencies:
  boing_data_dpa: ^0.0.1
  build_runner: any

Configuration ⚙️ #

Defining the Connection #

The package allows defining connections with different databases. Configure it in application.yaml:

# SQLITE
dpa:
  datasource:
    url: "sqlite:///database.db"

# POSTGRES
dpa:
  datasource:
    url: "postgres://localhost:5432/mydatabase"
    username: "username"
    password: "password"

# MYSQL
dpa:
  datasource:
    url: "mysql://localhost:3306/mydatabase"
    username: "username"
    password: "password"

Or define it directly in the code:

final uri = Uri.parse("sqlite:///database.db");
DpaConnection.connect(uri);

Defining Migrations 📜 #

Create the database/migrations.sql file and define your database schema according to the database type:

--- SQLITE
CREATE TABLE IF NOT EXISTS users (
  id TEXT PRIMARY KEY, -- UUID
  name TEXT NOT NULL,
  surname TEXT NOT NULL,
  email TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL,
  created_at TEXT,
  updated_at TEXT
);

--- MYSQL
CREATE TABLE IF NOT EXISTS users (
  id VARCHAR(36) PRIMARY KEY, -- UUID
  name VARCHAR(200) NOT NULL,
  surname VARCHAR(200) NOT NULL,
  email VARCHAR(200) UNIQUE NOT NULL,
  password VARCHAR(200) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

--- POSTGRES
CREATE TABLE IF NOT EXISTS users (
    id VARCHAR(36) PRIMARY KEY, --UUID
    name VARCHAR(255) NOT NULL,
    surname VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Creating an Entity 🏗️ #

Use annotations to define an entity:

import 'package:boing_data_dpa/boing_data_dpa.dart';

part 'user.g.dart';

@Entity()
@Table(name: "users")
@Data()
class User {
  @Id()
  @GeneratedValue(strategy: GenerationType.UUID)
  late String? id;

  late String name;
  late String surname;
  @Column(unique: true)
  late String email;
  late String password;

  @Column()
  @Temporal(TemporalType.DATE)
  late DateTime createdAt;

  @Column()
  @Temporal(TemporalType.DATE)
  late DateTime updatedAt;
}

Creating a Repository 📦 #

Define a repository to handle entity data:

import 'package:boing_data_dpa/boing_data_dpa.dart';
import '../models/user.dart';

part 'user_repository.g.dart';

abstract class UserRepository extends DpaRepository<User, String> {}

The generated code will automatically implement CRUD methods.

  dart run build_runner build

CRUD Operations 🔄 #

final repository = UserRepositoryImpl();

// Creating a user
final user = User()
  ..name = "John"
  ..surname = "Doe"
  ..email = "john.doe@example.com"
  ..password = "123456"
  ..createdAt = DateTime.now()
  ..updatedAt = DateTime.now();
await repository.save(user);

// Fetching all users
List<User> users = await repository.findAll();

// Fetching a user by ID
User? user = await repository.findById("some-id");

// Updating a user
user?.name = "Jane";
await repository.save(user!);

// Deleting a user
await repository.deleteById("some-id");

REST API Example 🌍 #

Use shelf to expose a CRUD API:

import 'dart:convert';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;
import 'package:boing_data_dpa/boing_data_dpa.dart';
import '../repositories/user_repository.dart';

Future<void> main() async {
  await DpaConnection.connect();
  final repository = UserRepositoryImpl();

  final router = Router()
    ..get('/users', (Request request) async {
      final users = await repository.findAll();
      return Response.ok(json.encode(users.map((u) => u.toMap()).toList()),
          headers: {'Content-Type': 'application/json'});
    })
    ..post('/users', (Request request) async {
      final payload = await request.readAsString();
      final data = jsonDecode(payload) as Map<String, dynamic>;
      final user = User().fromMap(data);
      await repository.save(user);
      return Response(201);
    });

  final handler = Pipeline().addMiddleware(logRequests()).addHandler(router);
  final server = await io.serve(handler, 'localhost', 8080);
  print('Server running at http://${server.address.host}:${server.port}');
}

Conclusion 🎯 #

Boing Data DPA simplifies data persistence in Dart using an annotation-based model and repositories. Feel free to contribute and improve the package! 🚀

1
likes
130
points
35
downloads

Publisher

verified publisherevandersondev.com.br

Weekly Downloads

Boing Data DPA is a Dart/Flutter package inspired by Spring Data JPA, offering simplified data persistence using annotations. It supports SQLite, PostgreSQL, and MySQL databases.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

analyzer, build, cuid2, glob, mysql1, path, postgres, source_gen, sqlite3, uuid, yaml

More

Packages that depend on boing_data_dpa