diff --git a/composeApp/schemas/press.mantra.compose.database.MantraDatabase/6.json b/composeApp/schemas/press.mantra.compose.database.MantraDatabase/6.json deleted file mode 100644 index 0bc3bee3..00000000 --- a/composeApp/schemas/press.mantra.compose.database.MantraDatabase/6.json +++ /dev/null @@ -1,5056 +0,0 @@ -{ - "formatVersion": 1, - "database": { - "version": 6, - "identityHash": "1e573d88b491b8326cd3866f0cd0118b", - "entities": [ - { - "tableName": "BroadcastNostrEventReceipt", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nostrEventId` TEXT NOT NULL, `unsignedNostrEventId` INTEGER, `isAccepted` INTEGER NOT NULL, `isSync` INTEGER NOT NULL, `relayURL` TEXT NOT NULL, `messages` TEXT, FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`unsignedNostrEventId`) REFERENCES `UnsignedNostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "unsignedNostrEventId", - "columnName": "unsignedNostrEventId", - "affinity": "INTEGER" - }, - { - "fieldPath": "isAccepted", - "columnName": "isAccepted", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "isSync", - "columnName": "isSync", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "relayURL", - "columnName": "relayURL", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "messages", - "columnName": "messages", - "affinity": "TEXT" - } - ], - "primaryKey": { - "autoGenerate": true, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_BroadcastNostrEventReceipt_nostrEventId", - "unique": false, - "columnNames": [ - "nostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_BroadcastNostrEventReceipt_nostrEventId` ON `${TABLE_NAME}` (`nostrEventId`)" - }, - { - "name": "index_BroadcastNostrEventReceipt_isAccepted", - "unique": false, - "columnNames": [ - "isAccepted" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_BroadcastNostrEventReceipt_isAccepted` ON `${TABLE_NAME}` (`isAccepted`)" - } - ], - "foreignKeys": [ - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "UnsignedNostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "unsignedNostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "BroadcastNostrEventRequest", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `nostrEventId` TEXT NOT NULL, `unsignedNostrEventId` INTEGER, `status` TEXT NOT NULL, `relayURL` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`unsignedNostrEventId`) REFERENCES `UnsignedNostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "unsignedNostrEventId", - "columnName": "unsignedNostrEventId", - "affinity": "INTEGER" - }, - { - "fieldPath": "status", - "columnName": "status", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayURL", - "columnName": "relayURL", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": true, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_BroadcastNostrEventRequest_nostrEventId", - "unique": false, - "columnNames": [ - "nostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_BroadcastNostrEventRequest_nostrEventId` ON `${TABLE_NAME}` (`nostrEventId`)" - }, - { - "name": "index_BroadcastNostrEventRequest_status", - "unique": false, - "columnNames": [ - "status" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_BroadcastNostrEventRequest_status` ON `${TABLE_NAME}` (`status`)" - } - ], - "foreignKeys": [ - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "UnsignedNostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "unsignedNostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Connection", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`sourcePublicKey` TEXT NOT NULL, `destinationPublicKey` TEXT NOT NULL, `nostrEventId` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`sourcePublicKey`, `destinationPublicKey`), FOREIGN KEY(`sourcePublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`destinationPublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "sourcePublicKey", - "columnName": "sourcePublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "destinationPublicKey", - "columnName": "destinationPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "sourcePublicKey", - "destinationPublicKey" - ] - }, - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "sourcePublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "destinationPublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - } - ] - }, - { - "tableName": "ChatMessage", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `senderPublicKey` TEXT NOT NULL, `isUserMessage` INTEGER NOT NULL, `giftWrapPayloadId` TEXT, `marmotGroupEventId` TEXT, `marmotInnerEventId` TEXT, `chatRoomId` TEXT NOT NULL, `replyToMessageId` INTEGER, `quotedMessageId` INTEGER, `content` TEXT NOT NULL, `messageType` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`giftWrapPayloadId`) REFERENCES `GiftWrapPayload`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`marmotGroupEventId`) REFERENCES `MarmotGroupEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`marmotInnerEventId`) REFERENCES `MarmotInnerEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "senderPublicKey", - "columnName": "senderPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "isUserMessage", - "columnName": "isUserMessage", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "giftWrapPayloadId", - "columnName": "giftWrapPayloadId", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotInnerEventId", - "columnName": "marmotInnerEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "replyToMessageId", - "columnName": "replyToMessageId", - "affinity": "INTEGER" - }, - { - "fieldPath": "quotedMessageId", - "columnName": "quotedMessageId", - "affinity": "INTEGER" - }, - { - "fieldPath": "content", - "columnName": "content", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "messageType", - "columnName": "messageType", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": true, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "GiftWrapPayload", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "giftWrapPayloadId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "MarmotGroupEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "marmotGroupEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "MarmotInnerEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "marmotInnerEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "ChatMessageBroadcastNostrEventRequestRelation", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `chatMessageId` INTEGER NOT NULL, `broadcastNostrEventRequestId` INTEGER NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, FOREIGN KEY(`chatMessageId`) REFERENCES `ChatMessage`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`broadcastNostrEventRequestId`) REFERENCES `BroadcastNostrEventRequest`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "chatMessageId", - "columnName": "chatMessageId", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "broadcastNostrEventRequestId", - "columnName": "broadcastNostrEventRequestId", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": true, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "ChatMessage", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatMessageId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "BroadcastNostrEventRequest", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "broadcastNostrEventRequestId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "ChatMessageBroadcastNostrEventReceiptRelation", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `chatMessageId` INTEGER NOT NULL, `broadcastNostrEventReceiptId` INTEGER NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, FOREIGN KEY(`chatMessageId`) REFERENCES `ChatMessage`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`broadcastNostrEventReceiptId`) REFERENCES `BroadcastNostrEventReceipt`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "chatMessageId", - "columnName": "chatMessageId", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "broadcastNostrEventReceiptId", - "columnName": "broadcastNostrEventReceiptId", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": true, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "ChatMessage", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatMessageId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "BroadcastNostrEventReceipt", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "broadcastNostrEventReceiptId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "ChatMessageNostrEventRelation", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `chatMessageId` INTEGER NOT NULL, `nostrEventId` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, FOREIGN KEY(`chatMessageId`) REFERENCES `ChatMessage`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "chatMessageId", - "columnName": "chatMessageId", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": true, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "ChatMessage", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatMessageId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "ChatRoom", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `userPublicKey` TEXT NOT NULL, `subject` TEXT, `description` TEXT, `mlsGroupState` TEXT, `initialGiftWrapPayloadId` TEXT, `leftGroupAt` INTEGER, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`userPublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`initialGiftWrapPayloadId`) REFERENCES `GiftWrapPayload`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "userPublicKey", - "columnName": "userPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "subject", - "columnName": "subject", - "affinity": "TEXT" - }, - { - "fieldPath": "description", - "columnName": "description", - "affinity": "TEXT" - }, - { - "fieldPath": "mlsGroupState", - "columnName": "mlsGroupState", - "affinity": "TEXT" - }, - { - "fieldPath": "initialGiftWrapPayloadId", - "columnName": "initialGiftWrapPayloadId", - "affinity": "TEXT" - }, - { - "fieldPath": "leftGroupAt", - "columnName": "leftGroupAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "userPublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "GiftWrapPayload", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "initialGiftWrapPayloadId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "DkgParticipantMessage", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`sessionId` TEXT NOT NULL, `participantPublicKey` TEXT NOT NULL, `kind` INTEGER NOT NULL, `payload` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, PRIMARY KEY(`sessionId`, `participantPublicKey`, `kind`), FOREIGN KEY(`sessionId`) REFERENCES `DkgSession`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "sessionId", - "columnName": "sessionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "participantPublicKey", - "columnName": "participantPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "kind", - "columnName": "kind", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "payload", - "columnName": "payload", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "sessionId", - "participantPublicKey", - "kind" - ] - }, - "indices": [ - { - "name": "index_DkgParticipantMessage_sessionId", - "unique": false, - "columnNames": [ - "sessionId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_DkgParticipantMessage_sessionId` ON `${TABLE_NAME}` (`sessionId`)" - } - ], - "foreignKeys": [ - { - "table": "DkgSession", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "sessionId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "DkgSession", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `coordinatorPublicKey` TEXT NOT NULL, `userPublicKey` TEXT NOT NULL, `threshold` INTEGER NOT NULL, `participantCount` INTEGER NOT NULL, `stage` TEXT NOT NULL, `hostPublicKey` TEXT NOT NULL, `round1Random` TEXT NOT NULL, `round2AuxRandom` TEXT NOT NULL, `coordinatorRound1` TEXT, `certificate` TEXT, `thresholdPublicKey` TEXT, `secretShare` TEXT, `recoveryData` TEXT, `failureReason` TEXT, `hostKeyApprovedAt` INTEGER, `round1ApprovedAt` INTEGER, `round2ApprovedAt` INTEGER, `approvalRequestedThrough` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "coordinatorPublicKey", - "columnName": "coordinatorPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "userPublicKey", - "columnName": "userPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "threshold", - "columnName": "threshold", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "participantCount", - "columnName": "participantCount", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "stage", - "columnName": "stage", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "hostPublicKey", - "columnName": "hostPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "round1Random", - "columnName": "round1Random", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "round2AuxRandom", - "columnName": "round2AuxRandom", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "coordinatorRound1", - "columnName": "coordinatorRound1", - "affinity": "TEXT" - }, - { - "fieldPath": "certificate", - "columnName": "certificate", - "affinity": "TEXT" - }, - { - "fieldPath": "thresholdPublicKey", - "columnName": "thresholdPublicKey", - "affinity": "TEXT" - }, - { - "fieldPath": "secretShare", - "columnName": "secretShare", - "affinity": "TEXT" - }, - { - "fieldPath": "recoveryData", - "columnName": "recoveryData", - "affinity": "TEXT" - }, - { - "fieldPath": "failureReason", - "columnName": "failureReason", - "affinity": "TEXT" - }, - { - "fieldPath": "hostKeyApprovedAt", - "columnName": "hostKeyApprovedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "round1ApprovedAt", - "columnName": "round1ApprovedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "round2ApprovedAt", - "columnName": "round2ApprovedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "approvalRequestedThrough", - "columnName": "approvalRequestedThrough", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_DkgSession_chatRoomId", - "unique": false, - "columnNames": [ - "chatRoomId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_DkgSession_chatRoomId` ON `${TABLE_NAME}` (`chatRoomId`)" - } - ], - "foreignKeys": [ - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "GiftWrapMessage", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `kind` INTEGER NOT NULL, `receiverPublicKey` TEXT NOT NULL, `receiverRelayHit` TEXT, `content` TEXT NOT NULL, `signature` TEXT NOT NULL, `nostrEventId` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "kind", - "columnName": "kind", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "receiverPublicKey", - "columnName": "receiverPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "receiverRelayHit", - "columnName": "receiverRelayHit", - "affinity": "TEXT" - }, - { - "fieldPath": "content", - "columnName": "content", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "GiftWrapSeal", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `kind` INTEGER NOT NULL, `tags` TEXT NOT NULL, `content` TEXT NOT NULL, `signature` TEXT NOT NULL, `giftWrapMessageId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`giftWrapMessageId`) REFERENCES `GiftWrapMessage`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "kind", - "columnName": "kind", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "tags", - "columnName": "tags", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "content", - "columnName": "content", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "giftWrapMessageId", - "columnName": "giftWrapMessageId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "GiftWrapMessage", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "giftWrapMessageId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "GiftWrapPayload", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `kind` INTEGER NOT NULL, `tags` TEXT NOT NULL, `content` TEXT NOT NULL, `quotedEventId` TEXT, `giftWrapSealId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`giftWrapSealId`) REFERENCES `GiftWrapSeal`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "kind", - "columnName": "kind", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "tags", - "columnName": "tags", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "content", - "columnName": "content", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "quotedEventId", - "columnName": "quotedEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "giftWrapSealId", - "columnName": "giftWrapSealId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "GiftWrapSeal", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "giftWrapSealId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "InReplyToRelation", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`replyingNostrEventId` TEXT NOT NULL, `inReplyToNostrEventId` TEXT NOT NULL, `inReplyToProfilePublicKey` TEXT, `inReplyToRootNostrEventId` TEXT, `inReplyToRootProfilePublicKey` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, PRIMARY KEY(`replyingNostrEventId`, `inReplyToNostrEventId`), FOREIGN KEY(`inReplyToProfilePublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`inReplyToRootProfilePublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`replyingNostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`inReplyToNostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`inReplyToRootNostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "replyingNostrEventId", - "columnName": "replyingNostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "inReplyToNostrEventId", - "columnName": "inReplyToNostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "inReplyToProfilePublicKey", - "columnName": "inReplyToProfilePublicKey", - "affinity": "TEXT" - }, - { - "fieldPath": "inReplyToRootNostrEventId", - "columnName": "inReplyToRootNostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "inReplyToRootProfilePublicKey", - "columnName": "inReplyToRootProfilePublicKey", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "replyingNostrEventId", - "inReplyToNostrEventId" - ] - }, - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "inReplyToProfilePublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "inReplyToRootProfilePublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "replyingNostrEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "inReplyToNostrEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "inReplyToRootNostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraArtifact", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT NOT NULL, `visibility` TEXT NOT NULL, `dialectId` TEXT NOT NULL, `license` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `signature` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`dialectId`) REFERENCES `MantraDialect`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "url", - "columnName": "url", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "visibility", - "columnName": "visibility", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "dialectId", - "columnName": "dialectId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "license", - "columnName": "license", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraDialect", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "dialectId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraArtifactVersion", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `artifactId` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `versionLabel` TEXT NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`artifactId`) REFERENCES `MantraArtifact`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "artifactId", - "columnName": "artifactId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "versionLabel", - "columnName": "versionLabel", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraArtifact", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "artifactId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraChapter", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `artifactVersionId` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `name` TEXT NOT NULL, `originalText` TEXT NOT NULL, `index` INTEGER NOT NULL, `wordCount` INTEGER NOT NULL, `characterCount` INTEGER NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`artifactVersionId`) REFERENCES `MantraArtifactVersion`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "artifactVersionId", - "columnName": "artifactVersionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "originalText", - "columnName": "originalText", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "index", - "columnName": "index", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "wordCount", - "columnName": "wordCount", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "characterCount", - "columnName": "characterCount", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraArtifactVersion", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "artifactVersionId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraChunk", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `chapterId` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `text` TEXT NOT NULL, `index` INTEGER NOT NULL, `wordCount` INTEGER NOT NULL, `characterCount` INTEGER NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`chapterId`) REFERENCES `MantraChapter`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chapterId", - "columnName": "chapterId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "text", - "columnName": "text", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "index", - "columnName": "index", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "wordCount", - "columnName": "wordCount", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "characterCount", - "columnName": "characterCount", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraChapter", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chapterId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraDialect", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `name` TEXT NOT NULL, `country` TEXT NOT NULL, `language` TEXT NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "country", - "columnName": "country", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "language", - "columnName": "language", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraTranslation", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `translationChunkId` TEXT NOT NULL, `translationArtifactVersionId` TEXT NOT NULL, `text` TEXT NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`translationChunkId`) REFERENCES `MantraTranslationChunk`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`translationArtifactVersionId`) REFERENCES `MantraTranslationArtifactVersion`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "translationChunkId", - "columnName": "translationChunkId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "translationArtifactVersionId", - "columnName": "translationArtifactVersionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "text", - "columnName": "text", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraTranslationChunk", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "translationChunkId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "MantraTranslationArtifactVersion", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "translationArtifactVersionId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraTranslationArtifactVersion", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `artifactVersionId` TEXT NOT NULL, `dialectId` TEXT NOT NULL, `name` TEXT NOT NULL, `visibility` TEXT NOT NULL, `license` TEXT NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`artifactVersionId`) REFERENCES `MantraArtifactVersion`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`dialectId`) REFERENCES `MantraDialect`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "artifactVersionId", - "columnName": "artifactVersionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "dialectId", - "columnName": "dialectId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "name", - "columnName": "name", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "visibility", - "columnName": "visibility", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "license", - "columnName": "license", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraArtifactVersion", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "artifactVersionId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "MantraDialect", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "dialectId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraTranslationArtifactVersionContributor", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `translationArtifactVersionId` TEXT NOT NULL, `editorPublicKey` TEXT NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`translationArtifactVersionId`) REFERENCES `MantraTranslationArtifactVersionContributor`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "translationArtifactVersionId", - "columnName": "translationArtifactVersionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "editorPublicKey", - "columnName": "editorPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraTranslationArtifactVersionContributor", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "translationArtifactVersionId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraTranslationChapter", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `chapterId` TEXT NOT NULL, `translationArtifactVersionId` TEXT NOT NULL, `index` INTEGER NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`translationArtifactVersionId`) REFERENCES `MantraTranslationArtifactVersion`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chapterId`) REFERENCES `MantraChapter`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chapterId", - "columnName": "chapterId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "translationArtifactVersionId", - "columnName": "translationArtifactVersionId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "index", - "columnName": "index", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraTranslationArtifactVersion", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "translationArtifactVersionId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "MantraChapter", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chapterId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraTranslationChapterContributor", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `translationChapterId` TEXT NOT NULL, `translatorPublicKey` TEXT NOT NULL, `role` TEXT NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`translationChapterId`) REFERENCES `MantraTranslationChapter`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "translationChapterId", - "columnName": "translationChapterId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "translatorPublicKey", - "columnName": "translatorPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "role", - "columnName": "role", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraTranslationChapter", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "translationChapterId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraTranslationChunk", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `chunkId` TEXT NOT NULL, `translationChapterId` TEXT NOT NULL, `text` TEXT NOT NULL, `index` INTEGER NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`chunkId`) REFERENCES `MantraChunk`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`translationChapterId`) REFERENCES `MantraTranslationChapter`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chunkId", - "columnName": "chunkId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "translationChapterId", - "columnName": "translationChapterId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "text", - "columnName": "text", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "index", - "columnName": "index", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraChunk", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chunkId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "MantraTranslationChapter", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "translationChapterId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MantraTranslationContributor", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `dTag` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `translationId` TEXT NOT NULL, `translatorPublicKey` TEXT NOT NULL, `signature` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `marmotGroupEventId` TEXT, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`translationId`) REFERENCES `MantraTranslation`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "dTag", - "columnName": "dTag", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "translationId", - "columnName": "translationId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "translatorPublicKey", - "columnName": "translatorPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MantraTranslation", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "translationId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MarmotCommitResult", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `userPublicKey` TEXT NOT NULL, `peerKeyPackageEventId` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `isOneMemberInitialGroupCreation` INTEGER NOT NULL, `commitBytes` BLOB NOT NULL, `welcomeBytes` BLOB, `groupInfoBytes` BLOB, `framedCommitBytes` BLOB NOT NULL, `preCommitExporterSecret` BLOB NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "userPublicKey", - "columnName": "userPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "peerKeyPackageEventId", - "columnName": "peerKeyPackageEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "isOneMemberInitialGroupCreation", - "columnName": "isOneMemberInitialGroupCreation", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "commitBytes", - "columnName": "commitBytes", - "affinity": "BLOB", - "notNull": true - }, - { - "fieldPath": "welcomeBytes", - "columnName": "welcomeBytes", - "affinity": "BLOB" - }, - { - "fieldPath": "groupInfoBytes", - "columnName": "groupInfoBytes", - "affinity": "BLOB" - }, - { - "fieldPath": "framedCommitBytes", - "columnName": "framedCommitBytes", - "affinity": "BLOB", - "notNull": true - }, - { - "fieldPath": "preCommitExporterSecret", - "columnName": "preCommitExporterSecret", - "affinity": "BLOB", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - } - }, - { - "tableName": "MarmotGroupEvent", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `userPublicKey` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `signature` TEXT NOT NULL, `encryptedContent` TEXT NOT NULL, `expiresAt` INTEGER, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "userPublicKey", - "columnName": "userPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signature", - "columnName": "signature", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "encryptedContent", - "columnName": "encryptedContent", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "expiresAt", - "columnName": "expiresAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "id" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MarmotInnerEvent", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `kind` INTEGER NOT NULL, `tags` TEXT NOT NULL, `content` TEXT NOT NULL, `quotedEventId` TEXT, `payloadEventId` TEXT, `awaitingEventId` TEXT, `marmotGroupEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`marmotGroupEventId`) REFERENCES `MarmotGroupEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "kind", - "columnName": "kind", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "tags", - "columnName": "tags", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "content", - "columnName": "content", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "quotedEventId", - "columnName": "quotedEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "payloadEventId", - "columnName": "payloadEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "awaitingEventId", - "columnName": "awaitingEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "marmotGroupEventId", - "columnName": "marmotGroupEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "MarmotGroupEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "marmotGroupEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "MarmotKeyPackage", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `tlsEncodedMarmotKeyPackage` BLOB NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`publicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "tlsEncodedMarmotKeyPackage", - "columnName": "tlsEncodedMarmotKeyPackage", - "affinity": "BLOB", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "publicKey" - ], - "referencedColumns": [ - "publicKey" - ] - } - ] - }, - { - "tableName": "MarmotKeyPackageBundle", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `publicKey` TEXT NOT NULL, `tlsEncodedMarmotKeyPackage` BLOB NOT NULL, `ncryptsecInitPrivateKey` TEXT NOT NULL, `ncryptsecEncryptionPrivateKey` TEXT NOT NULL, `ncryptsecSignaturePrivateKey` TEXT NOT NULL, `consumed` INTEGER NOT NULL, `rotated` INTEGER NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "tlsEncodedMarmotKeyPackage", - "columnName": "tlsEncodedMarmotKeyPackage", - "affinity": "BLOB", - "notNull": true - }, - { - "fieldPath": "ncryptsecInitPrivateKey", - "columnName": "ncryptsecInitPrivateKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "ncryptsecEncryptionPrivateKey", - "columnName": "ncryptsecEncryptionPrivateKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "ncryptsecSignaturePrivateKey", - "columnName": "ncryptsecSignaturePrivateKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "consumed", - "columnName": "consumed", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "rotated", - "columnName": "rotated", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_MarmotKeyPackageBundle_publicKey", - "unique": false, - "columnNames": [ - "publicKey" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_MarmotKeyPackageBundle_publicKey` ON `${TABLE_NAME}` (`publicKey`)" - } - ] - }, - { - "tableName": "MarmotRetainedEpochSecret", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`chatRoomId` TEXT NOT NULL, `epoch` INTEGER NOT NULL, `senderDataSecret` BLOB NOT NULL, `encryptionSecret` BLOB NOT NULL, `leafCount` INTEGER NOT NULL, `exporterSecret` BLOB NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, PRIMARY KEY(`chatRoomId`, `epoch`), FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "epoch", - "columnName": "epoch", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "senderDataSecret", - "columnName": "senderDataSecret", - "affinity": "BLOB", - "notNull": true - }, - { - "fieldPath": "encryptionSecret", - "columnName": "encryptionSecret", - "affinity": "BLOB", - "notNull": true - }, - { - "fieldPath": "leafCount", - "columnName": "leafCount", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "exporterSecret", - "columnName": "exporterSecret", - "affinity": "BLOB", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "chatRoomId", - "epoch" - ] - }, - "foreignKeys": [ - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Mention", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `mentionedPublicKey` TEXT NOT NULL, `mentioningNostrEventId` TEXT, `relayUrl` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `deletedAt` INTEGER, `broadcastedAt` INTEGER, FOREIGN KEY(`mentionedPublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`mentioningNostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "mentionedPublicKey", - "columnName": "mentionedPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "mentioningNostrEventId", - "columnName": "mentioningNostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "relayUrl", - "columnName": "relayUrl", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": true, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "mentionedPublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "mentioningNostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "NegentropySynchronizeRequest", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `uuid` TEXT NOT NULL, `purpose` TEXT NOT NULL, `status` TEXT NOT NULL, `relayURL` TEXT NOT NULL, `isRecommendedRelay` INTEGER NOT NULL, `level` INTEGER NOT NULL, `synchronizationFilter` TEXT NOT NULL, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "uuid", - "columnName": "uuid", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "purpose", - "columnName": "purpose", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "status", - "columnName": "status", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayURL", - "columnName": "relayURL", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "isRecommendedRelay", - "columnName": "isRecommendedRelay", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "synchronizationFilter", - "columnName": "synchronizationFilter", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_NegentropySynchronizeRequest_nostrEventId", - "unique": false, - "columnNames": [ - "nostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_NegentropySynchronizeRequest_nostrEventId` ON `${TABLE_NAME}` (`nostrEventId`)" - }, - { - "name": "index_NegentropySynchronizeRequest_status", - "unique": false, - "columnNames": [ - "status" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_NegentropySynchronizeRequest_status` ON `${TABLE_NAME}` (`status`)" - } - ], - "foreignKeys": [ - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "NegentropySynchronizeResult", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `relayURL` TEXT NOT NULL, `status` TEXT NOT NULL, `negentropySynchronizeRequestId` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`negentropySynchronizeRequestId`) REFERENCES `SynchronizeNostrEventResult`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayURL", - "columnName": "relayURL", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "status", - "columnName": "status", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "negentropySynchronizeRequestId", - "columnName": "negentropySynchronizeRequestId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "SynchronizeNostrEventResult", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "negentropySynchronizeRequestId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "NostrEvent", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `pubKey` TEXT NOT NULL, `kind` INTEGER NOT NULL, `tags` TEXT NOT NULL, `content` TEXT NOT NULL, `sig` TEXT NOT NULL, `relayUrl` TEXT, `quotedNostrEventId` TEXT, `quotedAuthorPublicKey` TEXT, `inReplyToNostrEventId` TEXT, `inReplyToAuthorPublicKey` TEXT, `inReplyToRootNostrEventId` TEXT, `inReplyToRootAuthorPublicKey` TEXT, `repostedNostrEventId` TEXT, `repostedAuthorPublicKey` TEXT, `unsignedNostrEventId` INTEGER, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`id`))", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "pubKey", - "columnName": "pubKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "kind", - "columnName": "kind", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "tags", - "columnName": "tags", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "content", - "columnName": "content", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "sig", - "columnName": "sig", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayUrl", - "columnName": "relayUrl", - "affinity": "TEXT" - }, - { - "fieldPath": "quotedNostrEventId", - "columnName": "quotedNostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "quotedAuthorPublicKey", - "columnName": "quotedAuthorPublicKey", - "affinity": "TEXT" - }, - { - "fieldPath": "inReplyToNostrEventId", - "columnName": "inReplyToNostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "inReplyToAuthorPublicKey", - "columnName": "inReplyToAuthorPublicKey", - "affinity": "TEXT" - }, - { - "fieldPath": "inReplyToRootNostrEventId", - "columnName": "inReplyToRootNostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "inReplyToRootAuthorPublicKey", - "columnName": "inReplyToRootAuthorPublicKey", - "affinity": "TEXT" - }, - { - "fieldPath": "repostedNostrEventId", - "columnName": "repostedNostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "repostedAuthorPublicKey", - "columnName": "repostedAuthorPublicKey", - "affinity": "TEXT" - }, - { - "fieldPath": "unsignedNostrEventId", - "columnName": "unsignedNostrEventId", - "affinity": "INTEGER" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_NostrEvent_kind", - "unique": false, - "columnNames": [ - "kind" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_NostrEvent_kind` ON `${TABLE_NAME}` (`kind`)" - }, - { - "name": "index_NostrEvent_pubKey", - "unique": false, - "columnNames": [ - "pubKey" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_NostrEvent_pubKey` ON `${TABLE_NAME}` (`pubKey`)" - }, - { - "name": "index_NostrEvent_quotedNostrEventId", - "unique": false, - "columnNames": [ - "quotedNostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_NostrEvent_quotedNostrEventId` ON `${TABLE_NAME}` (`quotedNostrEventId`)" - }, - { - "name": "index_NostrEvent_inReplyToNostrEventId", - "unique": false, - "columnNames": [ - "inReplyToNostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_NostrEvent_inReplyToNostrEventId` ON `${TABLE_NAME}` (`inReplyToNostrEventId`)" - }, - { - "name": "index_NostrEvent_inReplyToRootNostrEventId", - "unique": false, - "columnNames": [ - "inReplyToRootNostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_NostrEvent_inReplyToRootNostrEventId` ON `${TABLE_NAME}` (`inReplyToRootNostrEventId`)" - } - ] - }, - { - "tableName": "NostrEventRelay", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`relayURL` TEXT NOT NULL, `nostrEventId` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`nostrEventId`, `relayURL`), FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "relayURL", - "columnName": "relayURL", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "nostrEventId", - "relayURL" - ] - }, - "indices": [ - { - "name": "index_NostrEventRelay_relayURL", - "unique": false, - "columnNames": [ - "relayURL" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_NostrEventRelay_relayURL` ON `${TABLE_NAME}` (`relayURL`)" - } - ], - "foreignKeys": [ - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Participant", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `participantPublicKey` TEXT NOT NULL, `chatRoomId` TEXT NOT NULL, `relayHint` TEXT, `adminAt` INTEGER, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `deletedAt` INTEGER, `broadcastedAt` INTEGER, FOREIGN KEY(`participantPublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`chatRoomId`) REFERENCES `ChatRoom`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "participantPublicKey", - "columnName": "participantPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "chatRoomId", - "columnName": "chatRoomId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayHint", - "columnName": "relayHint", - "affinity": "TEXT" - }, - { - "fieldPath": "adminAt", - "columnName": "adminAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": true, - "columnNames": [ - "id" - ] - }, - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "participantPublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "ChatRoom", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "chatRoomId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Post", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `repostId` TEXT, `quote` TEXT, `content` TEXT NOT NULL, `nostrEventId` TEXT NOT NULL, `replyToId` TEXT, `profilePublicKey` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`profilePublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`replyToId`) REFERENCES `Post`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`repostId`) REFERENCES `Post`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "repostId", - "columnName": "repostId", - "affinity": "TEXT" - }, - { - "fieldPath": "quote", - "columnName": "quote", - "affinity": "TEXT" - }, - { - "fieldPath": "content", - "columnName": "content", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "replyToId", - "columnName": "replyToId", - "affinity": "TEXT" - }, - { - "fieldPath": "profilePublicKey", - "columnName": "profilePublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Post_profilePublicKey", - "unique": false, - "columnNames": [ - "profilePublicKey" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Post_profilePublicKey` ON `${TABLE_NAME}` (`profilePublicKey`)" - }, - { - "name": "index_Post_nostrEventId", - "unique": false, - "columnNames": [ - "nostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Post_nostrEventId` ON `${TABLE_NAME}` (`nostrEventId`)" - }, - { - "name": "index_Post_replyToId", - "unique": false, - "columnNames": [ - "replyToId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Post_replyToId` ON `${TABLE_NAME}` (`replyToId`)" - }, - { - "name": "index_Post_repostId", - "unique": false, - "columnNames": [ - "repostId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Post_repostId` ON `${TABLE_NAME}` (`repostId`)" - } - ], - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "profilePublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Post", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "replyToId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Post", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "repostId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Profile", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`publicKey` TEXT NOT NULL, `userName` TEXT, `displayName` TEXT, `picture` TEXT, `banner` TEXT, `website` TEXT, `about` TEXT, `bot` INTEGER, `pronouns` TEXT, `nip05` TEXT, `domain` TEXT, `lud06` TEXT, `lud16` TEXT, `twitter` TEXT, `nostrEventId` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`publicKey`), FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "userName", - "columnName": "userName", - "affinity": "TEXT" - }, - { - "fieldPath": "displayName", - "columnName": "displayName", - "affinity": "TEXT" - }, - { - "fieldPath": "picture", - "columnName": "picture", - "affinity": "TEXT" - }, - { - "fieldPath": "banner", - "columnName": "banner", - "affinity": "TEXT" - }, - { - "fieldPath": "website", - "columnName": "website", - "affinity": "TEXT" - }, - { - "fieldPath": "about", - "columnName": "about", - "affinity": "TEXT" - }, - { - "fieldPath": "bot", - "columnName": "bot", - "affinity": "INTEGER" - }, - { - "fieldPath": "pronouns", - "columnName": "pronouns", - "affinity": "TEXT" - }, - { - "fieldPath": "nip05", - "columnName": "nip05", - "affinity": "TEXT" - }, - { - "fieldPath": "domain", - "columnName": "domain", - "affinity": "TEXT" - }, - { - "fieldPath": "lud06", - "columnName": "lud06", - "affinity": "TEXT" - }, - { - "fieldPath": "lud16", - "columnName": "lud16", - "affinity": "TEXT" - }, - { - "fieldPath": "twitter", - "columnName": "twitter", - "affinity": "TEXT" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "publicKey" - ] - }, - "indices": [ - { - "name": "index_Profile_nostrEventId", - "unique": false, - "columnNames": [ - "nostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Profile_nostrEventId` ON `${TABLE_NAME}` (`nostrEventId`)" - } - ], - "foreignKeys": [ - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "QuotedRelation", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`quotingNostrEventId` TEXT NOT NULL, `quotedNostrEventId` TEXT NOT NULL, `quotedProfilePublicKey` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`quotingNostrEventId`, `quotedNostrEventId`), FOREIGN KEY(`quotedProfilePublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`quotingNostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`quotedNostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "quotingNostrEventId", - "columnName": "quotingNostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "quotedNostrEventId", - "columnName": "quotedNostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "quotedProfilePublicKey", - "columnName": "quotedProfilePublicKey", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "quotingNostrEventId", - "quotedNostrEventId" - ] - }, - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "quotedProfilePublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "quotingNostrEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "quotedNostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "Reaction", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `content` TEXT NOT NULL, `nostrEventId` TEXT NOT NULL, `replyToId` TEXT NOT NULL, `profilePublicKey` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`profilePublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`replyToId`) REFERENCES `Post`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "content", - "columnName": "content", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "replyToId", - "columnName": "replyToId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "profilePublicKey", - "columnName": "profilePublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Reaction_profilePublicKey", - "unique": false, - "columnNames": [ - "profilePublicKey" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Reaction_profilePublicKey` ON `${TABLE_NAME}` (`profilePublicKey`)" - }, - { - "name": "index_Reaction_nostrEventId", - "unique": false, - "columnNames": [ - "nostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Reaction_nostrEventId` ON `${TABLE_NAME}` (`nostrEventId`)" - }, - { - "name": "index_Reaction_replyToId", - "unique": false, - "columnNames": [ - "replyToId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Reaction_replyToId` ON `${TABLE_NAME}` (`replyToId`)" - } - ], - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "profilePublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Post", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "replyToId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "RecentSearch", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`query` TEXT NOT NULL, `synchronizationFilters` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`query`))", - "fields": [ - { - "fieldPath": "query", - "columnName": "query", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "synchronizationFilters", - "columnName": "synchronizationFilters", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "query" - ] - } - }, - { - "tableName": "Relay", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`publicKey` TEXT NOT NULL, `type` TEXT NOT NULL, `url` TEXT NOT NULL, `read` INTEGER NOT NULL, `write` INTEGER NOT NULL, PRIMARY KEY(`publicKey`, `type`, `url`))", - "fields": [ - { - "fieldPath": "publicKey", - "columnName": "publicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "type", - "columnName": "type", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "url", - "columnName": "url", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "read", - "columnName": "read", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "write", - "columnName": "write", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "publicKey", - "type", - "url" - ] - } - }, - { - "tableName": "RepostedRelation", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`repostingNostrEventId` TEXT NOT NULL, `repostedNostrEventId` TEXT NOT NULL, `repostedProfilePublicKey` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`repostingNostrEventId`, `repostedNostrEventId`), FOREIGN KEY(`repostedProfilePublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`repostedNostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`repostingNostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "repostingNostrEventId", - "columnName": "repostingNostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "repostedNostrEventId", - "columnName": "repostedNostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "repostedProfilePublicKey", - "columnName": "repostedProfilePublicKey", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "repostingNostrEventId", - "repostedNostrEventId" - ] - }, - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "repostedProfilePublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "repostedNostrEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "repostingNostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "SynchronizeNostrEventRequest", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `purpose` TEXT NOT NULL, `status` TEXT NOT NULL, `relayURL` TEXT NOT NULL, `isRecommendedRelay` INTEGER NOT NULL, `level` INTEGER NOT NULL, `synchronizationFilters` TEXT NOT NULL, `nostrEventId` TEXT, `unsignedNostrEventId` INTEGER, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`unsignedNostrEventId`) REFERENCES `UnsignedNostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "purpose", - "columnName": "purpose", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "status", - "columnName": "status", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayURL", - "columnName": "relayURL", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "isRecommendedRelay", - "columnName": "isRecommendedRelay", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "level", - "columnName": "level", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "synchronizationFilters", - "columnName": "synchronizationFilters", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "unsignedNostrEventId", - "columnName": "unsignedNostrEventId", - "affinity": "INTEGER" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_SynchronizeNostrEventRequest_nostrEventId", - "unique": false, - "columnNames": [ - "nostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_SynchronizeNostrEventRequest_nostrEventId` ON `${TABLE_NAME}` (`nostrEventId`)" - }, - { - "name": "index_SynchronizeNostrEventRequest_status", - "unique": false, - "columnNames": [ - "status" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_SynchronizeNostrEventRequest_status` ON `${TABLE_NAME}` (`status`)" - } - ], - "foreignKeys": [ - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "UnsignedNostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "unsignedNostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "SynchronizeNostrEventResult", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `relayURL` TEXT NOT NULL, `nostrEventId` TEXT, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "relayURL", - "columnName": "relayURL", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_SynchronizeNostrEventResult_nostrEventId", - "unique": false, - "columnNames": [ - "nostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_SynchronizeNostrEventResult_nostrEventId` ON `${TABLE_NAME}` (`nostrEventId`)" - } - ], - "foreignKeys": [ - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - } - ] - }, - { - "tableName": "UnsignedNostrEvent", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `pubKey` TEXT NOT NULL, `kind` INTEGER NOT NULL, `tags` TEXT NOT NULL, `privateTags` TEXT, `content` TEXT NOT NULL, `signedAt` INTEGER, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `deletedAt` INTEGER, `broadcastedAt` INTEGER)", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "pubKey", - "columnName": "pubKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "kind", - "columnName": "kind", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "tags", - "columnName": "tags", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "privateTags", - "columnName": "privateTags", - "affinity": "TEXT" - }, - { - "fieldPath": "content", - "columnName": "content", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "signedAt", - "columnName": "signedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": true, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_UnsignedNostrEvent_pubKey", - "unique": false, - "columnNames": [ - "pubKey" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_UnsignedNostrEvent_pubKey` ON `${TABLE_NAME}` (`pubKey`)" - }, - { - "name": "index_UnsignedNostrEvent_kind", - "unique": false, - "columnNames": [ - "kind" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_UnsignedNostrEvent_kind` ON `${TABLE_NAME}` (`kind`)" - } - ] - }, - { - "tableName": "Zap", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `postId` TEXT NOT NULL, `senderPublicKey` TEXT NOT NULL, `receiverPublicKey` TEXT NOT NULL, `message` TEXT, `invoice` TEXT, `amountInMillisatoshis` INTEGER, `nostrEventId` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, `savedAt` INTEGER NOT NULL, `viewedAt` INTEGER, `deletedAt` INTEGER, `broadcastedAt` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`senderPublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`receiverPublicKey`) REFERENCES `Profile`(`publicKey`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`postId`) REFERENCES `Post`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", - "fields": [ - { - "fieldPath": "id", - "columnName": "id", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "postId", - "columnName": "postId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "senderPublicKey", - "columnName": "senderPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "receiverPublicKey", - "columnName": "receiverPublicKey", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "message", - "columnName": "message", - "affinity": "TEXT" - }, - { - "fieldPath": "invoice", - "columnName": "invoice", - "affinity": "TEXT" - }, - { - "fieldPath": "amountInMillisatoshis", - "columnName": "amountInMillisatoshis", - "affinity": "INTEGER" - }, - { - "fieldPath": "nostrEventId", - "columnName": "nostrEventId", - "affinity": "TEXT", - "notNull": true - }, - { - "fieldPath": "createdAt", - "columnName": "createdAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "updatedAt", - "columnName": "updatedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "savedAt", - "columnName": "savedAt", - "affinity": "INTEGER", - "notNull": true - }, - { - "fieldPath": "viewedAt", - "columnName": "viewedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "deletedAt", - "columnName": "deletedAt", - "affinity": "INTEGER" - }, - { - "fieldPath": "broadcastedAt", - "columnName": "broadcastedAt", - "affinity": "INTEGER" - } - ], - "primaryKey": { - "autoGenerate": false, - "columnNames": [ - "id" - ] - }, - "indices": [ - { - "name": "index_Zap_senderPublicKey", - "unique": false, - "columnNames": [ - "senderPublicKey" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Zap_senderPublicKey` ON `${TABLE_NAME}` (`senderPublicKey`)" - }, - { - "name": "index_Zap_nostrEventId", - "unique": false, - "columnNames": [ - "nostrEventId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Zap_nostrEventId` ON `${TABLE_NAME}` (`nostrEventId`)" - }, - { - "name": "index_Zap_postId", - "unique": false, - "columnNames": [ - "postId" - ], - "orders": [], - "createSql": "CREATE INDEX IF NOT EXISTS `index_Zap_postId` ON `${TABLE_NAME}` (`postId`)" - } - ], - "foreignKeys": [ - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "senderPublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "Profile", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "receiverPublicKey" - ], - "referencedColumns": [ - "publicKey" - ] - }, - { - "table": "NostrEvent", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "nostrEventId" - ], - "referencedColumns": [ - "id" - ] - }, - { - "table": "Post", - "onDelete": "CASCADE", - "onUpdate": "NO ACTION", - "columns": [ - "postId" - ], - "referencedColumns": [ - "id" - ] - } - ] - } - ], - "setupQueries": [ - "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1e573d88b491b8326cd3866f0cd0118b')" - ] - } -} \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/MantraDatabase.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/MantraDatabase.kt index 70cc9c1d..e3c146ec 100644 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/MantraDatabase.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/MantraDatabase.kt @@ -164,7 +164,7 @@ val GENESIS_AT = Instant.fromEpochMilliseconds(1231006505000L) UnsignedNostrEvent::class, Zap::class ], - version = 6, + version = 5, autoMigrations = [ // v2 only adds the DkgSession/DkgParticipantMessage tables, so Room can // generate the migration itself — nothing existing changes shape. @@ -183,12 +183,7 @@ val GENESIS_AT = Instant.fromEpochMilliseconds(1231006505000L) // nip30303 event a SubmissionEvent rumor carries. Rumors queued before // this come back null, which reads as "not a submission" -- correct, // since none of them were. - AutoMigration(from = 4, to = 5), - // v6 adds the nullable MarmotInnerEvent.awaitingEventId, holding a - // submission that arrived before the event it references. Nothing - // queued before this was ever held, so null is the right answer for - // every existing row. - AutoMigration(from = 5, to = 6) + AutoMigration(from = 4, to = 5) ] ) @ColumnTypeConverters(MantraConverters::class) diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/dao/MantraTranslationChunkDao.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/dao/MantraTranslationChunkDao.kt index be7f42bf..52c1c7a3 100644 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/dao/MantraTranslationChunkDao.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/dao/MantraTranslationChunkDao.kt @@ -15,9 +15,6 @@ interface MantraTranslationChunkDao { @Query("SELECT * FROM MantraTranslationChunk WHERE translationChapterId = :translationChapterId ORDER BY `index` ASC") suspend fun getTranslationChunksByTranslationChapterId(translationChapterId: String): List - @Query("SELECT * FROM MantraTranslationChunk WHERE id = :id") - suspend fun getTranslationChunkById(id: String): MantraTranslationChunk? - @Query("DELETE FROM MantraTranslationChunk WHERE id = :id") suspend fun deleteById(id: String) } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/dao/MarmotInnerEventDao.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/dao/MarmotInnerEventDao.kt index fe8d8711..016e060b 100644 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/dao/MarmotInnerEventDao.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/dao/MarmotInnerEventDao.kt @@ -26,13 +26,4 @@ interface MarmotInnerEventDao { */ @Query("DELETE FROM MarmotInnerEvent WHERE payloadEventId = :payloadEventId") suspend fun deleteByPayloadEventId(payloadEventId: String) - - /** - * The submissions held back waiting for [eventId], oldest first. - * - * Oldest first because a backlog usually arrives in the order it was - * written, so applying it that way unblocks the most in one pass. - */ - @Query("SELECT * FROM MarmotInnerEvent WHERE awaitingEventId = :eventId ORDER BY createdAt ASC") - suspend fun getSubmissionsAwaiting(eventId: String): List } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/model/ChatMessage.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/model/ChatMessage.kt index edd93fc5..28e2d0f8 100644 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/model/ChatMessage.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/model/ChatMessage.kt @@ -219,18 +219,19 @@ data class ChatMessage( } val payload = submission?.payload() - val innerEvent = MarmotInnerEvent( - id = event.id, - publicKey = event.pubKey, - marmotGroupEventId = groupEvent.id, - tags = event.tags, - content = event.content, - chatRoomId = groupEventResult.groupId, - kind = event.kind, - payloadEventId = payload?.id, - createdAt = Instant.fromEpochSeconds(event.createdAt) + database.marmotInnerEventDao().upsert( + MarmotInnerEvent( + id = event.id, + publicKey = event.pubKey, + marmotGroupEventId = groupEvent.id, + tags = event.tags, + content = event.content, + chatRoomId = groupEventResult.groupId, + kind = event.kind, + payloadEventId = payload?.id, + createdAt = Instant.fromEpochSeconds(event.createdAt) + ) ) - database.marmotInnerEventDao().upsert(innerEvent) // A submission whose payload will not parse, or which carries // another submission, is kept but not applied: there is nothing @@ -248,13 +249,15 @@ data class ChatMessage( content = event.content, ) } else { - applyOrHold( + applyInnerEvent( database = database, activeKeyPair = activeKeyPair, + groupEvent = groupEvent, groupId = groupEventResult.groupId, - innerEvent = innerEvent, event = payload ?: event, - isUserMessage = activeKeyPair.pubKey.toHex() == groupEvent.pubKey, + marmotInnerEventId = event.id, + senderPublicKey = event.pubKey, + createdAt = Instant.fromEpochSeconds(event.createdAt), ) } } @@ -352,283 +355,14 @@ data class ChatMessage( * from [event], so the chat line says who added it and the row says who * wrote it. */ - /** - * Apply [event] now, or hold it until what it references turns up. - * - * Foreign keys mean a payload cannot become a row before its parent - * does, and inserting one anyway does not fail politely: SQLite aborts - * the statement, which rolls back the whole transaction the inbound - * pipeline runs in -- losing the nostr event, the group event, this - * submission and the transcript line with it, none of which is retried. - * - * So the parent is checked first. A payload that arrives early is kept - * against the id it waits for and applied later, which is what makes - * order stop mattering: an admin submitting a backlog can send it in - * whatever order they hold it, and a member who joined last week can be - * sent what the group was told last month. - * - * A held payload writes no chat line. Nobody said anything yet -- the - * line appears when it is applied, in the transcript position its own - * timestamp gives it. - */ - private suspend fun applyOrHold( - database: MantraDatabase, - activeKeyPair: KeyPair, - groupId: String, - innerEvent: MarmotInnerEvent, - event: Event, - isUserMessage: Boolean, - ): ChatMessage? { - missingParentOf(database, event)?.let { missingParent -> - database.marmotInnerEventDao().upsert( - innerEvent.copy(awaitingEventId = missingParent) - ) - return null - } - - val chatMessage = applyInnerEvent( - database = database, - groupId = groupId, - event = event, - marmotGroupEventId = innerEvent.marmotGroupEventId, - marmotInnerEventId = innerEvent.id, - senderPublicKey = innerEvent.publicKey, - isUserMessage = isUserMessage, - createdAt = innerEvent.createdAt, - ) - - // This may be the parent something else was held for. - releaseAwaiting(database, activeKeyPair, groupId, event.id) - - return chatMessage - } - - /** - * Apply whatever was waiting on [arrivedEventId], now that it is here. - * - * Releasing one can release another -- a version unblocks its chapters, - * a chapter unblocks its chunks -- so this keeps going until nothing - * more comes unstuck. A payload with a second parent still missing is - * re-pointed at that one rather than applied, so it waits for the right - * thing instead of being retried on every arrival. - */ - private suspend fun releaseAwaiting( - database: MantraDatabase, - activeKeyPair: KeyPair, - groupId: String, - arrivedEventId: HexKey, - ) { - val arrived = ArrayDeque(listOf(arrivedEventId)) - - while (arrived.isNotEmpty()) { - val parentId = arrived.removeFirst() - - database.marmotInnerEventDao().getSubmissionsAwaiting(parentId).forEach { held -> - // A submission's content is its payload verbatim; anything - // else held is a bare nip30303 event, where the row is the - // event and its own columns rebuild it. Reading both out of - // the content would strand every bare one here forever. - val payload = if (held.kind == SubmissionEvent.KIND) { - Event.fromJsonOrNull(held.content) - } else { - Event( - id = held.id, - pubKey = held.publicKey, - createdAt = held.createdAt.epochSeconds, - kind = held.kind, - tags = held.tags, - content = held.content, - sig = "", - ) - } ?: return@forEach - - missingParentOf(database, payload)?.let { stillMissing -> - database.marmotInnerEventDao().upsert( - held.copy(awaitingEventId = stillMissing) - ) - return@forEach - } - - database.marmotInnerEventDao().upsert(held.copy(awaitingEventId = null)) - - applyInnerEvent( - database = database, - groupId = groupId, - event = payload, - marmotGroupEventId = held.marmotGroupEventId, - marmotInnerEventId = held.id, - senderPublicKey = held.publicKey, - // Held payloads are never ours: we hold the parents of - // anything we wrote, having written those too. - isUserMessage = false, - createdAt = held.createdAt, - )?.let { database.chatMessageDao().upsert(it) } - - arrived.addLast(payload.id) - } - } - } - - /** - * The event [event] references but which is not on file yet, or null - * when everything it needs is already here. - */ - private suspend fun missingParentOf( - database: MantraDatabase, - event: Event, - ): HexKey? = parentRefsOf(event).firstOrNull { !it.exists(database) }?.id - - /** - * A row some event references, named by id and by the kind of event - * that would have created it. - */ - internal data class ParentRef( - val id: HexKey, - val kind: Int, - ) { - suspend fun exists(database: MantraDatabase): Boolean = when (kind) { - DialectEvent.KIND -> - database.mantraDialectDao().getDialectById(id) != null - - ArtifactEvent.KIND -> - database.mantraArtifactDao().getArtifactById(id) != null - - ArtifactVersionEvent.KIND -> - database.mantraArtifactVersionDao().getArtifactVersionById(id) != null - - ChapterEvent.KIND -> - database.mantraChapterDao().getChapterById(id) != null - - ChunkEvent.KIND -> - database.mantraChunkDao().getChunkById(id) != null - - TranslationArtifactVersionEvent.KIND -> - database.mantraTranslationArtifactVersionDao().getTranslationById(id) != null - - TranslationChapterEvent.KIND -> - database.mantraTranslationChapterDao().getTranslationChapterById(id) != null - - TranslationChunkEvent.KIND -> - database.mantraTranslationChunkDao().getTranslationChunkById(id) != null - - // Not a parent anything waits on. - else -> true - } - } - - /** - * Every row [event] references and the database will insist exists. - * - * This is the foreign keys on the Mantra* entities, read off the event - * instead of the schema. The two have to agree: a parent listed here - * that the schema does not enforce just delays a payload for no reason, - * and one the schema enforces but is missing here is a payload that - * takes the whole inbound transaction down with it. - * - * The chat room is deliberately not among them. It is a foreign key, - * but a payload for a room we are not in never reaches this far. - */ - internal fun parentRefsOf(event: Event): List = when (event.kind) { - ArtifactEvent.KIND -> - event.asArtifactEvent().let { - listOfNotNull(it.dialectId()?.let { id -> ParentRef(id, DialectEvent.KIND) }) - } - - ArtifactVersionEvent.KIND -> - event.asArtifactVersionEvent().let { - listOfNotNull(it.artifactId()?.let { id -> ParentRef(id, ArtifactEvent.KIND) }) - } - - ChapterEvent.KIND -> - event.asChapterEvent().let { - listOfNotNull( - it.artifactVersionId()?.let { id -> ParentRef(id, ArtifactVersionEvent.KIND) } - ) - } - - ChunkEvent.KIND -> - event.asChunkEvent().let { - listOfNotNull(it.chapterId()?.let { id -> ParentRef(id, ChapterEvent.KIND) }) - } - - TranslationArtifactVersionEvent.KIND -> - event.asTranslationArtifactVersionEvent().let { - listOfNotNull( - it.artifactVersionId()?.let { id -> ParentRef(id, ArtifactVersionEvent.KIND) }, - it.dialectId()?.let { id -> ParentRef(id, DialectEvent.KIND) }, - ) - } - - TranslationChapterEvent.KIND -> - event.asTranslationChapterEvent().let { - listOfNotNull( - it.translationArtifactVersionId()?.let { id -> - ParentRef(id, TranslationArtifactVersionEvent.KIND) - }, - it.chapterId()?.let { id -> ParentRef(id, ChapterEvent.KIND) }, - ) - } - - TranslationChunkEvent.KIND -> - event.asTranslationChunkEvent().let { - listOfNotNull( - it.translationChapterId()?.let { id -> - ParentRef(id, TranslationChapterEvent.KIND) - }, - it.chunkId()?.let { id -> ParentRef(id, ChunkEvent.KIND) }, - ) - } - - TranslationEvent.KIND -> - event.asTranslationEvent().let { - listOfNotNull( - it.translationChunkId()?.let { id -> - ParentRef(id, TranslationChunkEvent.KIND) - }, - it.translationArtifactVersionId()?.let { id -> - ParentRef(id, TranslationArtifactVersionEvent.KIND) - }, - ) - } - - // Kinds with no parent to wait for. - else -> emptyList() - } - - // A submission's payload arrives as a base Event; these read it back as - // the kind it says it is, so its tag accessors can be used. - private fun Event.asArtifactEvent() = - ArtifactEvent(id, pubKey, createdAt, tags, content, sig) - - private fun Event.asArtifactVersionEvent() = - ArtifactVersionEvent(id, pubKey, createdAt, tags, content, sig) - - private fun Event.asChapterEvent() = - ChapterEvent(id, pubKey, createdAt, tags, content, sig) - - private fun Event.asChunkEvent() = - ChunkEvent(id, pubKey, createdAt, tags, content, sig) - - private fun Event.asTranslationArtifactVersionEvent() = - TranslationArtifactVersionEvent(id, pubKey, createdAt, tags, content, sig) - - private fun Event.asTranslationChapterEvent() = - TranslationChapterEvent(id, pubKey, createdAt, tags, content, sig) - - private fun Event.asTranslationChunkEvent() = - TranslationChunkEvent(id, pubKey, createdAt, tags, content, sig) - - private fun Event.asTranslationEvent() = - TranslationEvent(id, pubKey, createdAt, tags, content, sig) - private suspend fun applyInnerEvent( database: MantraDatabase, + activeKeyPair: KeyPair, + groupEvent: GroupEvent, groupId: String, event: Event, - marmotGroupEventId: HexKey?, marmotInnerEventId: HexKey, senderPublicKey: HexKey, - isUserMessage: Boolean, createdAt: Instant, ): ChatMessage? { return when (event.kind) { @@ -636,10 +370,10 @@ data class ChatMessage( ChatMessage( giftWrapPayloadId = null, messageType = "message", - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, marmotInnerEventId = marmotInnerEventId, senderPublicKey = senderPublicKey, - isUserMessage = isUserMessage, + isUserMessage = activeKeyPair.pubKey.toHex() == groupEvent.pubKey, chatRoomId = groupId, createdAt = createdAt, content = event.content, // TODO: Figure out what to do here... @@ -659,17 +393,17 @@ data class ChatMessage( )?.let { mantraArtifact -> database.mantraArtifactDao().upsert( mantraArtifact.copy( - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, ) ) ChatMessage( giftWrapPayloadId = null, messageType = "artifact", - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, marmotInnerEventId = marmotInnerEventId, senderPublicKey = senderPublicKey, - isUserMessage = isUserMessage, + isUserMessage = activeKeyPair.pubKey.toHex() == groupEvent.pubKey, chatRoomId = groupId, createdAt = createdAt, content = "Added ${mantraArtifact.name} to artifacts" @@ -690,17 +424,17 @@ data class ChatMessage( )?.let { mantraArtifactVersion -> database.mantraArtifactVersionDao().upsert( mantraArtifactVersion.copy( - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, ) ) ChatMessage( giftWrapPayloadId = null, messageType = "artifactVersion", - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, marmotInnerEventId = marmotInnerEventId, senderPublicKey = senderPublicKey, - isUserMessage = isUserMessage, + isUserMessage = activeKeyPair.pubKey.toHex() == groupEvent.pubKey, chatRoomId = groupId, createdAt = createdAt, content = "Added ${mantraArtifactVersion.versionLabel} to artifact versions" // TODO: Use artifact name... @@ -721,17 +455,17 @@ data class ChatMessage( )?.let { mantraChapter -> database.mantraChapterDao().upsert( mantraChapter.copy( - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, ) ) ChatMessage( giftWrapPayloadId = null, messageType = "chapter", - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, marmotInnerEventId = marmotInnerEventId, senderPublicKey = senderPublicKey, - isUserMessage = isUserMessage, + isUserMessage = activeKeyPair.pubKey.toHex() == groupEvent.pubKey, chatRoomId = groupId, createdAt = createdAt, content = "Added ${mantraChapter.name} to chapters" // TODO: Use artifact name... @@ -753,7 +487,7 @@ data class ChatMessage( )?.let { mantraChunk -> database.mantraChunkDao().upsert( mantraChunk.copy( - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, ) ) @@ -775,7 +509,7 @@ data class ChatMessage( )?.let { mantraDialect -> database.mantraDialectDao().upsert( mantraDialect.copy( - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, ) ) @@ -783,10 +517,10 @@ data class ChatMessage( ChatMessage( giftWrapPayloadId = null, messageType = "dialect", - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, marmotInnerEventId = marmotInnerEventId, senderPublicKey = senderPublicKey, - isUserMessage = isUserMessage, + isUserMessage = activeKeyPair.pubKey.toHex() == groupEvent.pubKey, chatRoomId = groupId, createdAt = createdAt, content = "Added ${mantraDialect.name} to dialects" // TODO: Use artifact name... @@ -807,17 +541,17 @@ data class ChatMessage( )?.let { mantraTranslationArtifactVersion -> database.mantraTranslationArtifactVersionDao().upsert( mantraTranslationArtifactVersion.copy( - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, ) ) ChatMessage( giftWrapPayloadId = null, messageType = "translationArtifactVersion", - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, marmotInnerEventId = marmotInnerEventId, senderPublicKey = senderPublicKey, - isUserMessage = isUserMessage, + isUserMessage = activeKeyPair.pubKey.toHex() == groupEvent.pubKey, chatRoomId = groupId, createdAt = createdAt, content = "Added ${mantraTranslationArtifactVersion.name} to translation artifact versions" // TODO: Use artifact name... @@ -842,7 +576,7 @@ data class ChatMessage( )?.let { mantraTranslationChapter -> database.mantraTranslationChapterDao().upsert( mantraTranslationChapter.copy( - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, ) ) // TODO: translation chapter might be too noisy for chat updates @@ -863,7 +597,7 @@ data class ChatMessage( )?.let { mantraTranslationChunk -> database.mantraTranslationChunkDao().upsert( mantraTranslationChunk.copy( - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, ) ) @@ -889,16 +623,16 @@ data class ChatMessage( )?.let { mantraTranslation -> database.mantraTranslationDao().upsert( mantraTranslation.copy( - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, ) ) ChatMessage( giftWrapPayloadId = null, messageType = "translation", - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, marmotInnerEventId = marmotInnerEventId, senderPublicKey = senderPublicKey, - isUserMessage = isUserMessage, + isUserMessage = activeKeyPair.pubKey.toHex() == groupEvent.pubKey, chatRoomId = groupId, createdAt = createdAt, content = "Added ${mantraTranslation.text} to translations" // TODO: Reference original text @@ -909,10 +643,10 @@ data class ChatMessage( ChatMessage( giftWrapPayloadId = null, messageType = "unsupported", - marmotGroupEventId = marmotGroupEventId, + marmotGroupEventId = groupEvent.id, marmotInnerEventId = marmotInnerEventId, senderPublicKey = senderPublicKey, - isUserMessage = isUserMessage, + isUserMessage = activeKeyPair.pubKey.toHex() == groupEvent.pubKey, chatRoomId = groupId, createdAt = createdAt, content = event.toJson(), diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/model/MarmotInnerEvent.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/model/MarmotInnerEvent.kt index eab23cd3..a93087e9 100644 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/database/model/MarmotInnerEvent.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/database/model/MarmotInnerEvent.kt @@ -73,17 +73,6 @@ data class MarmotInnerEvent( // TODO: Rename this to GiftWrapPayload... */ val payloadEventId: HexKey? = null, - /** - * The event this one references but which has not arrived yet, or null - * when there is nothing left to wait for. - * - * Every nip30303 entity is a child of another and the database enforces - * that, so a payload cannot become a row before its parent does. Rather - * than drop one that arrives early, it is held here against the id it is - * waiting on and applied when that turns up. - */ - val awaitingEventId: HexKey? = null, - /** * Associated MarmotGroupEvent */ @@ -138,7 +127,6 @@ data class MarmotInnerEvent( // TODO: Rename this to GiftWrapPayload... if (content != other.content) return false if (quotedEventId != other.quotedEventId) return false if (payloadEventId != other.payloadEventId) return false - if (awaitingEventId != other.awaitingEventId) return false if (marmotGroupEventId != other.marmotGroupEventId) return false if (createdAt != other.createdAt) return false if (updatedAt != other.updatedAt) return false @@ -159,7 +147,6 @@ data class MarmotInnerEvent( // TODO: Rename this to GiftWrapPayload... result = 31 * result + content.hashCode() result = 31 * result + (quotedEventId?.hashCode() ?: 0) result = 31 * result + (payloadEventId?.hashCode() ?: 0) - result = 31 * result + (awaitingEventId?.hashCode() ?: 0) result = 31 * result + (marmotGroupEventId?.hashCode() ?: 0) result = 31 * result + createdAt.hashCode() result = 31 * result + updatedAt.hashCode() diff --git a/composeApp/src/commonTest/kotlin/press/mantra/compose/database/model/ParentRefsTest.kt b/composeApp/src/commonTest/kotlin/press/mantra/compose/database/model/ParentRefsTest.kt deleted file mode 100644 index c19e650c..00000000 --- a/composeApp/src/commonTest/kotlin/press/mantra/compose/database/model/ParentRefsTest.kt +++ /dev/null @@ -1,167 +0,0 @@ -package press.mantra.compose.database.model - -import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.assertTrue -import press.mantra.compose.nostr.nip30303.ArtifactEvent -import press.mantra.compose.nostr.nip30303.ArtifactVersionEvent -import press.mantra.compose.nostr.nip30303.ChapterEvent -import press.mantra.compose.nostr.nip30303.ChunkEvent -import press.mantra.compose.nostr.nip30303.DialectEvent -import press.mantra.compose.nostr.nip30303.TranslationArtifactVersionEvent -import press.mantra.compose.nostr.nip30303.TranslationChapterEvent -import press.mantra.compose.nostr.nip30303.TranslationChunkEvent -import press.mantra.compose.nostr.nip30303.tags.ArtifactIdTag - -/** - * What the inbound side must wait for before it writes a row. - * - * These have to match the foreign keys on the Mantra* entities exactly. A - * parent claimed here that the schema does not enforce holds a payload back - * for nothing; one the schema enforces but that is missing here is an insert - * that violates a constraint, and SQLite answers that by rolling back the - * whole inbound transaction -- losing the group event, the submission and the - * transcript line, none of which is ever retried. So the mapping is asserted - * rather than trusted to stay in step. - */ -class ParentRefsTest { - private val author = "a".repeat(64) - private val dialect = "d".repeat(64) - private val artifact = "1".repeat(64) - private val version = "2".repeat(64) - private val chapter = "3".repeat(64) - private val chunk = "4".repeat(64) - private val translationVersion = "5".repeat(64) - private val translationChapter = "6".repeat(64) - - private fun eventOf(template: EventTemplate<*>) = Event( - id = "f".repeat(64), - pubKey = author, - createdAt = template.createdAt, - kind = template.kind, - tags = template.tags, - content = template.content, - sig = "", - ) - - private fun refsOf(template: EventTemplate<*>) = - ChatMessage.parentRefsOf(eventOf(template)).map { it.id to it.kind } - - @Test - fun `an artifact waits for its dialect`() { - val refs = refsOf( - ArtifactEvent.build( - name = "In Detention", - url = "example.com", - visibility = "private", - license = "cc", - dialectId = dialect, - ) - ) - - assertEquals(listOf(dialect to DialectEvent.KIND), refs) - } - - @Test - fun `a version waits for its artifact`() { - val refs = refsOf( - ArtifactVersionEvent.build(content = "1.0") { - addUnique(ArtifactIdTag.assemble(artifact)) - } - ) - - assertEquals(listOf(artifact to ArtifactEvent.KIND), refs) - } - - @Test - fun `a chapter waits for its version and a chunk for its chapter`() { - val chapterRefs = refsOf( - ChapterEvent.build( - artifactVersionId = version, - name = "Chapter 1", - originalText = "text", - index = 0, - wordCount = 1, - characterCount = 4, - ) - ) - val chunkRefs = refsOf( - ChunkEvent.build( - chapterId = chapter, - text = "text", - index = 0, - wordCount = 1, - characterCount = 4, - ) - ) - - assertEquals(listOf(version to ArtifactVersionEvent.KIND), chapterRefs) - assertEquals(listOf(chapter to ChapterEvent.KIND), chunkRefs) - } - - @Test - fun `a translation waits for both of its parents`() { - val refs = refsOf( - TranslationArtifactVersionEvent.build( - artifactVersionId = version, - dialectId = dialect, - name = "Sesotho", - visibility = "private", - license = "cc", - ) - ) - - assertEquals( - listOf( - version to ArtifactVersionEvent.KIND, - dialect to DialectEvent.KIND, - ), - refs - ) - } - - @Test - fun `a translated chapter and chunk each wait for both of their parents`() { - val chapterRefs = refsOf( - TranslationChapterEvent.build( - translationArtifactVersionId = translationVersion, - chapterId = chapter, - index = 0, - ) - ) - val chunkRefs = refsOf( - TranslationChunkEvent.build( - translationChapterId = translationChapter, - chunkId = chunk, - index = 0, - text = "translated", - ) - ) - - assertEquals( - listOf( - translationVersion to TranslationArtifactVersionEvent.KIND, - chapter to ChapterEvent.KIND, - ), - chapterRefs - ) - assertEquals( - listOf( - translationChapter to TranslationChapterEvent.KIND, - chunk to ChunkEvent.KIND, - ), - chunkRefs - ) - } - - @Test - fun `a dialect waits for nothing, so it can always start a group off`() { - val refs = refsOf( - DialectEvent.build(name = "Sesotho", country = "Lesotho", language = "st") - ) - - assertTrue(refs.isEmpty()) - } -}