Serinus Banner

Serinus Drift

A plugin to add Drift database integration to your Serinus applications 🐤.

Installation

dart pub add serinus_drift

Usage

Add the DriftModule to the imports of your main application module and provide your Drift database instance. You can also use DriftModule.forFeature to register DAOs that depend on the database. Here's a complete example of how to set up a Serinus application with Drift:

import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:serinus/serinus.dart';
import 'package:serinus_drift/serinus_drift.dart';
part 'serinus_drift.g.dart';

class Users extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text()();
}

@DriftDatabase(tables: [Users])
class AppDatabase extends _$AppDatabase {
  AppDatabase(super.e);

  @override
  int get schemaVersion => 1;
}

@DriftAccessor(tables: [Users])
class UsersDao extends DatabaseAccessor<AppDatabase> with _$UsersDaoMixin {
  UsersDao(super.db);

  Future<List<User>> getAllUsers() => select(users).get();
  Future<int> insertUser(UsersCompanion user) => into(users).insert(user);
}

class AppModule extends Module {
  AppModule() : super(
    imports: [
      DriftModule(AppDatabase(NativeDatabase.memory())),
      DriftModule.forFeature<AppDatabase>(
        daos: (database) => [
          UsersDao(database)
        ], 
      ),
    ],
    controllers: [
      UserController()
    ]
  );
}

class UserController extends Controller {
  UserController() : super('/users') {
    
    on(Route.get('/'), (context) async {
      // Inject the feature-specific DAO!
      final usersDao = context.use<UsersDao>();
      // Inject the Drift database
      final db = context.use<AppDatabase>();
      
      // Perform your Drift queries
      final users = await db.select(db.users).get();
      final usersFromDao = await usersDao.getAllUsers();
      
      return {
        'users': users.map((u) => {'id': u.id, 'name': u.name}).toList(),
        'usersFromDao': usersFromDao.map((u) => {'id': u.id, 'name': u.name}).toList(),
      };
    });
    on(Route.post('/'), (RequestContext<Map<String, dynamic>> context) async {
      final usersDao = context.use<UsersDao>();
      final data = context.body;
      final name = data['name'].toString();
      final id = await usersDao.insertUser(UsersCompanion(name: Value(name)));
      return {'id': id, 'name': name};
    });
    
  }
}

Future<void> main() async {
  final app = await serinus.createApplication(
    entrypoint: AppModule(),
  );
  await app.serve();
}

Libraries

serinus_drift