Masamune Model FirebaseDataConnect
[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 annotationsmasamune_model_firebase_data_connect_builder(this package) - Generates codemasamune_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 generateafter any model changes - Review generated GraphQL files before deploying
- Use
@FirebaseDataConnectAdapterfor 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!
Libraries
- masamune_model_firebase_data_connect_builder
- Define a builder to describe Firestore rules; build using the masamune_annotation annotation.