refactor(imports): replace relative imports with path aliases (#2741)

This commit is contained in:
Hampus authored and GitHub committed 2026-09-13 20:18:22 +02:00
1 parent a59b80ce11
commit 84dcf6b8a8
1834 files changed
+11601 -10725

No files matched your search

@@ -1,5 +1,28 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ChannelID, UserID} from '@app/api/BrandedTypes';
import {createChannelID} from '@app/api/BrandedTypes';
import type {IChannelRepository} from '@app/api/channel/IChannelRepository';
import {
type DmSearchScope,
getDmChannelIdsForScope,
isDmScopeChannelForUser,
} from '@app/api/channel/services/message/DmScopeUtils';
import type {GuildService} from '@app/api/guild/services/GuildService';
import type {UserCacheService} from '@app/api/infrastructure/UserCacheService';
import type {RequestCache} from '@app/api/middleware/RequestCacheMiddleware';
import type {Channel} from '@app/api/models/Channel';
import {getMessageSearchService} from '@app/api/SearchFactory';
import {buildMessageSearchFilters} from '@app/api/search/BuildMessageSearchFilters';
import {channelNeedsReindexing} from '@app/api/search/ChannelIndexingUtils';
import type {IMessageSearchService} from '@app/api/search/IMessageSearchService';
import {MessageSearchResponseMapper} from '@app/api/search/MessageSearchResponseMapper';
import {searchExistingMessages} from '@app/api/search/MessageSearchResultReconciler';
import {channelRequiresAgeVerification} from '@app/api/search/SearchNsfwUtils';
import type {IUserRepository} from '@app/api/user/IUserRepository';
import {canUserAccessNsfwContent} from '@app/api/utils/AgeUtils';
import {mapWithConcurrency} from '@app/api/utils/ConcurrencyUtils';
import type {WorkerTaskName} from '@app/api/worker/WorkerLaneConfig';
import {ChannelTypes} from '@fluxer/constants/src/ChannelConstants';
import {GuildNSFWLevel} from '@fluxer/constants/src/GuildConstants';
import {FeatureTemporarilyDisabledError} from '@fluxer/errors/src/domains/core/FeatureTemporarilyDisabledError';
@@ -8,29 +31,6 @@ import {UnknownUserError} from '@fluxer/errors/src/domains/user/UnknownUserError
import type {MessageSearchRequest} from '@fluxer/schema/src/domains/message/MessageRequestSchemas';
import type {MessageSearchResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
import type {IWorkerService} from '@pkgs/worker/src/contracts/IWorkerService';
import type {ChannelID, UserID} from '../BrandedTypes';
import {createChannelID} from '../BrandedTypes';
import type {IChannelRepository} from '../channel/IChannelRepository';
import {
type DmSearchScope,
getDmChannelIdsForScope,
isDmScopeChannelForUser,
} from '../channel/services/message/DmScopeUtils';
import type {GuildService} from '../guild/services/GuildService';
import type {UserCacheService} from '../infrastructure/UserCacheService';
import type {RequestCache} from '../middleware/RequestCacheMiddleware';
import type {Channel} from '../models/Channel';
import {getMessageSearchService} from '../SearchFactory';
import type {IUserRepository} from '../user/IUserRepository';
import {canUserAccessNsfwContent} from '../utils/AgeUtils';
import {mapWithConcurrency} from '../utils/ConcurrencyUtils';
import type {WorkerTaskName} from '../worker/WorkerLaneConfig';
import {buildMessageSearchFilters} from './BuildMessageSearchFilters';
import {channelNeedsReindexing} from './ChannelIndexingUtils';
import type {IMessageSearchService} from './IMessageSearchService';
import {MessageSearchResponseMapper} from './MessageSearchResponseMapper';
import {searchExistingMessages} from './MessageSearchResultReconciler';
import {channelRequiresAgeVerification} from './SearchNsfwUtils';
const CHANNEL_INDEX_CHECK_CONCURRENCY = 32;
const CHANNEL_INDEX_JOB_ENQUEUE_CONCURRENCY = 16;
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AdminAuditLog} from '@app/api/admin/IAdminRepository';
import type {
ISearchAdapter as SchemaISearchAdapter,
SearchResult as SchemaSearchResult,
} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {AuditLogSearchFilters, SearchableAuditLog} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {AdminAuditLog} from '../admin/IAdminRepository';
export interface IAuditLogSearchService extends SchemaISearchAdapter<AuditLogSearchFilters, SearchableAuditLog> {
indexAuditLog(log: AdminAuditLog): Promise<void>;
@@ -1,5 +1,8 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {GuildID, UserID} from '@app/api/BrandedTypes';
import type {GuildMember} from '@app/api/models/GuildMember';
import type {User} from '@app/api/models/User';
import type {
ISearchAdapter as SchemaISearchAdapter,
SearchResult as SchemaSearchResult,
@@ -8,9 +11,6 @@ import type {
GuildMemberSearchFilters,
SearchableGuildMember,
} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {GuildID, UserID} from '../BrandedTypes';
import type {GuildMember} from '../models/GuildMember';
import type {User} from '../models/User';
export interface IGuildMemberSearchService
extends SchemaISearchAdapter<GuildMemberSearchFilters, SearchableGuildMember> {
@@ -1,14 +1,14 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {GuildID} from '@app/api/BrandedTypes';
import type {Guild} from '@app/api/models/Guild';
import type {GuildDiscoveryContext} from '@app/api/search/guild/GuildSearchSerializer';
import type {
ISearchAdapter as SchemaISearchAdapter,
SearchOptions as SchemaSearchOptions,
SearchResult as SchemaSearchResult,
} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {GuildSearchFilters, SearchableGuild} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {GuildID} from '../BrandedTypes';
import type {Guild} from '../models/Guild';
import type {GuildDiscoveryContext} from './guild/GuildSearchSerializer';
export interface IGuildSearchService extends SchemaISearchAdapter<GuildSearchFilters, SearchableGuild> {
indexGuild(guild: Guild, discovery?: GuildDiscoveryContext): Promise<void>;
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ChannelID, GuildID, MessageID, UserID} from '@app/api/BrandedTypes';
import type {Message} from '@app/api/models/Message';
import type {
ISearchAdapter as SchemaISearchAdapter,
SearchResult as SchemaSearchResult,
} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {MessageSearchFilters, SearchableMessage} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ChannelID, GuildID, MessageID, UserID} from '../BrandedTypes';
import type {Message} from '../models/Message';
export interface IMessageSearchService extends SchemaISearchAdapter<MessageSearchFilters, SearchableMessage> {
indexMessage(message: Message, authorIsBot?: boolean): Promise<void>;
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {GuildID, MessageID, ReportID, UserID} from '@app/api/BrandedTypes';
import type {IARSubmission} from '@app/api/report/IReportRepository';
import type {
ISearchAdapter as SchemaISearchAdapter,
SearchResult as SchemaSearchResult,
} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {ReportSearchFilters, SearchableReport} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {GuildID, MessageID, ReportID, UserID} from '../BrandedTypes';
import type {IARSubmission} from '../report/IReportRepository';
export interface IReportSearchService extends SchemaISearchAdapter<ReportSearchFilters, SearchableReport> {
indexReport(report: IARSubmission): Promise<void>;
+6 -6
View File
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {IAuditLogSearchService} from './IAuditLogSearchService';
import type {IGuildMemberSearchService} from './IGuildMemberSearchService';
import type {IGuildSearchService} from './IGuildSearchService';
import type {IMessageSearchService} from './IMessageSearchService';
import type {IReportSearchService} from './IReportSearchService';
import type {IUserSearchService} from './IUserSearchService';
import type {IAuditLogSearchService} from '@app/api/search/IAuditLogSearchService';
import type {IGuildMemberSearchService} from '@app/api/search/IGuildMemberSearchService';
import type {IGuildSearchService} from '@app/api/search/IGuildSearchService';
import type {IMessageSearchService} from '@app/api/search/IMessageSearchService';
import type {IReportSearchService} from '@app/api/search/IReportSearchService';
import type {IUserSearchService} from '@app/api/search/IUserSearchService';
export interface ISearchProvider {
initialize(): Promise<void>;
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {UserID} from '@app/api/BrandedTypes';
import type {User} from '@app/api/models/User';
import type {
ISearchAdapter as SchemaISearchAdapter,
SearchResult as SchemaSearchResult,
} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {SearchableUser, UserSearchFilters} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {UserID} from '../BrandedTypes';
import type {User} from '../models/User';
export interface IUserSearchService extends SchemaISearchAdapter<UserSearchFilters, SearchableUser> {
indexUser(user: User): Promise<void>;
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {type ChannelID, createMessageID, type MessageID} from '../BrandedTypes';
import {Logger} from '../Logger';
import {getMessageSearchService} from '../SearchFactory';
import type {IMessageSearchService} from './IMessageSearchService';
import {type ChannelID, createMessageID, type MessageID} from '@app/api/BrandedTypes';
import {Logger} from '@app/api/Logger';
import {getMessageSearchService} from '@app/api/SearchFactory';
import type {IMessageSearchService} from '@app/api/search/IMessageSearchService';
const MESSAGE_DELETE_BATCH_SIZE = 1000;
@@ -1,16 +1,16 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {UserID} from '@app/api/BrandedTypes';
import {createChannelID} from '@app/api/BrandedTypes';
import {mapChannelToResponse} from '@app/api/channel/ChannelMappers';
import type {IChannelRepository} from '@app/api/channel/IChannelRepository';
import {createMessageResponseDataService} from '@app/api/channel/services/message/MessageResponseDataService';
import type {UserCacheService} from '@app/api/infrastructure/UserCacheService';
import type {RequestCache} from '@app/api/middleware/RequestCacheMiddleware';
import type {Channel} from '@app/api/models/Channel';
import type {Message} from '@app/api/models/Message';
import {mapWithConcurrency} from '@app/api/utils/ConcurrencyUtils';
import type {MessageSearchResultsResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
import type {UserID} from '../BrandedTypes';
import {createChannelID} from '../BrandedTypes';
import {mapChannelToResponse} from '../channel/ChannelMappers';
import type {IChannelRepository} from '../channel/IChannelRepository';
import {createMessageResponseDataService} from '../channel/services/message/MessageResponseDataService';
import type {UserCacheService} from '../infrastructure/UserCacheService';
import type {RequestCache} from '../middleware/RequestCacheMiddleware';
import type {Channel} from '../models/Channel';
import type {Message} from '../models/Message';
import {mapWithConcurrency} from '../utils/ConcurrencyUtils';
const CHANNEL_LOOKUP_CONCURRENCY = 16;
@@ -1,14 +1,14 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {type ChannelID, createChannelID, createMessageID, type MessageID} from '@app/api/BrandedTypes';
import type {IMessageRepository} from '@app/api/channel/repositories/IMessageRepository';
import {Logger} from '@app/api/Logger';
import type {Message} from '@app/api/models/Message';
import type {IMessageSearchService} from '@app/api/search/IMessageSearchService';
import {deleteMessageSearchDocuments} from '@app/api/search/MessageSearchIndexCleanup';
import {mapWithConcurrency} from '@app/api/utils/ConcurrencyUtils';
import type {SearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {MessageSearchFilters, SearchableMessage} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {type ChannelID, createChannelID, createMessageID, type MessageID} from '../BrandedTypes';
import type {IMessageRepository} from '../channel/repositories/IMessageRepository';
import {Logger} from '../Logger';
import type {Message} from '../models/Message';
import {mapWithConcurrency} from '../utils/ConcurrencyUtils';
import type {IMessageSearchService} from './IMessageSearchService';
import {deleteMessageSearchDocuments} from './MessageSearchIndexCleanup';
const RECONCILE_BATCH_SIZE = 250;
const MAX_RECONCILE_PAGES = 40;
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {trackSearchTask} from '@app/api/search/SearchTaskTracker';
import type {ISearchAdapter, SearchOptions, SearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import {trackSearchTask} from './SearchTaskTracker';
export abstract class SearchAdapterServiceBase<
TFilters,
+2 -2
View File
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {channelToContentWarningView, computeEffectiveChannelNsfw} from '@app/api/channel/utils/EffectiveContentWarning';
import type {Channel} from '@app/api/models/Channel';
import {ContentWarningLevel} from '@fluxer/constants/src/GuildConstants';
import {channelToContentWarningView, computeEffectiveChannelNsfw} from '../channel/utils/EffectiveContentWarning';
import type {Channel} from '../models/Channel';
export function channelRequiresAgeVerification(
channel: Channel,
+9 -9
View File
@@ -1,19 +1,19 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createChannelID, createGuildID, type UserID} from '@app/api/BrandedTypes';
import type {IChannelRepository} from '@app/api/channel/IChannelRepository';
import type {ChannelService} from '@app/api/channel/services/ChannelService';
import type {GuildService} from '@app/api/guild/services/GuildService';
import type {UserCacheService} from '@app/api/infrastructure/UserCacheService';
import type {RequestCache} from '@app/api/middleware/RequestCacheMiddleware';
import {GlobalSearchService} from '@app/api/search/GlobalSearchService';
import type {IUserRepository} from '@app/api/user/IUserRepository';
import type {WorkerTaskName} from '@app/api/worker/WorkerLaneConfig';
import {ValidationErrorCodes} from '@fluxer/constants/src/ValidationErrorCodes';
import {InputValidationError} from '@fluxer/errors/src/domains/core/InputValidationError';
import type {GlobalSearchMessagesRequest} from '@fluxer/schema/src/domains/message/MessageRequestSchemas';
import type {MessageResponse, MessageSearchResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
import type {IWorkerService} from '@pkgs/worker/src/contracts/IWorkerService';
import {createChannelID, createGuildID, type UserID} from '../BrandedTypes';
import type {IChannelRepository} from '../channel/IChannelRepository';
import type {ChannelService} from '../channel/services/ChannelService';
import type {GuildService} from '../guild/services/GuildService';
import type {UserCacheService} from '../infrastructure/UserCacheService';
import type {RequestCache} from '../middleware/RequestCacheMiddleware';
import type {IUserRepository} from '../user/IUserRepository';
import type {WorkerTaskName} from '../worker/WorkerLaneConfig';
import {GlobalSearchService} from './GlobalSearchService';
function omitReferencedMessages(result: MessageSearchResponse): MessageSearchResponse {
if (!('messages' in result)) {
+9 -9
View File
@@ -1,19 +1,19 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {GuildID, ReportID} from '../BrandedTypes';
import type {IGuildDataRepository} from '../guild/repositories/IGuildDataRepository';
import type {ILogger} from '../ILogger';
import type {IReportRepository} from '../report/IReportRepository';
import type {GuildID, ReportID} from '@app/api/BrandedTypes';
import type {IGuildDataRepository} from '@app/api/guild/repositories/IGuildDataRepository';
import type {ILogger} from '@app/api/ILogger';
import type {IReportRepository} from '@app/api/report/IReportRepository';
import {
getAuditLogSearchService,
getGuildSearchService,
getReportSearchService,
getUserSearchService,
} from '../SearchFactory';
import type {IUserRepository} from '../user/IUserRepository';
import type {IGuildSearchService} from './IGuildSearchService';
import type {IReportSearchService} from './IReportSearchService';
import type {IUserSearchService} from './IUserSearchService';
} from '@app/api/SearchFactory';
import type {IGuildSearchService} from '@app/api/search/IGuildSearchService';
import type {IReportSearchService} from '@app/api/search/IReportSearchService';
import type {IUserSearchService} from '@app/api/search/IUserSearchService';
import type {IUserRepository} from '@app/api/user/IUserRepository';
const BATCH_SIZE = 100;
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AdminAuditLog} from '@app/api/admin/IAdminRepository';
import type {SearchableAuditLog} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {snowflakeToDate} from '@fluxer/snowflake/src/Snowflake';
import type {AdminAuditLog} from '../../admin/IAdminRepository';
export function convertToSearchableAuditLog(log: AdminAuditLog): SearchableAuditLog {
const createdAt = Math.floor(snowflakeToDate(BigInt(log.logId)).getTime() / 1000);
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {LoginRequired} from '@app/api/middleware/AuthMiddleware';
import {RateLimitMiddleware} from '@app/api/middleware/RateLimitMiddleware';
import {OpenAPI} from '@app/api/middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '@app/api/RateLimitConfig';
import type {HonoApp} from '@app/api/types/HonoEnv';
import {Validator} from '@app/api/Validator';
import {ValidationErrorCodes} from '@fluxer/constants/src/ValidationErrorCodes';
import {InputValidationError} from '@fluxer/errors/src/domains/core/InputValidationError';
import {GlobalSearchMessagesRequest} from '@fluxer/schema/src/domains/message/MessageRequestSchemas';
import {MessageSearchResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
import {LoginRequired} from '../../middleware/AuthMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
export function SearchController(app: HonoApp) {
app.post(
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AdminAuditLog} from '@app/api/admin/IAdminRepository';
import {convertToSearchableAuditLog} from '@app/api/search/auditlog/AuditLogSearchSerializer';
import type {IAuditLogSearchService} from '@app/api/search/IAuditLogSearchService';
import {SearchAdapterServiceBase} from '@app/api/search/SearchAdapterServiceBase';
import type {SearchResult as SchemaSearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {AuditLogSearchFilters, SearchableAuditLog} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {
ElasticsearchAuditLogAdapter,
type ElasticsearchAuditLogAdapterOptions,
} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchAuditLogAdapter';
import type {AdminAuditLog} from '../../admin/IAdminRepository';
import {convertToSearchableAuditLog} from '../auditlog/AuditLogSearchSerializer';
import type {IAuditLogSearchService} from '../IAuditLogSearchService';
import {SearchAdapterServiceBase} from '../SearchAdapterServiceBase';
interface ElasticsearchAuditLogSearchServiceOptions extends ElasticsearchAuditLogAdapterOptions {}
@@ -1,5 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {GuildID, UserID} from '@app/api/BrandedTypes';
import type {GuildMember} from '@app/api/models/GuildMember';
import type {User} from '@app/api/models/User';
import {convertToSearchableGuildMember} from '@app/api/search/guild_member/GuildMemberSearchSerializer';
import type {IGuildMemberSearchService} from '@app/api/search/IGuildMemberSearchService';
import {SearchAdapterServiceBase} from '@app/api/search/SearchAdapterServiceBase';
import type {SearchResult as SchemaSearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {
GuildMemberSearchFilters,
@@ -9,12 +15,6 @@ import {
ElasticsearchGuildMemberAdapter,
type ElasticsearchGuildMemberAdapterOptions,
} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchGuildMemberAdapter';
import type {GuildID, UserID} from '../../BrandedTypes';
import type {GuildMember} from '../../models/GuildMember';
import type {User} from '../../models/User';
import {convertToSearchableGuildMember} from '../guild_member/GuildMemberSearchSerializer';
import type {IGuildMemberSearchService} from '../IGuildMemberSearchService';
import {SearchAdapterServiceBase} from '../SearchAdapterServiceBase';
const DEFAULT_LIMIT = 25;
@@ -1,5 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {GuildID} from '@app/api/BrandedTypes';
import type {IGuildDiscoveryRepository} from '@app/api/guild/repositories/GuildDiscoveryRepository';
import type {Guild} from '@app/api/models/Guild';
import {convertToSearchableGuild, type GuildDiscoveryContext} from '@app/api/search/guild/GuildSearchSerializer';
import {resolveDiscoveryContextForIndexing} from '@app/api/search/guild/LazyDiscoveryMigration';
import type {IGuildSearchService} from '@app/api/search/IGuildSearchService';
import {SearchAdapterServiceBase} from '@app/api/search/SearchAdapterServiceBase';
import type {
SearchOptions as SchemaSearchOptions,
SearchResult as SchemaSearchResult,
@@ -9,13 +16,6 @@ import {
ElasticsearchGuildAdapter,
type ElasticsearchGuildAdapterOptions,
} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchGuildAdapter';
import type {GuildID} from '../../BrandedTypes';
import type {IGuildDiscoveryRepository} from '../../guild/repositories/GuildDiscoveryRepository';
import type {Guild} from '../../models/Guild';
import {convertToSearchableGuild, type GuildDiscoveryContext} from '../guild/GuildSearchSerializer';
import {resolveDiscoveryContextForIndexing} from '../guild/LazyDiscoveryMigration';
import type {IGuildSearchService} from '../IGuildSearchService';
import {SearchAdapterServiceBase} from '../SearchAdapterServiceBase';
interface ElasticsearchGuildSearchServiceOptions extends ElasticsearchGuildAdapterOptions {
discoveryRepository?: IGuildDiscoveryRepository;
@@ -1,16 +1,19 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ChannelID, GuildID, MessageID, UserID} from '@app/api/BrandedTypes';
import type {Message} from '@app/api/models/Message';
import type {IMessageSearchService} from '@app/api/search/IMessageSearchService';
import {
convertMessagesToSearchableMessages,
convertToSearchableMessage,
} from '@app/api/search/message/MessageSearchSerializer';
import {SearchAdapterServiceBase} from '@app/api/search/SearchAdapterServiceBase';
import type {SearchResult as SchemaSearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {MessageSearchFilters, SearchableMessage} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {
ElasticsearchMessageAdapter,
type ElasticsearchMessageAdapterOptions,
} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchMessageAdapter';
import type {ChannelID, GuildID, MessageID, UserID} from '../../BrandedTypes';
import type {Message} from '../../models/Message';
import type {IMessageSearchService} from '../IMessageSearchService';
import {convertMessagesToSearchableMessages, convertToSearchableMessage} from '../message/MessageSearchSerializer';
import {SearchAdapterServiceBase} from '../SearchAdapterServiceBase';
const DEFAULT_HITS_PER_PAGE = 25;
@@ -1,16 +1,16 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {GuildID, MessageID, ReportID, UserID} from '@app/api/BrandedTypes';
import type {IARSubmission} from '@app/api/report/IReportRepository';
import type {IReportSearchService} from '@app/api/search/IReportSearchService';
import {convertToSearchableReport} from '@app/api/search/report/ReportSearchSerializer';
import {SearchAdapterServiceBase} from '@app/api/search/SearchAdapterServiceBase';
import type {SearchResult as SchemaSearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {ReportSearchFilters, SearchableReport} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {
ElasticsearchReportAdapter,
type ElasticsearchReportAdapterOptions,
} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchReportAdapter';
import type {GuildID, MessageID, ReportID, UserID} from '../../BrandedTypes';
import type {IARSubmission} from '../../report/IReportRepository';
import type {IReportSearchService} from '../IReportSearchService';
import {convertToSearchableReport} from '../report/ReportSearchSerializer';
import {SearchAdapterServiceBase} from '../SearchAdapterServiceBase';
interface ElasticsearchReportSearchServiceOptions extends ElasticsearchReportAdapterOptions {}
@@ -1,16 +1,16 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {UserID} from '@app/api/BrandedTypes';
import type {User} from '@app/api/models/User';
import type {IUserSearchService} from '@app/api/search/IUserSearchService';
import {SearchAdapterServiceBase} from '@app/api/search/SearchAdapterServiceBase';
import {convertToSearchableUser} from '@app/api/search/user/UserSearchSerializer';
import type {SearchResult as SchemaSearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {SearchableUser, UserSearchFilters} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {
ElasticsearchUserAdapter,
type ElasticsearchUserAdapterOptions,
} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchUserAdapter';
import type {UserID} from '../../BrandedTypes';
import type {User} from '../../models/User';
import type {IUserSearchService} from '../IUserSearchService';
import {SearchAdapterServiceBase} from '../SearchAdapterServiceBase';
import {convertToSearchableUser} from '../user/UserSearchSerializer';
interface ElasticsearchUserSearchServiceOptions extends ElasticsearchUserAdapterOptions {}
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {Guild} from '@app/api/models/Guild';
import {normalizeDiscoveryTag} from '@fluxer/constants/src/DiscoveryConstants';
import {GuildFeatures, getEffectiveGuildVerificationLevel} from '@fluxer/constants/src/GuildConstants';
import type {SearchableGuild} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {snowflakeToDate} from '@fluxer/snowflake/src/Snowflake';
import type {Guild} from '../../models/Guild';
export interface GuildDiscoveryContext {
description: string | null;
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {IGuildDiscoveryRepository} from '@app/api/guild/repositories/GuildDiscoveryRepository';
import type {Guild} from '@app/api/models/Guild';
import type {GuildDiscoveryContext} from '@app/api/search/guild/GuildSearchSerializer';
import {DiscoveryApplicationStatus} from '@fluxer/constants/src/DiscoveryConstants';
import {GuildFeatures} from '@fluxer/constants/src/GuildConstants';
import type {IGuildDiscoveryRepository} from '../../guild/repositories/GuildDiscoveryRepository';
import type {Guild} from '../../models/Guild';
import type {GuildDiscoveryContext} from './GuildSearchSerializer';
export async function resolveDiscoveryContextForIndexing(
guild: Guild,
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createChannelID, createGuildID, createUserID} from '@app/api/BrandedTypes';
import type {GuildRow} from '@app/api/database/types/GuildTypes';
import {Guild} from '@app/api/models/Guild';
import {convertToSearchableGuild} from '@app/api/search/guild/GuildSearchSerializer';
import {GuildFeatures} from '@fluxer/constants/src/GuildConstants';
import {describe, expect, it} from 'vitest';
import {createChannelID, createGuildID, createUserID} from '../../../BrandedTypes';
import type {GuildRow} from '../../../database/types/GuildTypes';
import {Guild} from '../../../models/Guild';
import {convertToSearchableGuild} from '../GuildSearchSerializer';
function guildRow(features: Set<string>): GuildRow {
return {
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {GuildMember} from '@app/api/models/GuildMember';
import type {User} from '@app/api/models/User';
import type {SearchableGuildMember} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {extractTimestampFromSnowflake} from '@fluxer/snowflake/src/SnowflakeUtils';
import type {GuildMember} from '../../models/GuildMember';
import type {User} from '../../models/User';
const MIN_USERNAME_SUFFIX_LENGTH = 2;
@@ -1,5 +1,19 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {MeilisearchClient} from '@app/api/search/meilisearch/MeilisearchClient';
import {
compactMeiliFilters,
type MeilisearchFilter,
meiliAndTerms,
meiliExcludeAny,
meiliExistsFilter,
meiliNotExistsFilter,
meiliRangeFilter,
meiliTermFilter,
meiliTermsFilter,
} from '@app/api/search/meilisearch/MeilisearchFilterUtils';
import {MeilisearchIndexAdapter} from '@app/api/search/meilisearch/MeilisearchIndexAdapter';
import {MEILISEARCH_INDEX_DEFINITIONS} from '@app/api/search/meilisearch/MeilisearchIndexDefinitions';
import type {
AuditLogSearchFilters,
GuildMemberSearchFilters,
@@ -15,20 +29,6 @@ import type {
UserSearchFilters,
} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {snowflakeToDate} from '@fluxer/snowflake/src/Snowflake';
import type {MeilisearchClient} from './MeilisearchClient';
import {
compactMeiliFilters,
type MeilisearchFilter,
meiliAndTerms,
meiliExcludeAny,
meiliExistsFilter,
meiliNotExistsFilter,
meiliRangeFilter,
meiliTermFilter,
meiliTermsFilter,
} from './MeilisearchFilterUtils';
import {MeilisearchIndexAdapter} from './MeilisearchIndexAdapter';
import {MEILISEARCH_INDEX_DEFINITIONS} from './MeilisearchIndexDefinitions';
const HAS_FIELD_MAP: Record<string, string> = {
image: 'hasImage',
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {MeilisearchClient, MeilisearchTask} from '@app/api/search/meilisearch/MeilisearchClient';
import {MeilisearchMessageAdapter} from '@app/api/search/meilisearch/MeilisearchDomainAdapters';
import {MEILISEARCH_MAX_TRACKED_BULK_TASKS} from '@app/api/search/meilisearch/MeilisearchIndexAdapter';
import type {SearchableMessage} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {describe, expect, it} from 'vitest';
import type {MeilisearchClient, MeilisearchTask} from './MeilisearchClient';
import {MeilisearchMessageAdapter} from './MeilisearchDomainAdapters';
import {MEILISEARCH_MAX_TRACKED_BULK_TASKS} from './MeilisearchIndexAdapter';
interface RecordedMeilisearchRequest {
method: string;
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {MeilisearchClient, MeilisearchTask} from '@app/api/search/meilisearch/MeilisearchClient';
import type {MeilisearchFilter} from '@app/api/search/meilisearch/MeilisearchFilterUtils';
import {joinMeiliFilters} from '@app/api/search/meilisearch/MeilisearchFilterUtils';
import type {MeilisearchIndexDefinition} from '@app/api/search/meilisearch/MeilisearchIndexDefinitions';
import type {SearchOptions, SearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {MeilisearchClient, MeilisearchTask} from './MeilisearchClient';
import type {MeilisearchFilter} from './MeilisearchFilterUtils';
import {joinMeiliFilters} from './MeilisearchFilterUtils';
import type {MeilisearchIndexDefinition} from './MeilisearchIndexDefinitions';
const MAX_SEARCH_LIMIT = 1000;
const MAX_TOTAL_HITS = 10000;
@@ -1,5 +1,40 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AdminAuditLog} from '@app/api/admin/IAdminRepository';
import type {ChannelID, GuildID, MessageID, ReportID, UserID} from '@app/api/BrandedTypes';
import type {IGuildDiscoveryRepository} from '@app/api/guild/repositories/GuildDiscoveryRepository';
import type {Guild} from '@app/api/models/Guild';
import type {GuildMember} from '@app/api/models/GuildMember';
import type {Message} from '@app/api/models/Message';
import type {User} from '@app/api/models/User';
import type {IARSubmission} from '@app/api/report/IReportRepository';
import {convertToSearchableAuditLog} from '@app/api/search/auditlog/AuditLogSearchSerializer';
import {convertToSearchableGuild, type GuildDiscoveryContext} from '@app/api/search/guild/GuildSearchSerializer';
import {resolveDiscoveryContextForIndexing} from '@app/api/search/guild/LazyDiscoveryMigration';
import {convertToSearchableGuildMember} from '@app/api/search/guild_member/GuildMemberSearchSerializer';
import type {IAuditLogSearchService} from '@app/api/search/IAuditLogSearchService';
import type {IGuildMemberSearchService} from '@app/api/search/IGuildMemberSearchService';
import type {IGuildSearchService} from '@app/api/search/IGuildSearchService';
import type {IMessageSearchService} from '@app/api/search/IMessageSearchService';
import type {IReportSearchService} from '@app/api/search/IReportSearchService';
import type {IUserSearchService} from '@app/api/search/IUserSearchService';
import type {MeilisearchClient} from '@app/api/search/meilisearch/MeilisearchClient';
import {
MeilisearchAuditLogAdapter,
MeilisearchGuildAdapter,
MeilisearchGuildMemberAdapter,
MeilisearchMessageAdapter,
MeilisearchReportAdapter,
MeilisearchUserAdapter,
} from '@app/api/search/meilisearch/MeilisearchDomainAdapters';
import {meiliTermFilter} from '@app/api/search/meilisearch/MeilisearchFilterUtils';
import {
convertMessagesToSearchableMessages,
convertToSearchableMessage,
} from '@app/api/search/message/MessageSearchSerializer';
import {convertToSearchableReport} from '@app/api/search/report/ReportSearchSerializer';
import {SearchAdapterServiceBase} from '@app/api/search/SearchAdapterServiceBase';
import {convertToSearchableUser} from '@app/api/search/user/UserSearchSerializer';
import type {
SearchOptions as SchemaSearchOptions,
SearchResult as SchemaSearchResult,
@@ -18,38 +53,6 @@ import type {
SearchableUser,
UserSearchFilters,
} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {AdminAuditLog} from '../../admin/IAdminRepository';
import type {ChannelID, GuildID, MessageID, ReportID, UserID} from '../../BrandedTypes';
import type {IGuildDiscoveryRepository} from '../../guild/repositories/GuildDiscoveryRepository';
import type {Guild} from '../../models/Guild';
import type {GuildMember} from '../../models/GuildMember';
import type {Message} from '../../models/Message';
import type {User} from '../../models/User';
import type {IARSubmission} from '../../report/IReportRepository';
import {convertToSearchableAuditLog} from '../auditlog/AuditLogSearchSerializer';
import {convertToSearchableGuild, type GuildDiscoveryContext} from '../guild/GuildSearchSerializer';
import {resolveDiscoveryContextForIndexing} from '../guild/LazyDiscoveryMigration';
import {convertToSearchableGuildMember} from '../guild_member/GuildMemberSearchSerializer';
import type {IAuditLogSearchService} from '../IAuditLogSearchService';
import type {IGuildMemberSearchService} from '../IGuildMemberSearchService';
import type {IGuildSearchService} from '../IGuildSearchService';
import type {IMessageSearchService} from '../IMessageSearchService';
import type {IReportSearchService} from '../IReportSearchService';
import type {IUserSearchService} from '../IUserSearchService';
import {convertMessagesToSearchableMessages, convertToSearchableMessage} from '../message/MessageSearchSerializer';
import {convertToSearchableReport} from '../report/ReportSearchSerializer';
import {SearchAdapterServiceBase} from '../SearchAdapterServiceBase';
import {convertToSearchableUser} from '../user/UserSearchSerializer';
import type {MeilisearchClient} from './MeilisearchClient';
import {
MeilisearchAuditLogAdapter,
MeilisearchGuildAdapter,
MeilisearchGuildMemberAdapter,
MeilisearchMessageAdapter,
MeilisearchReportAdapter,
MeilisearchUserAdapter,
} from './MeilisearchDomainAdapters';
import {meiliTermFilter} from './MeilisearchFilterUtils';
const DEFAULT_HITS_PER_PAGE = 25;
const DEFAULT_MEMBER_LIMIT = 25;
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {UserID} from '@app/api/BrandedTypes';
import type {Attachment} from '@app/api/models/Attachment';
import type {Embed} from '@app/api/models/Embed';
import type {Message} from '@app/api/models/Message';
import type {MessageSnapshot} from '@app/api/models/MessageSnapshot';
import type {SearchableMessage} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {snowflakeToDate} from '@fluxer/snowflake/src/Snowflake';
import type {UserID} from '../../BrandedTypes';
import type {Attachment} from '../../models/Attachment';
import type {Embed} from '../../models/Embed';
import type {Message} from '../../models/Message';
import type {MessageSnapshot} from '../../models/MessageSnapshot';
const LINK_URL_MATCHER = /https?:\/\/[^\s<>"']+/gi;
const HAS_LINK_REGEX = /https?:\/\/[^\s/]+/i;
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createAttachmentID, createChannelID, createMessageID, createUserID} from '@app/api/BrandedTypes';
import type {MessageRow} from '@app/api/database/types/MessageTypes';
import {Message} from '@app/api/models/Message';
import {convertToSearchableMessage} from '@app/api/search/message/MessageSearchSerializer';
import {describe, expect, it} from 'vitest';
import {createAttachmentID, createChannelID, createMessageID, createUserID} from '../../../BrandedTypes';
import type {MessageRow} from '../../../database/types/MessageTypes';
import {Message} from '../../../models/Message';
import {convertToSearchableMessage} from '../MessageSearchSerializer';
describe('MessageSearchSerializer', () => {
it('extracts unique hosts and attachment metadata when indexing a message', () => {
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {IARSubmission} from '@app/api/report/IReportRepository';
import type {SearchableReport} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {snowflakeToDate} from '@fluxer/snowflake/src/Snowflake';
import type {IARSubmission} from '../../report/IReportRepository';
export function convertToSearchableReport(report: IARSubmission): SearchableReport {
const createdAt = Math.floor(snowflakeToDate(BigInt(report.reportId)).getTime() / 1000);
@@ -1,12 +1,8 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {Permissions} from '@fluxer/constants/src/ChannelConstants';
import {GuildMFALevel, JoinSourceTypes} from '@fluxer/constants/src/GuildConstants';
import type {GuildMemberSearchResponse} from '@fluxer/schema/src/domains/guild/GuildMemberSearchSchemas';
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
import {createTestAccount, type TestAccount, totpCodeNow} from '../../auth/tests/AuthTestUtils';
import {createGuildID, createUserID} from '../../BrandedTypes';
import {GuildRepository} from '../../guild/repositories/GuildRepository';
import {createTestAccount, type TestAccount, totpCodeNow} from '@app/api/auth/tests/AuthTestUtils';
import {createGuildID, createUserID} from '@app/api/BrandedTypes';
import {GuildRepository} from '@app/api/guild/repositories/GuildRepository';
import {
acceptInvite,
createChannel,
@@ -15,10 +11,14 @@ import {
createRole,
setupTestGuildWithMembers,
updateMember,
} from '../../guild/tests/GuildTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '../../test/ApiTestHarness';
import {HTTP_STATUS, wait} from '../../test/TestConstants';
import {createBuilder, createBuilderWithoutAuth} from '../../test/TestRequestBuilder';
} from '@app/api/guild/tests/GuildTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHarness';
import {HTTP_STATUS, wait} from '@app/api/test/TestConstants';
import {createBuilder, createBuilderWithoutAuth} from '@app/api/test/TestRequestBuilder';
import {Permissions} from '@fluxer/constants/src/ChannelConstants';
import {GuildMFALevel, JoinSourceTypes} from '@fluxer/constants/src/GuildConstants';
import type {GuildMemberSearchResponse} from '@fluxer/schema/src/domains/guild/GuildMemberSearchSchemas';
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
const TOTP_SECRET = 'JBSWY3DPEHPK3PXP';
@@ -1,21 +1,21 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
import {createTestAccount} from '../../auth/tests/AuthTestUtils';
import {createChannelID, createMessageID} from '../../BrandedTypes';
import {Config} from '../../Config';
import {ChannelRepository} from '../../channel/ChannelRepository';
import {createGuild} from '../../guild/tests/GuildTestUtils';
import {createTestAccount} from '@app/api/auth/tests/AuthTestUtils';
import {createChannelID, createMessageID} from '@app/api/BrandedTypes';
import {Config} from '@app/api/Config';
import {ChannelRepository} from '@app/api/channel/ChannelRepository';
import {createGuild} from '@app/api/guild/tests/GuildTestUtils';
import {
deleteMessage,
ensureSessionStarted,
markChannelAsIndexed,
sendMessage,
} from '../../message/tests/MessageTestUtils';
import {getMessageSearchService} from '../../SearchFactory';
import {type ApiTestHarness, createApiTestHarness} from '../../test/ApiTestHarness';
import {HTTP_STATUS, TEST_TIMEOUTS, wait} from '../../test/TestConstants';
import {createBuilder} from '../../test/TestRequestBuilder';
} from '@app/api/message/tests/MessageTestUtils';
import {getMessageSearchService} from '@app/api/SearchFactory';
import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHarness';
import {HTTP_STATUS, TEST_TIMEOUTS, wait} from '@app/api/test/TestConstants';
import {createBuilder} from '@app/api/test/TestRequestBuilder';
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
interface MessageSearchResult {
messages: Array<{
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createTestAccount} from '@app/api/auth/tests/AuthTestUtils';
import {createGuild} from '@app/api/guild/tests/GuildTestUtils';
import {markChannelAsIndexed, sendMessage} from '@app/api/message/tests/MessageTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHarness';
import {HTTP_STATUS} from '@app/api/test/TestConstants';
import {createBuilder} from '@app/api/test/TestRequestBuilder';
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
import {createTestAccount} from '../../auth/tests/AuthTestUtils';
import {createGuild} from '../../guild/tests/GuildTestUtils';
import {markChannelAsIndexed, sendMessage} from '../../message/tests/MessageTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '../../test/ApiTestHarness';
import {HTTP_STATUS} from '../../test/TestConstants';
import {createBuilder} from '../../test/TestRequestBuilder';
interface MessageSearchResult {
messages: Array<{
@@ -1,26 +1,26 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {MessageReferenceTypes} from '@fluxer/constants/src/ChannelConstants';
import type {MessageResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
import {createTestAccount} from '../../auth/tests/AuthTestUtils';
import {loadFixture, sendMessageWithAttachments} from '../../channel/tests/AttachmentTestUtils';
import {createTestAccount} from '@app/api/auth/tests/AuthTestUtils';
import {loadFixture, sendMessageWithAttachments} from '@app/api/channel/tests/AttachmentTestUtils';
import {
acceptInvite,
createChannel,
createChannelInvite,
createGuild,
getChannel,
} from '../../guild/tests/GuildTestUtils';
} from '@app/api/guild/tests/GuildTestUtils';
import {
markChannelAsIndexed,
markGuildChannelsAsIndexed,
pinMessage,
sendMessage,
} from '../../message/tests/MessageTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '../../test/ApiTestHarness';
import {HTTP_STATUS} from '../../test/TestConstants';
import {createBuilder} from '../../test/TestRequestBuilder';
} from '@app/api/message/tests/MessageTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHarness';
import {HTTP_STATUS} from '@app/api/test/TestConstants';
import {createBuilder} from '@app/api/test/TestRequestBuilder';
import {MessageReferenceTypes} from '@fluxer/constants/src/ChannelConstants';
import type {MessageResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
interface MessageSearchResult {
messages: Array<{
@@ -1,10 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
import {ChannelTypes, Permissions} from '@fluxer/constants/src/ChannelConstants';
import {GuildNSFWLevel} from '@fluxer/constants/src/GuildConstants';
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
import {createTestAccount} from '../../auth/tests/AuthTestUtils';
import {createTestAccount} from '@app/api/auth/tests/AuthTestUtils';
import {
acceptInvite,
addMemberRole,
@@ -22,16 +18,20 @@ import {
sendChannelMessage,
updateChannel,
updateRole,
} from '../../channel/tests/ChannelTestUtils';
import {getRoles, updateGuild} from '../../guild/tests/GuildTestUtils';
} from '@app/api/channel/tests/ChannelTestUtils';
import {getRoles, updateGuild} from '@app/api/guild/tests/GuildTestUtils';
import {
markChannelAsIndexed,
markGuildChannelsAsIndexed,
markUserDmChannelsAsIndexed,
} from '../../message/tests/MessageTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '../../test/ApiTestHarness';
import {HTTP_STATUS} from '../../test/TestConstants';
import {createBuilder} from '../../test/TestRequestBuilder';
} from '@app/api/message/tests/MessageTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHarness';
import {HTTP_STATUS} from '@app/api/test/TestConstants';
import {createBuilder} from '@app/api/test/TestRequestBuilder';
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
import {ChannelTypes, Permissions} from '@fluxer/constants/src/ChannelConstants';
import {GuildNSFWLevel} from '@fluxer/constants/src/GuildConstants';
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
interface MessageSearchResult {
channels: Array<{
@@ -1,5 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createTestAccount} from '@app/api/auth/tests/AuthTestUtils';
import {createGuild} from '@app/api/guild/tests/GuildTestUtils';
import {markChannelAsIndexed, markGuildChannelsAsIndexed, sendMessage} from '@app/api/message/tests/MessageTestUtils';
import {SearchService} from '@app/api/search/SearchService';
import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHarness';
import {HTTP_STATUS} from '@app/api/test/TestConstants';
import {createBuilder} from '@app/api/test/TestRequestBuilder';
import {MessageReferenceTypes} from '@fluxer/constants/src/ChannelConstants';
import type {
MessageResponse,
@@ -7,13 +14,6 @@ import type {
MessageSearchResultsResponse,
} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
import {afterEach, beforeEach, describe, expect, test, vi} from 'vitest';
import {createTestAccount} from '../../auth/tests/AuthTestUtils';
import {createGuild} from '../../guild/tests/GuildTestUtils';
import {markChannelAsIndexed, markGuildChannelsAsIndexed, sendMessage} from '../../message/tests/MessageTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '../../test/ApiTestHarness';
import {HTTP_STATUS} from '../../test/TestConstants';
import {createBuilder} from '../../test/TestRequestBuilder';
import {SearchService} from '../SearchService';
function isSearchResult(response: MessageSearchResponse): response is MessageSearchResultsResponse {
return 'messages' in response;
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createTestAccount} from '@app/api/auth/tests/AuthTestUtils';
import {createGuild} from '@app/api/guild/tests/GuildTestUtils';
import {ensureSessionStarted, markChannelAsIndexed, sendMessage} from '@app/api/message/tests/MessageTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '@app/api/test/ApiTestHarness';
import {HTTP_STATUS} from '@app/api/test/TestConstants';
import {createBuilder} from '@app/api/test/TestRequestBuilder';
import {afterEach, beforeEach, describe, expect, test} from 'vitest';
import {createTestAccount} from '../../auth/tests/AuthTestUtils';
import {createGuild} from '../../guild/tests/GuildTestUtils';
import {ensureSessionStarted, markChannelAsIndexed, sendMessage} from '../../message/tests/MessageTestUtils';
import {type ApiTestHarness, createApiTestHarness} from '../../test/ApiTestHarness';
import {HTTP_STATUS} from '../../test/TestConstants';
import {createBuilder} from '../../test/TestRequestBuilder';
interface MessageSearchResult {
messages: Array<{
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {User} from '@app/api/models/User';
import type {SearchableUser} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import {snowflakeToDate} from '@fluxer/snowflake/src/Snowflake';
import type {User} from '../../models/User';
export function convertToSearchableUser(user: User): SearchableUser {
const createdAt = Math.floor(snowflakeToDate(BigInt(user.id)).getTime() / 1000);