Migrate messages, conversations, conversation_view, background to TS

Co-authored-by: Sidney Keese <sidney@carbonfive.com>
This commit is contained in:
Chris Svenningsen 2020-09-24 13:57:54 -07:00 committed by Josh Perez
parent 6e7930f7a9
commit b5df9b4067
42 changed files with 11676 additions and 10516 deletions

View file

@ -21,9 +21,7 @@ import { createBatcher } from '../util/batcher';
import {
ConversationModelCollectionType,
ConversationModelType,
MessageModelCollectionType,
MessageModelType,
} from '../model-types.d';
import {
@ -45,6 +43,8 @@ import {
StickerType,
UnprocessedType,
} from './Interface';
import { MessageModel } from '../models/messages';
import { ConversationModel } from '../models/conversations';
// We listen to a lot of events on ipcRenderer, often on the same channel. This prevents
// any warnings that might be sent to the console in that case.
@ -726,7 +726,7 @@ async function saveConversations(array: Array<ConversationType>) {
async function getConversationById(
id: string,
{ Conversation }: { Conversation: typeof ConversationModelType }
{ Conversation }: { Conversation: typeof ConversationModel }
) {
const data = await channels.getConversationById(id);
@ -756,7 +756,7 @@ async function updateConversations(array: Array<ConversationType>) {
async function removeConversation(
id: string,
{ Conversation }: { Conversation: typeof ConversationModelType }
{ Conversation }: { Conversation: typeof ConversationModel }
) {
const existing = await getConversationById(id, { Conversation });
@ -869,10 +869,7 @@ async function getMessageCount(conversationId?: string) {
async function saveMessage(
data: MessageType,
{
forceSave,
Message,
}: { forceSave?: boolean; Message: typeof MessageModelType }
{ forceSave, Message }: { forceSave?: boolean; Message: typeof MessageModel }
) {
const id = await channels.saveMessage(_cleanData(data), { forceSave });
Message.updateTimers();
@ -889,7 +886,7 @@ async function saveMessages(
async function removeMessage(
id: string,
{ Message }: { Message: typeof MessageModelType }
{ Message }: { Message: typeof MessageModel }
) {
const message = await getMessageById(id, { Message });
@ -908,7 +905,7 @@ async function _removeMessages(ids: Array<string>) {
async function getMessageById(
id: string,
{ Message }: { Message: typeof MessageModelType }
{ Message }: { Message: typeof MessageModel }
) {
const message = await channels.getMessageById(id);
if (!message) {
@ -947,7 +944,7 @@ async function getMessageBySender(
sourceDevice: string;
sent_at: number;
},
{ Message }: { Message: typeof MessageModelType }
{ Message }: { Message: typeof MessageModel }
) {
const messages = await channels.getMessageBySender({
source,
@ -1027,9 +1024,9 @@ async function getNewerMessagesByConversation(
async function getLastConversationActivity(
conversationId: string,
options: {
Message: typeof MessageModelType;
Message: typeof MessageModel;
}
): Promise<MessageModelType | undefined> {
): Promise<MessageModel | undefined> {
const { Message } = options;
const result = await channels.getLastConversationActivity(conversationId);
if (result) {
@ -1040,9 +1037,9 @@ async function getLastConversationActivity(
async function getLastConversationPreview(
conversationId: string,
options: {
Message: typeof MessageModelType;
Message: typeof MessageModel;
}
): Promise<MessageModelType | undefined> {
): Promise<MessageModel | undefined> {
const { Message } = options;
const result = await channels.getLastConversationPreview(conversationId);
if (result) {
@ -1083,12 +1080,12 @@ async function removeAllMessagesInConversation(
return;
}
const ids = messages.map((message: MessageModelType) => message.id);
const ids = messages.map((message: MessageModel) => message.id);
// Note: It's very important that these models are fully hydrated because
// we need to delete all associated on-disk files along with the database delete.
await Promise.all(
messages.map(async (message: MessageModelType) => message.cleanup())
messages.map(async (message: MessageModel) => message.cleanup())
);
await channels.removeMessage(ids);
@ -1129,7 +1126,7 @@ async function getOutgoingWithoutExpiresAt({
async function getNextExpiringMessage({
Message,
}: {
Message: typeof MessageModelType;
Message: typeof MessageModel;
}) {
const message = await channels.getNextExpiringMessage();
@ -1143,7 +1140,7 @@ async function getNextExpiringMessage({
async function getNextTapToViewMessageToAgeOut({
Message,
}: {
Message: typeof MessageModelType;
Message: typeof MessageModel;
}) {
const message = await channels.getNextTapToViewMessageToAgeOut();
if (!message) {

View file

@ -19,10 +19,10 @@ export type UnprocessedType = any;
import {
ConversationModelCollectionType,
ConversationModelType,
MessageModelCollectionType,
MessageModelType,
} from '../model-types.d';
import { MessageModel } from '../models/messages';
import { ConversationModel } from '../models/conversations';
export interface DataInterface {
close: () => Promise<void>;
@ -204,7 +204,11 @@ export type ServerInterface = DataInterface & {
getMessagesBySentAt: (sentAt: number) => Promise<Array<MessageType>>;
getOlderMessagesByConversation: (
conversationId: string,
options?: { limit?: number; receivedAt?: number; messageId?: string }
options?: {
limit?: number;
receivedAt?: number;
messageId?: string;
}
) => Promise<Array<MessageTypeUnhydrated>>;
getNewerMessagesByConversation: (
conversationId: string,
@ -228,7 +232,7 @@ export type ServerInterface = DataInterface & {
saveMessage: (
data: MessageType,
options: { forceSave?: boolean }
) => Promise<number>;
) => Promise<string>;
updateConversation: (data: ConversationType) => Promise<void>;
// For testing only
@ -272,8 +276,8 @@ export type ClientInterface = DataInterface & {
}) => Promise<ConversationModelCollectionType>;
getConversationById: (
id: string,
{ Conversation }: { Conversation: typeof ConversationModelType }
) => Promise<ConversationModelType>;
{ Conversation }: { Conversation: typeof ConversationModel }
) => Promise<ConversationModel>;
getExpiredMessages: ({
MessageCollection,
}: {
@ -281,7 +285,7 @@ export type ClientInterface = DataInterface & {
}) => Promise<MessageModelCollectionType>;
getMessageById: (
id: string,
{ Message }: { Message: typeof MessageModelType }
{ Message }: { Message: typeof MessageModel }
) => Promise<MessageType | undefined>;
getMessageBySender: (
options: {
@ -290,8 +294,8 @@ export type ClientInterface = DataInterface & {
sourceDevice: string;
sent_at: number;
},
{ Message }: { Message: typeof MessageModelType }
) => Promise<MessageModelType | null>;
{ Message }: { Message: typeof MessageModel }
) => Promise<MessageModel | null>;
getMessagesBySentAt: (
sentAt: number,
{
@ -302,6 +306,7 @@ export type ClientInterface = DataInterface & {
conversationId: string,
options: {
limit?: number;
messageId?: string;
receivedAt?: number;
MessageCollection: typeof MessageModelCollectionType;
}
@ -317,25 +322,25 @@ export type ClientInterface = DataInterface & {
getLastConversationActivity: (
conversationId: string,
options: {
Message: typeof MessageModelType;
Message: typeof MessageModel;
}
) => Promise<MessageModelType | undefined>;
) => Promise<MessageModel | undefined>;
getLastConversationPreview: (
conversationId: string,
options: {
Message: typeof MessageModelType;
Message: typeof MessageModel;
}
) => Promise<MessageModelType | undefined>;
) => Promise<MessageModel | undefined>;
getNextExpiringMessage: ({
Message,
}: {
Message: typeof MessageModelType;
}) => Promise<MessageModelType | null>;
Message: typeof MessageModel;
}) => Promise<MessageModel | null>;
getNextTapToViewMessageToAgeOut: ({
Message,
}: {
Message: typeof MessageModelType;
}) => Promise<MessageModelType | null>;
Message: typeof MessageModel;
}) => Promise<MessageModel | null>;
getOutgoingWithoutExpiresAt: ({
MessageCollection,
}: {
@ -354,17 +359,17 @@ export type ClientInterface = DataInterface & {
) => Promise<MessageModelCollectionType>;
removeConversation: (
id: string,
{ Conversation }: { Conversation: typeof ConversationModelType }
{ Conversation }: { Conversation: typeof ConversationModel }
) => Promise<void>;
removeMessage: (
id: string,
{ Message }: { Message: typeof MessageModelType }
{ Message }: { Message: typeof MessageModel }
) => Promise<void>;
saveMessage: (
data: MessageType,
options: { forceSave?: boolean; Message: typeof MessageModelType }
) => Promise<number>;
updateConversation: (data: ConversationType) => void;
options: { forceSave?: boolean; Message: typeof MessageModel }
) => Promise<string>;
updateConversation: (data: ConversationType, extra?: unknown) => void;
// Test-only

View file

@ -2674,7 +2674,11 @@ async function getOlderMessagesByConversation(
limit = 100,
receivedAt = Number.MAX_VALUE,
messageId,
}: { limit?: number; receivedAt?: number; messageId?: string } = {}
}: {
limit?: number;
receivedAt?: number;
messageId?: string;
} = {}
) {
const db = getInstance();
let rows;