fix(search): make closed DM search work correctly (#37)
This commit is contained in:
@@ -32,6 +32,8 @@ export interface IUserChannelRepository {
|
||||
listPrivateChannels(userId: UserID): Promise<Array<Channel>>;
|
||||
deleteAllPrivateChannels(userId: UserID): Promise<void>;
|
||||
listPrivateChannelSummaries(userId: UserID): Promise<Array<PrivateChannelSummary>>;
|
||||
listHistoricalDmChannelIds(userId: UserID): Promise<Array<ChannelID>>;
|
||||
recordHistoricalDmChannel(userId: UserID, channelId: ChannelID, isGroupDm: boolean): Promise<void>;
|
||||
|
||||
findExistingDmState(user1Id: UserID, user2Id: UserID): Promise<Channel | null>;
|
||||
createDmChannelAndState(user1Id: UserID, user2Id: UserID, channelId: ChannelID): Promise<Channel>;
|
||||
|
||||
@@ -22,7 +22,7 @@ import {ChannelTypes} from '~/Constants';
|
||||
import {BatchBuilder, deleteOneOrMany, fetchMany, fetchManyInChunks, fetchOne, upsertOne} from '~/database/Cassandra';
|
||||
import type {ChannelRow, DmStateRow, PrivateChannelRow} from '~/database/CassandraTypes';
|
||||
import {Channel} from '~/Models';
|
||||
import {Channels, DmStates, PinnedDms, PrivateChannels, ReadStates} from '~/Tables';
|
||||
import {Channels, DmStates, PinnedDms, PrivateChannels, ReadStates, UserDmHistory} from '~/Tables';
|
||||
import type {IUserChannelRepository, PrivateChannelSummary} from './IUserChannelRepository';
|
||||
|
||||
interface PinnedDmRow {
|
||||
@@ -77,6 +77,11 @@ const FETCH_PRIVATE_CHANNELS_CQL = PrivateChannels.selectCql({
|
||||
where: PrivateChannels.where.eq('user_id'),
|
||||
});
|
||||
|
||||
const HISTORICAL_DM_CHANNELS_CQL = UserDmHistory.selectCql({
|
||||
columns: ['channel_id'],
|
||||
where: UserDmHistory.where.eq('user_id'),
|
||||
});
|
||||
|
||||
const FETCH_CHANNEL_METADATA_CQL = Channels.selectCql({
|
||||
columns: ['channel_id', 'type', 'last_message_id', 'soft_deleted'],
|
||||
where: [Channels.where.in('channel_id', 'channel_ids'), {kind: 'eq', col: 'soft_deleted', param: 'soft_deleted'}],
|
||||
@@ -325,6 +330,13 @@ export class UserChannelRepository implements IUserChannelRepository {
|
||||
});
|
||||
}
|
||||
|
||||
async listHistoricalDmChannelIds(userId: UserID): Promise<Array<ChannelID>> {
|
||||
const rows = await fetchMany<{channel_id: ChannelID}>(HISTORICAL_DM_CHANNELS_CQL, {
|
||||
user_id: userId,
|
||||
});
|
||||
return rows.map((row) => row.channel_id);
|
||||
}
|
||||
|
||||
async openDmForUser(userId: UserID, channelId: ChannelID, isGroupDm?: boolean): Promise<void> {
|
||||
let resolvedIsGroupDm: boolean;
|
||||
if (isGroupDm !== undefined) {
|
||||
@@ -337,6 +349,8 @@ export class UserChannelRepository implements IUserChannelRepository {
|
||||
resolvedIsGroupDm = channelRow?.type === ChannelTypes.GROUP_DM;
|
||||
}
|
||||
|
||||
await this.recordHistoricalDmChannel(userId, channelId, resolvedIsGroupDm);
|
||||
|
||||
await upsertOne(
|
||||
PrivateChannels.upsertAll({
|
||||
user_id: userId,
|
||||
@@ -346,6 +360,19 @@ export class UserChannelRepository implements IUserChannelRepository {
|
||||
);
|
||||
}
|
||||
|
||||
async recordHistoricalDmChannel(userId: UserID, channelId: ChannelID, isGroupDm: boolean): Promise<void> {
|
||||
if (isGroupDm) {
|
||||
return;
|
||||
}
|
||||
|
||||
await upsertOne(
|
||||
UserDmHistory.upsertAll({
|
||||
user_id: userId,
|
||||
channel_id: channelId,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
async removePinnedDm(userId: UserID, channelId: ChannelID): Promise<Array<ChannelID>> {
|
||||
await deleteOneOrMany(
|
||||
PinnedDms.deleteByPk({
|
||||
|
||||
@@ -435,6 +435,14 @@ export class UserRepository implements IUserRepositoryAggregate {
|
||||
return this.channelRepo.listPrivateChannels(userId);
|
||||
}
|
||||
|
||||
async listHistoricalDmChannelIds(userId: UserID): Promise<Array<ChannelID>> {
|
||||
return this.channelRepo.listHistoricalDmChannelIds(userId);
|
||||
}
|
||||
|
||||
async recordHistoricalDmChannel(userId: UserID, channelId: ChannelID, isGroupDm: boolean): Promise<void> {
|
||||
return this.channelRepo.recordHistoricalDmChannel(userId, channelId, isGroupDm);
|
||||
}
|
||||
|
||||
async listPrivateChannelSummaries(userId: UserID): Promise<Array<PrivateChannelSummary>> {
|
||||
return this.channelRepo.listPrivateChannelSummaries(userId);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user