Masamune logo

Masamune Model FirebaseDataConnect

Follow on GitHub Follow on X Follow on YouTube Maintained with Melos

GitHub Sponsor


[GitHub](https://github.com/mathrunet) | [YouTube](https://www.youtube.com/c/mathrunetchannel) | [Packages](https://pub.dev/publishers/mathru.net/packages) | [X](https://x.com/mathru) | [LinkedIn](https://www.linkedin.com/in/mathrunet/) | [mathru.net](https://mathru.net)


Masamune Model Firebase Data Connect Builder

Overview

masamune_model_firebase_data_connect_builder is a code generator that creates GraphQL schemas, queries, mutations, and adapters for Firebase Data Connect from your annotated Masamune models.

Package Roles:

  • masamune_model_firebase_data_connect_annotation - Provides annotations
  • masamune_model_firebase_data_connect_builder (this package) - Generates code
  • masamune_model_firebase_data_connect - Runtime adapter implementation

Usage

Installation

Add as a development dependency:

flutter pub add masamune_model_firebase_data_connect
flutter pub add masamune_model_firebase_data_connect_annotation
flutter pub add --dev masamune_model_firebase_data_connect_builder
flutter pub add --dev build_runner

Annotate Your Models

Add @firebaseDataConnect and permission settings to your Masamune models:

import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:masamune/masamune.dart';
import 'package:masamune_model_firebase_data_connect_annotation/masamune_model_firebase_data_connect_annotation.dart';

part 'user.m.dart';
part 'user.g.dart';
part 'user.freezed.dart';
part 'user.dataconnect.dart';  // Generated by this builder

@freezed
@formValue
@immutable
@firebaseDataConnect  // Enable Data Connect generation
@CollectionModelPath(
  'user',
  permission: [
    AllowReadModelPermissionQuery.allUsers(),   // All users can read
    AllowWriteModelPermissionQuery.allUsers(),  // All users can write
  ],
)
class UserModel with _$UserModel {
  const factory UserModel({
    required String name,
    @Default('') String email,
    @Default(ModelTimestamp.now()) ModelTimestamp createdAt,
  }) = _UserModel;

  const UserModel._();

  factory UserModel.fromJson(Map<String, Object?> json) => _$UserModelFromJson(json);

  static const document = _$UserModelDocumentQuery();
  static const collection = _$UserModelCollectionQuery();
}

Run the Generator

Execute the code generator:

katana code generate

Generated Files

The builder creates the following files in firebase/dataconnect/:

GraphQL Schema (schema.gql):

type User @table {
  id: String!
  name: String!
  email: String!
  createdAt: Timestamp!
}

Queries (queries.gql):

query getUserById($id: String!) @auth(level: USER) {
  user(id: $id) {
    id
    name
    email
    createdAt
  }
}

query listUsers @auth(level: USER) {
  users {
    id
    name
    email
  }
}

Mutations (mutations.gql):

mutation createUser($id: String!, $name: String!, $email: String!) @auth(level: USER) {
  user_insert(data: {
    id: $id
    name: $name
    email: $email
  })
}

Connector Configuration (connector.yaml):

connectorId: default
generate:
  dartSdk:
    outputDir: ../lib/generated

Adapter (user.dataconnect.dart):

part of 'user.dart';

mixin _$UserModelFirebaseDataConnectAdapter 
    on FirebaseDataConnectModelAdapterBase {
  // Generated adapter implementation
}

Deploy to Firebase

Deploy the generated files to Firebase Data Connect:

# Deploy schema and queries
firebase deploy --only dataconnect

# Or use Firebase CLI
firebase dataconnect:deploy

Configuration

Customize generation in build.yaml:

targets:
  $default:
    builders:
      masamune_model_firebase_data_connect_builder:
        options:
          output_directory: "firebase/dataconnect"
          connector_id: "my-connector"

Tips

  • Run katana code generate after any model changes
  • Review generated GraphQL files before deploying
  • Use @FirebaseDataConnectAdapter for custom configuration
  • Test queries with Firebase Data Connect Studio
  • Keep schema files in version control

GitHub Sponsors

Sponsors are always welcome. Thank you for your support!

https://github.com/sponsors/mathrunet

Libraries

masamune_model_firebase_data_connect_builder
Define a builder to describe Firestore rules; build using the masamune_annotation annotation.