twonly-app/lib/src/database/tables/groups.table.dart
2025-11-03 16:54:49 +01:00

110 lines
3.7 KiB
Dart

import 'package:drift/drift.dart';
import 'package:twonly/src/database/tables/contacts.table.dart';
const int defaultDeleteMessagesAfterMilliseconds = 1000 * 60 * 60 * 24;
@DataClassName('Group')
class Groups extends Table {
TextColumn get groupId => text()();
BoolColumn get isGroupAdmin => boolean().withDefault(const Constant(false))();
BoolColumn get isDirectChat => boolean().withDefault(const Constant(false))();
BoolColumn get pinned => boolean().withDefault(const Constant(false))();
BoolColumn get archived => boolean().withDefault(const Constant(false))();
BoolColumn get joinedGroup => boolean().withDefault(const Constant(false))();
BoolColumn get leftGroup => boolean().withDefault(const Constant(false))();
BoolColumn get deletedContent =>
boolean().withDefault(const Constant(false))();
IntColumn get stateVersionId => integer().withDefault(const Constant(0))();
BlobColumn get stateEncryptionKey => blob().nullable()();
BlobColumn get myGroupPrivateKey => blob().nullable()();
TextColumn get groupName => text()();
IntColumn get totalMediaCounter => integer().withDefault(const Constant(0))();
BoolColumn get alsoBestFriend =>
boolean().withDefault(const Constant(false))();
IntColumn get deleteMessagesAfterMilliseconds => integer()
.withDefault(const Constant(defaultDeleteMessagesAfterMilliseconds))();
DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();
DateTimeColumn get lastMessageSend => dateTime().nullable()();
DateTimeColumn get lastMessageReceived => dateTime().nullable()();
DateTimeColumn get lastFlameCounterChange => dateTime().nullable()();
DateTimeColumn get lastFlameSync => dateTime().nullable()();
IntColumn get flameCounter => integer().withDefault(const Constant(0))();
IntColumn get maxFlameCounter => integer().withDefault(const Constant(0))();
DateTimeColumn get maxFlameCounterFrom => dateTime().nullable()();
DateTimeColumn get lastMessageExchange =>
dateTime().withDefault(currentDateAndTime)();
@override
Set<Column> get primaryKey => {groupId};
}
enum MemberState { normal, admin, leftGroup }
@DataClassName('GroupMember')
class GroupMembers extends Table {
TextColumn get groupId =>
text().references(Groups, #groupId, onDelete: KeyAction.cascade)();
IntColumn get contactId => integer().references(Contacts, #userId)();
TextColumn get memberState => textEnum<MemberState>().nullable()();
BlobColumn get groupPublicKey => blob().nullable()();
DateTimeColumn get lastMessage => dateTime().nullable()();
DateTimeColumn get createdAt => dateTime().withDefault(currentDateAndTime)();
@override
Set<Column> get primaryKey => {groupId, contactId};
}
enum GroupActionType {
createdGroup,
removedMember,
addMember,
leftGroup,
promoteToAdmin,
demoteToMember,
updatedGroupName,
}
@DataClassName('GroupHistory')
class GroupHistories extends Table {
TextColumn get groupHistoryId => text()();
TextColumn get groupId =>
text().references(Groups, #groupId, onDelete: KeyAction.cascade)();
IntColumn get contactId =>
integer().nullable().references(Contacts, #userId)();
IntColumn get affectedContactId =>
integer().nullable().references(Contacts, #userId)();
TextColumn get oldGroupName => text().nullable()();
TextColumn get newGroupName => text().nullable()();
TextColumn get type => textEnum<GroupActionType>()();
DateTimeColumn get actionAt => dateTime().withDefault(currentDateAndTime)();
@override
Set<Column> get primaryKey => {groupHistoryId};
}
GroupActionType? groupActionTypeFromString(String name) {
for (final v in GroupActionType.values) {
if (v.name == name) return v;
}
return null;
}