Skip to content

Commit a3e823b

Browse files
committed
refactor: introduce selectDraftMessageFromDraft
1 parent 77377a3 commit a3e823b

File tree

5 files changed

+60
-29
lines changed

5 files changed

+60
-29
lines changed

package/src/store/apis/getDraft.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { selectDraftMessageFromDraft } from './queries/selectDraftMessageFromDraft';
12
import { selectMessageForId } from './queries/selectMessageById';
23

34
import { mapStorableToDraft } from '../mappers/mapStorableToDraft';
@@ -16,23 +17,18 @@ export const getDraft = async ({
1617
}) => {
1718
SqliteClient.logger?.('info', 'getDraft', { cid, parent_id });
1819

19-
const query = createSelectQuery('draft', ['*'], { cid, parentId: parent_id });
20+
const draftRowsWithMessage = await selectDraftMessageFromDraft([cid]);
2021

21-
const rows = await SqliteClient.executeSql.apply(null, query);
22+
const draftRowWithMessage = draftRowsWithMessage[0];
2223

23-
if (!rows.length) return null;
24-
25-
const draftRow = rows[0];
26-
27-
const draftMessageQuery = createSelectQuery('draftMessage', ['*'], {
28-
id: draftRow.draftMessageId,
29-
});
30-
const draftMessageRows = await SqliteClient.executeSql.apply(null, draftMessageQuery);
24+
if (!draftRowWithMessage) {
25+
return undefined;
26+
}
3127

3228
const channelQuery = createSelectQuery('channels', ['*'], { cid });
3329
const channelRows = await SqliteClient.executeSql.apply(null, channelQuery);
3430

35-
const quotedMessageRows = await selectMessageForId(draftRow.quotedMessageId);
31+
const quotedMessageRows = await selectMessageForId(draftRowWithMessage.quotedMessageId);
3632

3733
const polls = (await SqliteClient.executeSql.apply(
3834
null,
@@ -44,8 +40,7 @@ export const getDraft = async ({
4440
return mapStorableToDraft({
4541
channelRow: channelRows[0] as unknown as TableRow<'channels'>,
4642
currentUserId,
47-
draftMessageRow: draftMessageRows[0] as unknown as TableRow<'draftMessage'>,
48-
draftRow: draftRow as unknown as TableRow<'draft'>,
43+
draftRow: draftRowWithMessage,
4944
pollRow: polls[0],
5045
quotedMessageRow: quotedMessageRows,
5146
});

package/src/store/apis/getDraftsForChannels.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { DraftResponse } from 'stream-chat';
22

3+
import { selectDraftMessageFromDraft } from './queries/selectDraftMessageFromDraft';
34
import { selectMessageForId } from './queries/selectMessageById';
45

56
import { mapStorableToDraft } from '../mappers/mapStorableToDraft';
@@ -16,25 +17,18 @@ export const getDraftForChannels = async ({
1617
}) => {
1718
SqliteClient.logger?.('info', 'getDraftsForChannel', { channelIds });
1819

19-
const query = createSelectQuery('draft', ['*'], { cid: channelIds });
20-
21-
const rows = await SqliteClient.executeSql.apply(null, query);
20+
const draftRowsWithMessage = await selectDraftMessageFromDraft(channelIds);
2221

2322
/**
2423
* Filter out drafts without a parent ID, as we will not show them in the channel.
2524
* The above `createSelectQuery` was not able to filter out drafts without a parent ID.
2625
* TODO: Fix the query to filter out drafts without a parent ID. This can be a bit faster.
2726
*/
28-
const rowsWithoutParentID = rows.filter((row) => row.parentId === null);
27+
const rowsWithoutParentID = draftRowsWithMessage.filter((row) => row.parentId === null);
2928

3029
const cidVsDrafts: Record<string, DraftResponse> = {};
3130

3231
for (const row of rowsWithoutParentID) {
33-
const draftMessageQuery = createSelectQuery('draftMessage', ['*'], {
34-
id: row.draftMessageId,
35-
});
36-
const draftMessageRows = await SqliteClient.executeSql.apply(null, draftMessageQuery);
37-
3832
const channelQuery = createSelectQuery('channels', ['*'], { cid: row.cid });
3933
const channelRows = await SqliteClient.executeSql.apply(null, channelQuery);
4034

@@ -50,8 +44,7 @@ export const getDraftForChannels = async ({
5044
cidVsDrafts[row.cid] = mapStorableToDraft({
5145
channelRow: channelRows[0] as unknown as TableRow<'channels'>,
5246
currentUserId,
53-
draftMessageRow: draftMessageRows[0] as unknown as TableRow<'draftMessage'>,
54-
draftRow: row as unknown as TableRow<'draft'>,
47+
draftRow: row,
5548
pollRow: polls[0],
5649
quotedMessageRow,
5750
});
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { tables } from '../../schema';
2+
import { SqliteClient } from '../../SqliteClient';
3+
import type { TableRowJoinedDraftMessage } from '../../types';
4+
5+
export const selectDraftMessageFromDraft = async (
6+
cids?: string[],
7+
): Promise<TableRowJoinedDraftMessage<'draft'>[]> => {
8+
if (!cids || cids.length === 0) {
9+
return [];
10+
}
11+
12+
const questionMarks = Array(cids.length).fill('?').join(',');
13+
const draftColumnNames = Object.keys(tables.draft.columns)
14+
.map((name) => `'${name}', a.${name}`)
15+
.join(', ');
16+
const draftMessageColumnNames = Object.keys(tables.draftMessage.columns)
17+
.map((name) => `'${name}', b.${name}`)
18+
.join(', ');
19+
20+
SqliteClient.logger?.('info', 'selectDraft', {
21+
cids,
22+
});
23+
24+
const result = await SqliteClient.executeSql(
25+
`SELECT
26+
json_object(
27+
'draftMessage', json_object(
28+
${draftMessageColumnNames}
29+
),
30+
${draftColumnNames}
31+
) as value
32+
FROM draft a
33+
LEFT JOIN
34+
draftMessage b
35+
ON b.id = a.draftMessageId
36+
WHERE cid in (${questionMarks}) ORDER BY datetime(a.createdAt) DESC`,
37+
cids,
38+
);
39+
40+
return result.map((r) => JSON.parse(r.value));
41+
};

package/src/store/mappers/mapStorableToDraft.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,24 @@ import { mapStorableToDraftMessage } from './mapStorableToDraftMessage';
55

66
import { mapStorableToMessage } from './mapStorableToMessage';
77

8-
import type { TableRow, TableRowJoinedUser } from '../types';
8+
import type { TableRow, TableRowJoinedDraftMessage, TableRowJoinedUser } from '../types';
99

1010
export const mapStorableToDraft = ({
1111
currentUserId,
1212
draftRow,
13-
draftMessageRow,
1413
channelRow,
1514
pollRow,
1615
quotedMessageRow,
1716
}: {
1817
currentUserId: string;
19-
draftRow: TableRow<'draft'>;
20-
draftMessageRow: TableRow<'draftMessage'>;
18+
draftRow: TableRowJoinedDraftMessage<'draft'>;
2119
channelRow: TableRow<'channels'>;
2220
pollRow: TableRow<'poll'>;
2321
quotedMessageRow?: TableRowJoinedUser<'messages'>;
2422
}): DraftResponse => {
2523
const { createdAt, cid, parentId } = draftRow;
2624

27-
const message = mapStorableToDraftMessage(draftMessageRow);
25+
const message = mapStorableToDraftMessage(draftRow.draftMessage);
2826

2927
const channel = mapStorableToChannel(channelRow);
3028

package/src/store/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ export type TableRowJoinedUser<T extends Table> = Schema[T] & {
88
user: TableRow<'users'>;
99
};
1010

11+
export type TableRowJoinedDraftMessage<T extends Table> = Schema[T] & {
12+
draftMessage: TableRow<'draftMessage'>;
13+
};
14+
1115
export type TableColumnNames<T extends Table> = keyof Schema[T];
1216
export type TableColumnValue = string | boolean | number | undefined;
1317
export type Scalar = string | number | boolean | null | ArrayBuffer | ArrayBufferView;

0 commit comments

Comments
 (0)