Refactor: Move data-access code to Typescript w/ shared interface
This commit is contained in:
parent
9ab54b9b83
commit
6b094e1514
35 changed files with 1695 additions and 598 deletions
382
ts/sql/Interface.ts
Normal file
382
ts/sql/Interface.ts
Normal file
|
@ -0,0 +1,382 @@
|
|||
import { LocaleMessagesType } from '../types/I18N';
|
||||
|
||||
export type AttachmentDownloadJobType = any;
|
||||
export type ConverationMetricsType = any;
|
||||
export type ConversationType = any;
|
||||
export type EmojiType = any;
|
||||
export type IdentityKeyType = any;
|
||||
export type ItemType = any;
|
||||
export type MessageType = any;
|
||||
export type MessageTypeUnhydrated = any;
|
||||
export type PreKeyType = any;
|
||||
export type SearchResultMessageType = any;
|
||||
export type SessionType = any;
|
||||
export type SignedPreKeyType = any;
|
||||
export type StickerPackStatusType = string;
|
||||
export type StickerPackType = any;
|
||||
export type StickerType = any;
|
||||
export type UnprocessedType = any;
|
||||
|
||||
export type BackboneConversationModelType = any;
|
||||
export type BackboneConversationCollectionType = any;
|
||||
export type BackboneMessageModelType = any;
|
||||
export type BackboneMessageCollectionType = any;
|
||||
|
||||
export interface DataInterface {
|
||||
close: () => Promise<void>;
|
||||
removeDB: () => Promise<void>;
|
||||
removeIndexedDBFiles: () => Promise<void>;
|
||||
|
||||
createOrUpdateIdentityKey: (data: IdentityKeyType) => Promise<void>;
|
||||
getIdentityKeyById: (id: string) => Promise<IdentityKeyType | undefined>;
|
||||
bulkAddIdentityKeys: (array: Array<IdentityKeyType>) => Promise<void>;
|
||||
removeIdentityKeyById: (id: string) => Promise<void>;
|
||||
removeAllIdentityKeys: () => Promise<void>;
|
||||
getAllIdentityKeys: () => Promise<Array<IdentityKeyType>>;
|
||||
|
||||
createOrUpdatePreKey: (data: PreKeyType) => Promise<void>;
|
||||
getPreKeyById: (id: number) => Promise<PreKeyType | undefined>;
|
||||
bulkAddPreKeys: (array: Array<PreKeyType>) => Promise<void>;
|
||||
removePreKeyById: (id: number) => Promise<void>;
|
||||
removeAllPreKeys: () => Promise<void>;
|
||||
getAllPreKeys: () => Promise<Array<PreKeyType>>;
|
||||
|
||||
createOrUpdateSignedPreKey: (data: SignedPreKeyType) => Promise<void>;
|
||||
getSignedPreKeyById: (id: number) => Promise<SignedPreKeyType | undefined>;
|
||||
bulkAddSignedPreKeys: (array: Array<SignedPreKeyType>) => Promise<void>;
|
||||
removeSignedPreKeyById: (id: number) => Promise<void>;
|
||||
removeAllSignedPreKeys: () => Promise<void>;
|
||||
getAllSignedPreKeys: () => Promise<Array<SignedPreKeyType>>;
|
||||
|
||||
createOrUpdateItem: (data: ItemType) => Promise<void>;
|
||||
getItemById: (id: string) => Promise<ItemType | undefined>;
|
||||
bulkAddItems: (array: Array<ItemType>) => Promise<void>;
|
||||
removeItemById: (id: string) => Promise<void>;
|
||||
removeAllItems: () => Promise<void>;
|
||||
getAllItems: () => Promise<Array<ItemType>>;
|
||||
|
||||
createOrUpdateSession: (data: SessionType) => Promise<void>;
|
||||
createOrUpdateSessions: (array: Array<SessionType>) => Promise<void>;
|
||||
getSessionById: (id: string) => Promise<SessionType | undefined>;
|
||||
getSessionsById: (conversationId: string) => Promise<Array<SessionType>>;
|
||||
bulkAddSessions: (array: Array<SessionType>) => Promise<void>;
|
||||
removeSessionById: (id: string) => Promise<void>;
|
||||
removeSessionsByConversation: (conversationId: string) => Promise<void>;
|
||||
removeAllSessions: () => Promise<void>;
|
||||
getAllSessions: () => Promise<Array<SessionType>>;
|
||||
|
||||
getConversationCount: () => Promise<number>;
|
||||
saveConversation: (data: ConversationType) => Promise<void>;
|
||||
saveConversations: (array: Array<ConversationType>) => Promise<void>;
|
||||
updateConversations: (array: Array<ConversationType>) => Promise<void>;
|
||||
getAllConversationIds: () => Promise<Array<string>>;
|
||||
|
||||
searchConversations: (
|
||||
query: string,
|
||||
options?: { limit?: number }
|
||||
) => Promise<Array<ConversationType>>;
|
||||
searchMessages: (
|
||||
query: string,
|
||||
options?: { limit?: number }
|
||||
) => Promise<Array<SearchResultMessageType>>;
|
||||
searchMessagesInConversation: (
|
||||
query: string,
|
||||
conversationId: string,
|
||||
options?: { limit?: number }
|
||||
) => Promise<Array<SearchResultMessageType>>;
|
||||
|
||||
getMessageCount: () => Promise<number>;
|
||||
saveMessages: (
|
||||
arrayOfMessages: Array<MessageType>,
|
||||
options: { forceSave?: boolean }
|
||||
) => Promise<void>;
|
||||
getAllMessageIds: () => Promise<Array<string>>;
|
||||
getMessageMetricsForConversation: (
|
||||
conversationId: string
|
||||
) => Promise<ConverationMetricsType>;
|
||||
|
||||
getUnprocessedCount: () => Promise<number>;
|
||||
getAllUnprocessed: () => Promise<Array<UnprocessedType>>;
|
||||
saveUnprocessed: (
|
||||
data: UnprocessedType,
|
||||
options?: { forceSave?: boolean }
|
||||
) => Promise<number>;
|
||||
updateUnprocessedAttempts: (id: string, attempts: number) => Promise<void>;
|
||||
updateUnprocessedWithData: (
|
||||
id: string,
|
||||
data: UnprocessedType
|
||||
) => Promise<void>;
|
||||
updateUnprocessedsWithData: (array: Array<UnprocessedType>) => Promise<void>;
|
||||
getUnprocessedById: (id: string) => Promise<UnprocessedType | undefined>;
|
||||
saveUnprocesseds: (
|
||||
arrayOfUnprocessed: Array<UnprocessedType>,
|
||||
options?: { forceSave?: boolean }
|
||||
) => Promise<void>;
|
||||
removeUnprocessed: (id: string) => Promise<void>;
|
||||
removeAllUnprocessed: () => Promise<void>;
|
||||
|
||||
getNextAttachmentDownloadJobs: (
|
||||
limit?: number,
|
||||
options?: { timestamp?: number }
|
||||
) => Promise<Array<AttachmentDownloadJobType>>;
|
||||
saveAttachmentDownloadJob: (job: AttachmentDownloadJobType) => Promise<void>;
|
||||
setAttachmentDownloadJobPending: (
|
||||
id: string,
|
||||
pending: boolean
|
||||
) => Promise<void>;
|
||||
resetAttachmentDownloadPending: () => Promise<void>;
|
||||
removeAttachmentDownloadJob: (id: string) => Promise<void>;
|
||||
removeAllAttachmentDownloadJobs: () => Promise<void>;
|
||||
|
||||
createOrUpdateStickerPack: (pack: StickerPackType) => Promise<void>;
|
||||
updateStickerPackStatus: (
|
||||
id: string,
|
||||
status: StickerPackStatusType,
|
||||
options?: { timestamp: number }
|
||||
) => Promise<void>;
|
||||
createOrUpdateSticker: (sticker: StickerType) => Promise<void>;
|
||||
updateStickerLastUsed: (
|
||||
packId: string,
|
||||
stickerId: number,
|
||||
lastUsed: number
|
||||
) => Promise<void>;
|
||||
addStickerPackReference: (messageId: string, packId: string) => Promise<void>;
|
||||
deleteStickerPackReference: (
|
||||
messageId: string,
|
||||
packId: string
|
||||
) => Promise<Array<string>>;
|
||||
getStickerCount: () => Promise<number>;
|
||||
deleteStickerPack: (packId: string) => Promise<Array<string>>;
|
||||
getAllStickerPacks: () => Promise<Array<StickerPackType>>;
|
||||
getAllStickers: () => Promise<Array<StickerType>>;
|
||||
getRecentStickers: (options?: {
|
||||
limit?: number;
|
||||
}) => Promise<Array<StickerType>>;
|
||||
|
||||
updateEmojiUsage: (shortName: string, timeUsed?: number) => Promise<void>;
|
||||
getRecentEmojis: (limit?: number) => Promise<Array<EmojiType>>;
|
||||
|
||||
removeAll: () => Promise<void>;
|
||||
removeAllConfiguration: () => Promise<void>;
|
||||
|
||||
getMessagesNeedingUpgrade: (
|
||||
limit: number,
|
||||
options: { maxVersion: number }
|
||||
) => Promise<Array<MessageType>>;
|
||||
getMessagesWithVisualMediaAttachments: (
|
||||
conversationId: string,
|
||||
options: { limit: number }
|
||||
) => Promise<Array<MessageType>>;
|
||||
getMessagesWithFileAttachments: (
|
||||
conversationId: string,
|
||||
options: { limit: number }
|
||||
) => Promise<Array<MessageType>>;
|
||||
}
|
||||
|
||||
// The reason for client/server divergence is the need to inject Backbone models and
|
||||
// collections into data calls so those are the objects returned. This was necessary in
|
||||
// July 2018 when creating the Data API as a drop-in replacement for previous database
|
||||
// requests via ORM.
|
||||
|
||||
// Note: It is extremely important that items are duplicated between these two. Client.js
|
||||
// loops over all of its local functions to generate the server-side IPC-based API.
|
||||
|
||||
export type ServerInterface = DataInterface & {
|
||||
getAllConversations: () => Promise<Array<ConversationType>>;
|
||||
getAllGroupsInvolvingId: (id: string) => Promise<Array<ConversationType>>;
|
||||
getAllPrivateConversations: () => Promise<Array<ConversationType>>;
|
||||
getConversationById: (id: string) => Promise<ConversationType>;
|
||||
getExpiredMessages: () => Promise<Array<MessageType>>;
|
||||
getMessageById: (id: string) => Promise<MessageType | undefined>;
|
||||
getMessageBySender: (options: {
|
||||
source: string;
|
||||
sourceUuid: string;
|
||||
sourceDevice: string;
|
||||
sent_at: number;
|
||||
}) => Promise<Array<MessageType>>;
|
||||
getMessagesBySentAt: (sentAt: number) => Promise<Array<MessageType>>;
|
||||
getOlderMessagesByConversation: (
|
||||
conversationId: string,
|
||||
options?: { limit?: number; receivedAt?: number }
|
||||
) => Promise<Array<MessageTypeUnhydrated>>;
|
||||
getNewerMessagesByConversation: (
|
||||
conversationId: string,
|
||||
options?: { limit?: number; receivedAt?: number }
|
||||
) => Promise<Array<MessageTypeUnhydrated>>;
|
||||
getNextExpiringMessage: () => Promise<MessageType>;
|
||||
getNextTapToViewMessageToAgeOut: () => Promise<MessageType>;
|
||||
getOutgoingWithoutExpiresAt: () => Promise<Array<MessageType>>;
|
||||
getTapToViewMessagesNeedingErase: () => Promise<Array<MessageType>>;
|
||||
getUnreadByConversation: (
|
||||
conversationId: string
|
||||
) => Promise<Array<MessageType>>;
|
||||
removeConversation: (id: Array<string> | string) => Promise<void>;
|
||||
removeMessage: (id: Array<string> | string) => Promise<void>;
|
||||
saveMessage: (
|
||||
data: MessageType,
|
||||
options: { forceSave?: boolean }
|
||||
) => Promise<number>;
|
||||
updateConversation: (data: ConversationType) => Promise<void>;
|
||||
|
||||
// For testing only
|
||||
_getAllMessages: () => Promise<Array<MessageType>>;
|
||||
|
||||
// Server-only
|
||||
|
||||
initialize: (options: {
|
||||
configDir: string;
|
||||
key: string;
|
||||
messages: LocaleMessagesType;
|
||||
}) => Promise<boolean>;
|
||||
|
||||
removeKnownAttachments: (
|
||||
allAttachments: Array<string>
|
||||
) => Promise<Array<string>>;
|
||||
removeKnownStickers: (allStickers: Array<string>) => Promise<Array<string>>;
|
||||
removeKnownDraftAttachments: (
|
||||
allStickers: Array<string>
|
||||
) => Promise<Array<string>>;
|
||||
};
|
||||
|
||||
export type ClientInterface = DataInterface & {
|
||||
getAllConversations: ({
|
||||
ConversationCollection,
|
||||
}: {
|
||||
ConversationCollection: BackboneConversationCollectionType;
|
||||
}) => Promise<Array<ConversationType>>;
|
||||
getAllGroupsInvolvingId: (
|
||||
id: string,
|
||||
{
|
||||
ConversationCollection,
|
||||
}: {
|
||||
ConversationCollection: BackboneConversationCollectionType;
|
||||
}
|
||||
) => Promise<Array<ConversationType>>;
|
||||
getAllPrivateConversations: ({
|
||||
ConversationCollection,
|
||||
}: {
|
||||
ConversationCollection: BackboneConversationCollectionType;
|
||||
}) => Promise<Array<ConversationType>>;
|
||||
getConversationById: (
|
||||
id: string,
|
||||
{ Conversation }: { Conversation: BackboneConversationModelType }
|
||||
) => Promise<ConversationType>;
|
||||
getExpiredMessages: ({
|
||||
MessageCollection,
|
||||
}: {
|
||||
MessageCollection: BackboneMessageCollectionType;
|
||||
}) => Promise<Array<MessageType>>;
|
||||
getMessageById: (
|
||||
id: string,
|
||||
{ Message }: { Message: BackboneMessageModelType }
|
||||
) => Promise<MessageType | undefined>;
|
||||
getMessageBySender: (
|
||||
options: {
|
||||
source: string;
|
||||
sourceUuid: string;
|
||||
sourceDevice: string;
|
||||
sent_at: number;
|
||||
},
|
||||
{ Message }: { Message: BackboneMessageModelType }
|
||||
) => Promise<Array<MessageType>>;
|
||||
getMessagesBySentAt: (
|
||||
sentAt: number,
|
||||
{ MessageCollection }: { MessageCollection: BackboneMessageCollectionType }
|
||||
) => Promise<Array<MessageType>>;
|
||||
getOlderMessagesByConversation: (
|
||||
conversationId: string,
|
||||
options: {
|
||||
limit?: number;
|
||||
receivedAt?: number;
|
||||
MessageCollection: BackboneMessageCollectionType;
|
||||
}
|
||||
) => Promise<Array<MessageTypeUnhydrated>>;
|
||||
getNewerMessagesByConversation: (
|
||||
conversationId: string,
|
||||
options: {
|
||||
limit?: number;
|
||||
receivedAt?: number;
|
||||
MessageCollection: BackboneMessageCollectionType;
|
||||
}
|
||||
) => Promise<Array<MessageTypeUnhydrated>>;
|
||||
getNextExpiringMessage: ({
|
||||
Message,
|
||||
}: {
|
||||
Message: BackboneMessageModelType;
|
||||
}) => Promise<MessageType>;
|
||||
getNextTapToViewMessageToAgeOut: ({
|
||||
Message,
|
||||
}: {
|
||||
Message: BackboneMessageModelType;
|
||||
}) => Promise<MessageType>;
|
||||
getOutgoingWithoutExpiresAt: ({
|
||||
MessageCollection,
|
||||
}: {
|
||||
MessageCollection: BackboneMessageCollectionType;
|
||||
}) => Promise<Array<MessageType>>;
|
||||
getTapToViewMessagesNeedingErase: ({
|
||||
MessageCollection,
|
||||
}: {
|
||||
MessageCollection: BackboneMessageCollectionType;
|
||||
}) => Promise<Array<MessageType>>;
|
||||
getUnreadByConversation: (
|
||||
conversationId: string,
|
||||
{ MessageCollection }: { MessageCollection: BackboneMessageCollectionType }
|
||||
) => Promise<Array<MessageType>>;
|
||||
removeConversation: (
|
||||
id: string,
|
||||
{ Conversation }: { Conversation: BackboneConversationModelType }
|
||||
) => Promise<void>;
|
||||
removeMessage: (
|
||||
id: string,
|
||||
{ Message }: { Message: BackboneMessageModelType }
|
||||
) => Promise<void>;
|
||||
saveMessage: (
|
||||
data: MessageType,
|
||||
options: { forceSave?: boolean; Message: BackboneMessageModelType }
|
||||
) => Promise<number>;
|
||||
updateConversation: (data: ConversationType) => void;
|
||||
|
||||
// Test-only
|
||||
|
||||
_getAllMessages: ({
|
||||
MessageCollection,
|
||||
}: {
|
||||
MessageCollection: BackboneMessageCollectionType;
|
||||
}) => Promise<Array<MessageType>>;
|
||||
|
||||
// Client-side only
|
||||
|
||||
shutdown: () => Promise<void>;
|
||||
removeAllMessagesInConversation: (
|
||||
conversationId: string,
|
||||
{ MessageCollection }: { MessageCollection: BackboneMessageCollectionType }
|
||||
) => Promise<void>;
|
||||
removeOtherData: () => Promise<void>;
|
||||
cleanupOrphanedAttachments: () => Promise<void>;
|
||||
ensureFilePermissions: () => Promise<void>;
|
||||
|
||||
getLegacyMessagesNeedingUpgrade: (
|
||||
limit: number,
|
||||
options: { maxVersion: number }
|
||||
) => Promise<Array<MessageType>>;
|
||||
saveLegacyMessage: (data: MessageType) => Promise<void>;
|
||||
|
||||
// Client-side only, and test-only
|
||||
|
||||
_removeConversations: (ids: Array<string>) => Promise<void>;
|
||||
_removeMessages: (ids: Array<string>) => Promise<void>;
|
||||
_cleanData: (data: any, path?: string) => any;
|
||||
_jobs: { [id: string]: ClientJobType };
|
||||
};
|
||||
|
||||
export type ClientJobType = {
|
||||
fnName: string;
|
||||
start: number;
|
||||
resolve?: Function;
|
||||
reject?: Function;
|
||||
|
||||
// Only in DEBUG mode
|
||||
complete?: boolean;
|
||||
args?: Array<any>;
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue