kombu_flutter_schema 1.0.1
kombu_flutter_schema: ^1.0.1 copied to clipboard
KOMBU IoT System - GraphQL Schema for Flutter/Dart
kombu_flutter_schema #
KOMBU IoT System - GraphQL Schema for Flutter/Dart
📋 Overview #
This package provides GraphQL schema definitions, models, queries, mutations, and subscriptions for the KOMBU IoT System. It's designed to work with AWS Amplify Flutter.
📦 Installation #
Add this to your package's pubspec.yaml file:
dependencies:
kombu_flutter_schema: ^1.0.0
amplify_flutter: ^2.7.0
amplify_api: ^2.7.0
amplify_auth_cognito: ^2.7.0
Then run:
flutter pub get
🚀 Usage #
Import #
import 'package:kombu_flutter_schema/kombu_flutter_schema.dart';
import 'package:amplify_flutter/amplify_flutter.dart';
import 'package:amplify_api/amplify_api.dart';
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
Setup Amplify #
import 'package:amplify_flutter/amplify_flutter.dart';
import 'package:amplify_api/amplify_api.dart';
import 'package:amplify_auth_cognito/amplify_auth_cognito.dart';
// Configure Amplify
await Amplify.addPlugins([
AmplifyAPI(),
AmplifyAuthCognito(),
]);
await Amplify.configure(amplifyconfig);
Use Models #
// Parse JSON to User model
final userJson = {
'id': 'user-123',
'userId': 'user-123',
'username': 'johndoe',
'email': 'john@example.com',
'fullName': 'John Doe',
'role': 'user',
'status': 'active',
};
final user = User.fromJson(userJson);
// Convert User to JSON
final json = user.toJson();
🔍 Queries #
User Queries #
List Users
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final request = ModelQueries.list(
User.classType,
where: User.EMAIL.contains('example.com'),
limit: 10,
);
final response = await Amplify.API.query(request: request).response;
final users = response.data?.items;
if (users != null) {
print('Users: $users');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Get User
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final request = ModelQueries.get(
User.classType,
UserModelIdentifier(id: 'user-id-here'),
);
final response = await Amplify.API.query(request: request).response;
final user = response.data;
if (user != null) {
print('User: $user');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Device Queries #
List Devices
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final request = ModelQueries.list(
Device.classType,
where: Device.USER_ID.eq('user-id-here'),
limit: 20,
);
final response = await Amplify.API.query(request: request).response;
final devices = response.data?.items;
if (devices != null) {
print('Devices: $devices');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Get Device
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final request = ModelQueries.get(
Device.classType,
DeviceModelIdentifier(id: 'device-id-here'),
);
final response = await Amplify.API.query(request: request).response;
final device = response.data;
if (device != null) {
print('Device: $device');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Device Telemetry Queries #
List Telemetry
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final request = ModelQueries.list(
DeviceTelemetry.classType,
where: DeviceTelemetry.DEVICE_ID.eq('device-id-here'),
limit: 100,
);
final response = await Amplify.API.query(request: request).response;
final telemetry = response.data?.items;
if (telemetry != null) {
print('Telemetry: $telemetry');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Notification Queries #
List Notifications
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final request = ModelQueries.list(
Notification.classType,
where: Notification.USER_ID.eq('user-id-here'),
limit: 50,
);
final response = await Amplify.API.query(request: request).response;
final notifications = response.data?.items;
if (notifications != null) {
print('Notifications: $notifications');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
✏️ Mutations #
User Mutations #
Create User
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final user = User(
userId: 'user-123',
username: 'johndoe',
email: 'john@example.com',
phoneNumber: '+84123456789',
fullName: 'John Doe',
role: 'user',
status: 'active',
);
final request = ModelMutations.create(user);
final response = await Amplify.API.mutate(request: request).response;
final createdUser = response.data;
if (createdUser != null) {
print('User created: $createdUser');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Update User
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final user = User(
id: 'user-id-here',
fullName: 'John Doe Updated',
status: 'active',
);
final request = ModelMutations.update(user);
final response = await Amplify.API.mutate(request: request).response;
final updatedUser = response.data;
if (updatedUser != null) {
print('User updated: $updatedUser');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Delete User
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final user = User(id: 'user-id-here');
final request = ModelMutations.delete(user);
final response = await Amplify.API.mutate(request: request).response;
final deletedUser = response.data;
if (deletedUser != null) {
print('User deleted: $deletedUser');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Device Mutations #
Create Device
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final device = Device(
deviceId: 'ESP32-ABC123',
userId: 'user-id-here',
deviceName: 'Living Room Heater',
deviceType: 'kombu-brewer',
location: 'Living Room',
status: 'online',
firmwareVersion: '1.0.0',
hardwareVersion: '1.0',
wifiConnected: true,
);
final request = ModelMutations.create(device);
final response = await Amplify.API.mutate(request: request).response;
final createdDevice = response.data;
if (createdDevice != null) {
print('Device created: $createdDevice');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Update Device
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final device = Device(
id: 'device-id-here',
status: 'offline',
lastSeen: TemporalDateTime.now(),
);
final request = ModelMutations.update(device);
final response = await Amplify.API.mutate(request: request).response;
final updatedDevice = response.data;
if (updatedDevice != null) {
print('Device updated: $updatedDevice');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Delete Device
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final device = Device(id: 'device-id-here');
final request = ModelMutations.delete(device);
final response = await Amplify.API.mutate(request: request).response;
final deletedDevice = response.data;
if (deletedDevice != null) {
print('Device deleted: $deletedDevice');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
Device Telemetry Mutations #
Create Telemetry
import 'package:amplify_flutter/amplify_flutter.dart';
try {
final telemetry = DeviceTelemetry(
telemetryId: 'telemetry-123',
deviceId: 'device-id-here',
temperatureF1: 75.5,
temperatureF2: 72.3,
heaterF1Status: true,
heaterF2Status: false,
connectivityStatus: 'connected',
timestamp: TemporalDateTime.now(),
);
final request = ModelMutations.create(telemetry);
final response = await Amplify.API.mutate(request: request).response;
final createdTelemetry = response.data;
if (createdTelemetry != null) {
print('Telemetry created: $createdTelemetry');
}
} on ApiException catch (e) {
print('Error: ${e.message}');
}
📡 Subscriptions #
User Subscriptions #
Subscribe to User Creation
import 'package:amplify_flutter/amplify_flutter.dart';
final subscription = Amplify.API.onSubscription(
request: ModelSubscriptions.onCreate(User.classType),
);
subscription.listen((event) {
if (event.hasError) {
print('Subscription error: ${event.error}');
} else {
final user = event.data;
print('User created: $user');
}
});
Subscribe to User Updates
import 'package:amplify_flutter/amplify_flutter.dart';
final subscription = Amplify.API.onSubscription(
request: ModelSubscriptions.onUpdate(User.classType),
);
subscription.listen((event) {
if (event.hasError) {
print('Subscription error: ${event.error}');
} else {
final user = event.data;
print('User updated: $user');
}
});
Subscribe to User Deletion
import 'package:amplify_flutter/amplify_flutter.dart';
final subscription = Amplify.API.onSubscription(
request: ModelSubscriptions.onDelete(User.classType),
);
subscription.listen((event) {
if (event.hasError) {
print('Subscription error: ${event.error}');
} else {
final user = event.data;
print('User deleted: $user');
}
});
Device Subscriptions #
Subscribe to Device Creation
import 'package:amplify_flutter/amplify_flutter.dart';
final subscription = Amplify.API.onSubscription(
request: ModelSubscriptions.onCreate(Device.classType),
);
subscription.listen((event) {
if (event.hasError) {
print('Subscription error: ${event.error}');
} else {
final device = event.data;
print('Device created: $device');
}
});
Subscribe to Device Updates
import 'package:amplify_flutter/amplify_flutter.dart';
final subscription = Amplify.API.onSubscription(
request: ModelSubscriptions.onUpdate(Device.classType),
);
subscription.listen((event) {
if (event.hasError) {
print('Subscription error: ${event.error}');
} else {
final device = event.data;
print('Device updated: $device');
}
});
Notification Subscriptions #
Subscribe to Notification Creation
import 'package:amplify_flutter/amplify_flutter.dart';
final subscription = Amplify.API.onSubscription(
request: ModelSubscriptions.onCreate(Notification.classType),
);
subscription.listen((event) {
if (event.hasError) {
print('Subscription error: ${event.error}');
} else {
final notification = event.data;
print('New notification: $notification');
}
});
📦 Models #
User Model #
class User {
final String id;
final String userId;
final String username;
final String email;
final String? phoneNumber;
final String? fullName;
final String? role;
final String? status;
final TemporalDateTime? lastLogin;
final String? deviceToken;
final Map<String, dynamic>? notificationPreferences;
final Map<String, dynamic>? appSettings;
final TemporalDateTime? createdAt;
final TemporalDateTime? updatedAt;
final String? owner;
// fromJson, toJson methods
}
Device Model #
class Device {
final String id;
final String deviceId;
final String userId;
final String deviceName;
final String? deviceType;
final String? location;
final String? status;
final String? firmwareVersion;
final String? hardwareVersion;
final String? iotThingArn;
final bool? wifiConnected;
final String? bleAddress;
final TemporalDateTime? lastSeen;
final TemporalDateTime? createdAt;
final TemporalDateTime? updatedAt;
final String? owner;
// fromJson, toJson methods
}
DeviceTelemetry Model #
class DeviceTelemetry {
final String id;
final String telemetryId;
final String deviceId;
final double? temperatureF1;
final double? temperatureF2;
final bool? heaterF1Status;
final bool? heaterF2Status;
final String? connectivityStatus;
final TemporalDateTime timestamp;
final TemporalDateTime? createdAt;
final TemporalDateTime? updatedAt;
final String? owner;
// fromJson, toJson methods
}
🔑 Authorization #
Access Control #
- Owner Access: Users can CRUD their own resources (userId matches authenticated user's ID)
- Admin Role: Members of 'admin' group have read/update access to all resources
- Authenticated Users: Can read own data and create new resources
- Guest Users: Limited read access (firmware, public assets)
Authorization Modes #
- Default:
userPool(Cognito User Pool) - API Key: Available for 30 days (for testing)
📝 Model Relationships #
- User → Devices (one-to-many)
- User → Notifications (one-to-many)
- Device → User (many-to-one, owner)
- Device → DeviceTelemetry (one-to-many)
- Device → DeviceConfiguration (one-to-many)
- Device → Timer (one-to-many)
- Device → Alert (one-to-many)
- Device → Notification (one-to-many)
- Notification → User (many-to-one)
- Notification → Device (many-to-one)
🐛 Error Handling #
All GraphQL operations return exceptions if something goes wrong:
try {
final request = ModelQueries.get(
User.classType,
UserModelIdentifier(id: 'user-id'),
);
final response = await Amplify.API.query(request: request).response;
print('Data: ${response.data}');
} on ApiException catch (e) {
print('API Error: ${e.message}');
print('Error details: ${e.errors}');
} catch (e) {
print('Unexpected error: $e');
}
📚 Additional Resources #
📄 License #
MIT