gbaas_sdk 1.0.0
gbaas_sdk: ^1.0.0 copied to clipboard
Dart/Flutter SDK for BaaS (Backend as a Service) - A complete Supabase alternative with auth, database, storage, realtime, functions, and admin APIs.
BaaS SDK for Dart/Flutter #
Official Dart/Flutter SDK for BaaS (Backend as a Service).
Installation #
Add to your pubspec.yaml:
dependencies:
baas_sdk:
path: ../sdk-dart # Local path
# or from git:
# git:
# url: https://github.com/giaeulate/baas-golang-1.git
# path: sdk-dart
Quick Start #
import 'package:baas_sdk/baas_sdk.dart';
final baas = BaasClient(
baseUrl: 'http://localhost:8086',
projectId: 'your-project-id',
);
// Login
await baas.auth.login(email: 'user@example.com', password: 'password');
// Query data
final users = await baas.from('users').select().get();
// Insert data
await baas.from('posts').insert({'title': 'Hello', 'content': 'World'});
// Subscribe to realtime changes
baas.realtime.subscribe('posts', (event) {
print('Change: ${event.type} - ${event.data}');
});
Modules #
Authentication #
// Register
final session = await baas.auth.register(
email: 'new@example.com',
password: 'password123',
);
// Login
final session = await baas.auth.login(
email: 'user@example.com',
password: 'password',
);
// MFA Setup
final mfaSetup = await baas.auth.setupMfa();
print('Secret: ${mfaSetup.secret}');
print('QR Code: ${mfaSetup.qrCode}');
// Enable MFA
await baas.auth.enableMfa(code: '123456');
// Password Reset
await baas.auth.forgotPassword(email: 'user@example.com');
await baas.auth.resetPassword(token: 'reset-token', newPassword: 'newpass');
// Logout
await baas.auth.logout();
Database #
// Query with filters
final posts = await baas.from('posts')
.select()
.eq('status', 'published')
.gte('created_at', '2024-01-01')
.orderDesc('created_at')
.limit(10)
.get();
// Get single record
final post = await baas.from('posts').getById('post-id');
// Insert
final newPost = await baas.from('posts').insert({
'title': 'New Post',
'content': 'Content here',
});
// Update
await baas.from('posts').update('post-id', {
'title': 'Updated Title',
});
// Delete
await baas.from('posts').delete('post-id');
// Raw SQL (admin only)
final results = await baas.database.executeRawSql('SELECT * FROM users LIMIT 10');
Filter Operators
.eq('column', value) // =
.neq('column', value) // !=
.gt('column', value) // >
.gte('column', value) // >=
.lt('column', value) // <
.lte('column', value) // <=
.like('column', '%pattern%')
.ilike('column', '%pattern%') // case insensitive
.isNull('column')
.isNotNull('column')
.inList('column', [1, 2, 3])
Storage #
// Create bucket
final bucket = await baas.storage.createBucket(
name: 'avatars',
isPublic: true,
);
// Upload file
final result = await baas.storage.upload(
bucket: 'avatars',
path: 'user123/avatar.png',
bytes: fileBytes,
filename: 'avatar.png',
);
// List files
final files = await baas.storage.listFiles(bucketId: 'avatars');
// Get download URL
final url = await baas.storage.getPresignedUrl(
fileId: 'file-id',
expiresIn: 3600, // 1 hour
);
// Delete file
await baas.storage.deleteFile('file-id');
Realtime #
// Connect (auto-connects on first subscription)
await baas.realtime.connect();
// Subscribe to all changes
final sub = baas.realtime.subscribe('posts', (event) {
print('Event: ${event.type}');
print('Table: ${event.table}');
print('Old data: ${event.oldData}');
print('New data: ${event.newData}');
});
// Subscribe to specific events
baas.realtime.onInsert('posts', (event) => print('New post!'));
baas.realtime.onUpdate('posts', (event) => print('Post updated!'));
baas.realtime.onDelete('posts', (event) => print('Post deleted!'));
// Connection state
baas.realtime.onConnectionStateChange = (state) {
print('Connection: $state');
};
// Unsubscribe
sub.unsubscribe();
// Disconnect
baas.realtime.disconnect();
Edge Functions #
// Execute function
final result = await baas.functions.invoke(
'function-id',
body: {'key': 'value'},
);
if (result.isSuccess) {
print('Result: ${result.data}');
} else {
print('Error: ${result.error}');
}
// List functions
final functions = await baas.functions.list();
// Create function
await baas.functions.create(
name: 'my-function',
code: 'return { message: "Hello!" };',
);
Flutter Integration #
Provider Setup #
// main.dart
import 'package:flutter/material.dart';
import 'package:baas_sdk/baas_sdk.dart';
final baas = BaasClient(
baseUrl: 'http://10.0.2.2:8086', // Android emulator localhost
projectId: 'your-project-id',
);
void main() {
runApp(MyApp());
}
With Riverpod #
final baasProvider = Provider((ref) => BaasClient(
baseUrl: 'http://10.0.2.2:8086',
projectId: 'your-project-id',
));
final authProvider = StreamProvider((ref) {
final baas = ref.watch(baasProvider);
// Return auth state stream
});
final postsProvider = FutureProvider((ref) async {
final baas = ref.watch(baasProvider);
return baas.from('posts').select().get();
});
Persist Session #
import 'package:shared_preferences/shared_preferences.dart';
// Save token after login
final session = await baas.auth.login(email: email, password: password);
final prefs = await SharedPreferences.getInstance();
await prefs.setString('access_token', session.accessToken);
// Restore on app start
final prefs = await SharedPreferences.getInstance();
final token = prefs.getString('access_token');
if (token != null) {
await baas.auth.restoreSession(token);
}
Error Handling #
try {
await baas.auth.login(email: email, password: password);
} on AuthException catch (e) {
if (e.data?['mfa_required'] == true) {
// Handle MFA
Navigator.push(context, MfaScreen(tempToken: e.data['temp_token']));
} else {
print('Auth error: ${e.message}');
}
} on ValidationException catch (e) {
print('Validation error: ${e.errors}');
} on BaasException catch (e) {
print('Error: ${e.message} (${e.statusCode})');
}
License #
MIT