add support for creating rooms

Fixes #81
This commit is contained in:
Henry Hiles 2026-10-15 19:49:04 -04:00
commit ed84410039
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
13 changed files with 540 additions and 66 deletions

View file

@ -0,0 +1,52 @@
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:freezed_annotation/freezed_annotation.dart";
import "package:nexus/models/content/content.dart";
import "package:nexus/models/content/encryption.dart";
part "create_room.freezed.dart";
part "create_room.g.dart";
@Freezed(toJson: false, fromJson: false)
@JsonSerializable(includeIfNull: false)
class const CreateRoomRequest({
final RoomVisibility? visibility,
final String? roomAliasName,
final String? name,
final String? topic,
final IList<String> invite = const IList.empty(),
@JsonKey(name: "uk.timedout.msc4491.invite_reason")
final String? inviteReason,
final IList<InitialStateEvent> initialState = const IList.empty(),
final RoomPreset? preset,
final bool isDirect = false,
final IMap<String, dynamic>? creationContent,
}) with _$CreateRoomRequest {
Map<String, Object?> toJson() => _$CreateRoomRequestToJson(this);
factory CreateRoomRequest.fromJson(Map<String, Object?> json) =>
_$CreateRoomRequestFromJson(json);
}
@Freezed(toJson: false, fromJson: false)
@JsonSerializable()
class const InitialStateEvent({
required final String type,
final String stateKey = "",
required final Content content,
}) with _$InitialStateEvent {
static final encryption = InitialStateEvent(
type: EventType.encryption.type,
content: EncryptionContent(algorithm: "m.megolm.v1.aes-sha2"),
);
Map<String, Object?> toJson() => _$InitialStateEventToJson(this);
factory InitialStateEvent.fromJson(Map<String, Object?> json) =>
_$InitialStateEventFromJson(json);
}
@JsonEnum(fieldRename: .snake)
enum RoomVisibility { public, private }
@JsonEnum(fieldRename: .snake)
enum RoomPreset { privateChat, publicChat, trustedPrivateChat }