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

This commit is contained in:
Hampus
2026-09-13 20:18:22 +02:00
committed by GitHub
parent a59b80ce11
commit 84dcf6b8a8
1834 changed files with 11601 additions and 10725 deletions
@@ -3,11 +3,11 @@
import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
import type {AuditLogSearchFilters, SearchableAuditLog} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters, esTermFilter} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {compactFilters, esTermFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
function buildAuditLogFilters(filters: AuditLogSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
@@ -3,11 +3,11 @@
import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
import type {GuildSearchFilters, SearchableGuild} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters, esAndTerms, esTermFilter} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {compactFilters, esAndTerms, esTermFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
function buildGuildFilters(filters: GuildSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
@@ -6,11 +6,17 @@ import type {
GuildMemberSearchFilters,
SearchableGuildMember,
} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters, esAndTerms, esRangeFilter, esTermFilter, esTermsFilter} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {
compactFilters,
esAndTerms,
esRangeFilter,
esTermFilter,
esTermsFilter,
} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
function buildGuildMemberFilters(filters: GuildMemberSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
@@ -11,9 +11,9 @@ import type {
SortResults,
} from '@elastic/elasticsearch/lib/api/types';
import type {ISearchAdapter, SearchOptions, SearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters} from '../ElasticsearchFilterUtils';
import type {ElasticsearchIndexDefinition} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {compactFilters} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import type {ElasticsearchIndexDefinition} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
const ELASTICSEARCH_MAX_RESULT_WINDOW = 10000;
const DEEP_PAGINATION_BATCH_SIZE = 1000;
@@ -4,11 +4,17 @@ import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
import type {SearchOptions, SearchResult} from '@fluxer/schema/src/contracts/search/SearchAdapterTypes';
import type {MessageSearchFilters, SearchableMessage} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters, esAndTerms, esExcludeAny, esTermFilter, esTermsFilter} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {
compactFilters,
esAndTerms,
esExcludeAny,
esTermFilter,
esTermsFilter,
} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
const HAS_FIELD_MAP: Record<string, string> = {
image: 'hasImage',
@@ -3,11 +3,16 @@
import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
import type {ReportSearchFilters, SearchableReport} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import {compactFilters, esExistsFilter, esNotExistsFilter, esTermFilter} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {
compactFilters,
esExistsFilter,
esNotExistsFilter,
esTermFilter,
} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
function buildReportFilters(filters: ReportSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
@@ -3,7 +3,9 @@
import type {Client} from '@elastic/elasticsearch';
import type {SortCombinations} from '@elastic/elasticsearch/lib/api/types';
import type {SearchableUser, UserSearchFilters} from '@fluxer/schema/src/contracts/search/SearchDocumentTypes';
import type {ElasticsearchFilter} from '../ElasticsearchFilterUtils';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import type {ElasticsearchFilter} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {
compactFilters,
esAndTerms,
@@ -11,10 +13,8 @@ import {
esNotExistsFilter,
esRangeFilter,
esTermFilter,
} from '../ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '../ElasticsearchIndexDefinitions';
import type {ElasticsearchDistributedLock} from './ElasticsearchIndexAdapter';
import {ElasticsearchIndexAdapter} from './ElasticsearchIndexAdapter';
} from '@pkgs/elasticsearch_search/src/ElasticsearchFilterUtils';
import {ELASTICSEARCH_INDEX_DEFINITIONS} from '@pkgs/elasticsearch_search/src/ElasticsearchIndexDefinitions';
function buildUserFilters(filters: UserSearchFilters): Array<ElasticsearchFilter | undefined> {
const clauses: Array<ElasticsearchFilter | undefined> = [];
@@ -1,39 +1,39 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {EmailTemplate, EmailTemplateKey} from '@pkgs/email/src/email_i18n/EmailI18nTypes.generated';
import EMAIL_I18N_AR_MESSAGES from './locales/ar';
import EMAIL_I18N_BG_MESSAGES from './locales/bg';
import EMAIL_I18N_CS_MESSAGES from './locales/cs';
import EMAIL_I18N_DA_MESSAGES from './locales/da';
import EMAIL_I18N_DE_MESSAGES from './locales/de';
import EMAIL_I18N_EL_MESSAGES from './locales/el';
import EMAIL_I18N_EN_GB_MESSAGES from './locales/en-GB';
import EMAIL_I18N_ES_419_MESSAGES from './locales/es-419';
import EMAIL_I18N_ES_ES_MESSAGES from './locales/es-ES';
import EMAIL_I18N_FI_MESSAGES from './locales/fi';
import EMAIL_I18N_FR_MESSAGES from './locales/fr';
import EMAIL_I18N_HE_MESSAGES from './locales/he';
import EMAIL_I18N_HI_MESSAGES from './locales/hi';
import EMAIL_I18N_HR_MESSAGES from './locales/hr';
import EMAIL_I18N_HU_MESSAGES from './locales/hu';
import EMAIL_I18N_ID_MESSAGES from './locales/id';
import EMAIL_I18N_IT_MESSAGES from './locales/it';
import EMAIL_I18N_JA_MESSAGES from './locales/ja';
import EMAIL_I18N_KO_MESSAGES from './locales/ko';
import EMAIL_I18N_LT_MESSAGES from './locales/lt';
import EMAIL_I18N_NL_MESSAGES from './locales/nl';
import EMAIL_I18N_NO_MESSAGES from './locales/no';
import EMAIL_I18N_PL_MESSAGES from './locales/pl';
import EMAIL_I18N_PT_BR_MESSAGES from './locales/pt-BR';
import EMAIL_I18N_RO_MESSAGES from './locales/ro';
import EMAIL_I18N_RU_MESSAGES from './locales/ru';
import EMAIL_I18N_SV_SE_MESSAGES from './locales/sv-SE';
import EMAIL_I18N_TH_MESSAGES from './locales/th';
import EMAIL_I18N_TR_MESSAGES from './locales/tr';
import EMAIL_I18N_UK_MESSAGES from './locales/uk';
import EMAIL_I18N_VI_MESSAGES from './locales/vi';
import EMAIL_I18N_ZH_CN_MESSAGES from './locales/zh-CN';
import EMAIL_I18N_ZH_TW_MESSAGES from './locales/zh-TW';
import EMAIL_I18N_AR_MESSAGES from '@pkgs/email/src/email_i18n/locales/ar';
import EMAIL_I18N_BG_MESSAGES from '@pkgs/email/src/email_i18n/locales/bg';
import EMAIL_I18N_CS_MESSAGES from '@pkgs/email/src/email_i18n/locales/cs';
import EMAIL_I18N_DA_MESSAGES from '@pkgs/email/src/email_i18n/locales/da';
import EMAIL_I18N_DE_MESSAGES from '@pkgs/email/src/email_i18n/locales/de';
import EMAIL_I18N_EL_MESSAGES from '@pkgs/email/src/email_i18n/locales/el';
import EMAIL_I18N_EN_GB_MESSAGES from '@pkgs/email/src/email_i18n/locales/en-GB';
import EMAIL_I18N_ES_419_MESSAGES from '@pkgs/email/src/email_i18n/locales/es-419';
import EMAIL_I18N_ES_ES_MESSAGES from '@pkgs/email/src/email_i18n/locales/es-ES';
import EMAIL_I18N_FI_MESSAGES from '@pkgs/email/src/email_i18n/locales/fi';
import EMAIL_I18N_FR_MESSAGES from '@pkgs/email/src/email_i18n/locales/fr';
import EMAIL_I18N_HE_MESSAGES from '@pkgs/email/src/email_i18n/locales/he';
import EMAIL_I18N_HI_MESSAGES from '@pkgs/email/src/email_i18n/locales/hi';
import EMAIL_I18N_HR_MESSAGES from '@pkgs/email/src/email_i18n/locales/hr';
import EMAIL_I18N_HU_MESSAGES from '@pkgs/email/src/email_i18n/locales/hu';
import EMAIL_I18N_ID_MESSAGES from '@pkgs/email/src/email_i18n/locales/id';
import EMAIL_I18N_IT_MESSAGES from '@pkgs/email/src/email_i18n/locales/it';
import EMAIL_I18N_JA_MESSAGES from '@pkgs/email/src/email_i18n/locales/ja';
import EMAIL_I18N_KO_MESSAGES from '@pkgs/email/src/email_i18n/locales/ko';
import EMAIL_I18N_LT_MESSAGES from '@pkgs/email/src/email_i18n/locales/lt';
import EMAIL_I18N_NL_MESSAGES from '@pkgs/email/src/email_i18n/locales/nl';
import EMAIL_I18N_NO_MESSAGES from '@pkgs/email/src/email_i18n/locales/no';
import EMAIL_I18N_PL_MESSAGES from '@pkgs/email/src/email_i18n/locales/pl';
import EMAIL_I18N_PT_BR_MESSAGES from '@pkgs/email/src/email_i18n/locales/pt-BR';
import EMAIL_I18N_RO_MESSAGES from '@pkgs/email/src/email_i18n/locales/ro';
import EMAIL_I18N_RU_MESSAGES from '@pkgs/email/src/email_i18n/locales/ru';
import EMAIL_I18N_SV_SE_MESSAGES from '@pkgs/email/src/email_i18n/locales/sv-SE';
import EMAIL_I18N_TH_MESSAGES from '@pkgs/email/src/email_i18n/locales/th';
import EMAIL_I18N_TR_MESSAGES from '@pkgs/email/src/email_i18n/locales/tr';
import EMAIL_I18N_UK_MESSAGES from '@pkgs/email/src/email_i18n/locales/uk';
import EMAIL_I18N_VI_MESSAGES from '@pkgs/email/src/email_i18n/locales/vi';
import EMAIL_I18N_ZH_CN_MESSAGES from '@pkgs/email/src/email_i18n/locales/zh-CN';
import EMAIL_I18N_ZH_TW_MESSAGES from '@pkgs/email/src/email_i18n/locales/zh-TW';
export const EMAIL_I18N_LOCALE_MESSAGES = {
ar: EMAIL_I18N_AR_MESSAGES,
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_AR_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_BG_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_CS_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_DA_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_DE_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_EL_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_EN_GB_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_ES_419_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_ES_ES_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_FI_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_FR_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_HE_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_HI_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_HR_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_HU_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_ID_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_IT_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_JA_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_KO_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_LT_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_NL_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_NO_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_PL_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_PT_BR_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_RO_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_RU_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_SV_SE_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_TH_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_TR_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_UK_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_VI_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_ZH_CN_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {defineEmailI18nLocaleMessages} from '../EmailI18nMessages';
import {defineEmailI18nLocaleMessages} from '@pkgs/email/src/email_i18n/EmailI18nMessages';
const EMAIL_I18N_ZH_TW_MESSAGES = defineEmailI18nLocaleMessages({
"account_disabled_suspicious": {
@@ -3,7 +3,7 @@
import {AGE_BLOCKED_GEOS, AGE_RESTRICTED_GEOS} from '@fluxer/instance_bootstrap/src/AgeGeos';
import type {GeolocationResponse} from '@fluxer/instance_bootstrap/src/Types';
import {extractClientIp} from '@fluxer/ip_utils/src/ClientIp';
import {lookupGeoipByIp} from './GeoipLookup';
import {lookupGeoipByIp} from '@pkgs/geoip/src/GeoipLookup';
interface ResolveClientGeoipOptions {
maxmindDbPath: string | undefined;
+4 -29
View File
@@ -1,38 +1,14 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {existsSync, readFileSync, rmSync, statSync} from 'node:fs';
import {readFileSync, rmSync} from 'node:fs';
import {isBuiltin} from 'node:module';
import {dirname, join, resolve} from 'node:path';
import {fileURLToPath} from 'node:url';
import {build} from 'esbuild';
const API_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
const REPO_ROOT = resolve(API_ROOT, '..');
const OUT_DIR = join(API_ROOT, 'dist');
const CANDIDATE_SUFFIXES = ['', '.ts', '.tsx', '.js', '.mjs', '/index.ts', '/index.tsx', '/index.js', '/src/index.ts'];
const WORKSPACE_ROOTS = {
'@app/': join(API_ROOT, 'src'),
'@pkgs/': join(API_ROOT, 'pkgs'),
'@fluxer/': join(REPO_ROOT, 'packages'),
};
function resolveWorkspacePath(specifier) {
for (const [prefix, root] of Object.entries(WORKSPACE_ROOTS)) {
if (!specifier.startsWith(prefix)) {
continue;
}
const base = join(root, specifier.slice(prefix.length));
for (const suffix of CANDIDATE_SUFFIXES) {
const candidate = `${base}${suffix}`;
if (existsSync(candidate) && statSync(candidate).isFile()) {
return candidate;
}
}
throw new Error(`Unable to resolve workspace import ${specifier}`);
}
return null;
}
const WORKSPACE_PREFIXES = ['@app/', '@pkgs/', '@fluxer/'];
function packageNameOf(specifier) {
const segments = specifier.split('/');
@@ -48,9 +24,8 @@ const workspacePlugin = {
name: 'fluxer-workspace',
setup(pluginBuild) {
pluginBuild.onResolve({filter: /^[^./]/}, (args) => {
const workspacePath = resolveWorkspacePath(args.path);
if (workspacePath) {
return {path: workspacePath};
if (WORKSPACE_PREFIXES.some((prefix) => args.path.startsWith(prefix))) {
return undefined;
}
const packageName = packageNameOf(args.path);
if (!isBuiltin(args.path) && !declaredDependencies.has(packageName)) {
+13 -13
View File
@@ -1,24 +1,24 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {InboundSmsChallengeService} from '@app/api/auth/services/InboundSmsChallengeService';
import type {PhoneAttemptRiskService} from '@app/api/auth/services/PhoneAttemptRiskService';
import type {IPhoneLookupRepository} from '@app/api/auth/services/PhoneLookupRepository';
import type {Config} from '@app/api/Config';
import type {IEmailDnsValidationService} from '@app/api/infrastructure/IEmailDnsValidationService';
import type {IGatewayService} from '@app/api/infrastructure/IGatewayService';
import type {IMediaService} from '@app/api/infrastructure/IMediaService';
import type {ISnowflakeService} from '@app/api/infrastructure/ISnowflakeService';
import type {BotMfaMirrorService} from '@app/api/oauth/BotMfaMirrorService';
import type {IUserRepository} from '@app/api/user/IUserRepository';
import type {UserActivityBuffer} from '@app/api/user/services/UserActivityBuffer';
import type {UserContactChangeLogService} from '@app/api/user/services/UserContactChangeLogService';
import type {WorkerTaskName} from '@app/api/worker/WorkerLaneConfig';
import type {ICacheService} from '@pkgs/cache/src/ICacheService';
import type {IEmailService} from '@pkgs/email/src/IEmailService';
import type {IKVProvider} from '@pkgs/kv_client/src/IKVProvider';
import type {IRateLimitService} from '@pkgs/rate_limit/src/IRateLimitService';
import type {ISmsService} from '@pkgs/sms/src/ISmsService';
import type {IWorkerService} from '@pkgs/worker/src/contracts/IWorkerService';
import type {InboundSmsChallengeService} from './auth/services/InboundSmsChallengeService';
import type {PhoneAttemptRiskService} from './auth/services/PhoneAttemptRiskService';
import type {IPhoneLookupRepository} from './auth/services/PhoneLookupRepository';
import type {Config} from './Config';
import type {IEmailDnsValidationService} from './infrastructure/IEmailDnsValidationService';
import type {IGatewayService} from './infrastructure/IGatewayService';
import type {IMediaService} from './infrastructure/IMediaService';
import type {ISnowflakeService} from './infrastructure/ISnowflakeService';
import type {BotMfaMirrorService} from './oauth/BotMfaMirrorService';
import type {IUserRepository} from './user/IUserRepository';
import type {UserActivityBuffer} from './user/services/UserActivityBuffer';
import type {UserContactChangeLogService} from './user/services/UserContactChangeLogService';
import type {WorkerTaskName} from './worker/WorkerLaneConfig';
export interface ApiServices {
users: IUserRepository;
+7 -7
View File
@@ -1,5 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createInitializer, createShutdown} from '@app/api/app/APILifecycle';
import {registerControllers} from '@app/api/app/ControllerRegistry';
import {configureMiddleware} from '@app/api/app/MiddlewarePipeline';
import type {APIConfig} from '@app/api/config/APIConfig';
import type {ILogger} from '@app/api/ILogger';
import {recordHttpClientError} from '@app/api/middleware/AbusiveIpAutoBanner';
import type {HonoApp, HonoEnv} from '@app/api/types/HonoEnv';
import {AppErrorHandler, AppNotFoundHandler} from '@fluxer/errors/src/domains/core/ErrorHandlers';
import {IpBannedError} from '@fluxer/errors/src/domains/moderation/IpBannedError';
import {resolveErrorStatus} from '@fluxer/errors/src/error_handling/ErrorIntrospection';
@@ -8,13 +15,6 @@ import {LOCKED_DOWN_PERMISSIONS_POLICY, securityHeaders} from '@fluxer/hono/src/
import {setIsDevelopment} from '@fluxer/schema/src/primitives/UrlValidators';
import type {Context} from 'hono';
import {Hono} from 'hono';
import {createInitializer, createShutdown} from './app/APILifecycle';
import {registerControllers} from './app/ControllerRegistry';
import {configureMiddleware} from './app/MiddlewarePipeline';
import type {APIConfig} from './config/APIConfig';
import type {ILogger} from './ILogger';
import {recordHttpClientError} from './middleware/AbusiveIpAutoBanner';
import type {HonoApp, HonoEnv} from './types/HonoEnv';
interface CreateAPIAppOptions {
config: APIConfig;
+1 -1
View File
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {buildAPIConfigFromMaster, buildAPIServerOptions} from '@app/api/Config';
import {loadConfig, resetConfig} from '@fluxer/config/src/ConfigLoader';
import type {MasterConfig} from '@fluxer/config/src/MasterConfig';
import {createServer} from '@fluxer/hono/src/Server';
import {Hono} from 'hono';
import {afterAll, afterEach, beforeAll, describe, expect, it, test, vi} from 'vitest';
import {buildAPIConfigFromMaster, buildAPIServerOptions} from './Config';
interface ListeningServer {
close: (callback: () => void) => void;
+2 -2
View File
@@ -1,11 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {APIConfig, BlueskyOAuthConfig} from '@app/api/config/APIConfig';
import type {WorkerTaskName} from '@app/api/worker/WorkerLaneConfig';
import type {MasterConfig} from '@fluxer/config/src/MasterConfig';
import {resolveDownloadsProvider} from '@fluxer/config/src/S3DownloadsProvider';
import {parseIpAddress} from '@fluxer/ip_utils/src/IpAddress';
import {parseGeoipSourceConfig, resolveGeoipRuntimeSourceConfig} from '@pkgs/geoip/src/GeoipStartup';
import type {APIConfig, BlueskyOAuthConfig} from './config/APIConfig';
import type {WorkerTaskName} from './worker/WorkerLaneConfig';
function extractHostname(url: string): string {
try {
+6 -6
View File
@@ -1,16 +1,16 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ApiContext, ApiServices, RequestScope} from './ApiContext';
import {CassandraPhoneLookupRepository} from './auth/services/PhoneLookupRepository';
import {Config} from './Config';
import {getInboundSmsChallengeServiceInstance} from './middleware/ServiceMiddleware';
import type {ApiContext, ApiServices, RequestScope} from '@app/api/ApiContext';
import {CassandraPhoneLookupRepository} from '@app/api/auth/services/PhoneLookupRepository';
import {Config} from '@app/api/Config';
import {getInboundSmsChallengeServiceInstance} from '@app/api/middleware/ServiceMiddleware';
import {
getGatewayService,
getKVClient,
getMediaService,
getSnowflakeService,
getWorkerService,
} from './middleware/ServiceRegistry';
} from '@app/api/middleware/ServiceRegistry';
import {
getBotMfaMirrorService,
getCacheService,
@@ -22,7 +22,7 @@ import {
getSmsService,
getUserActivityBuffer,
getUserRepository,
} from './middleware/ServiceSingletons';
} from '@app/api/middleware/ServiceSingletons';
let cachedServices: ApiServices | null = null;
let cachedConfigRef: typeof Config | null = null;
+1 -1
View File
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ILogger} from './ILogger';
import type {ILogger} from '@app/api/ILogger';
let _logger: ILogger | null = null;
+14 -14
View File
@@ -1,19 +1,19 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {AdminRateLimitConfigs} from './rate_limit_configs/AdminRateLimitConfig';
import {AuthRateLimitConfigs} from './rate_limit_configs/AuthRateLimitConfig';
import {ChannelRateLimitConfigs} from './rate_limit_configs/ChannelRateLimitConfig';
import {DiscoveryRateLimitConfigs} from './rate_limit_configs/DiscoveryRateLimitConfig';
import {DonationRateLimitConfigs} from './rate_limit_configs/DonationRateLimitConfig';
import {GuildRateLimitConfigs} from './rate_limit_configs/GuildRateLimitConfig';
import {IntegrationRateLimitConfigs} from './rate_limit_configs/IntegrationRateLimitConfig';
import {InviteRateLimitConfigs} from './rate_limit_configs/InviteRateLimitConfig';
import {MiscRateLimitConfigs} from './rate_limit_configs/MiscRateLimitConfig';
import {OAuthRateLimitConfigs} from './rate_limit_configs/OAuthRateLimitConfig';
import type {RateLimitSection} from './rate_limit_configs/RateLimitHelpers';
import {mergeRateLimitSections} from './rate_limit_configs/RateLimitHelpers';
import {UserRateLimitConfigs} from './rate_limit_configs/UserRateLimitConfig';
import {WebhookRateLimitConfigs} from './rate_limit_configs/WebhookRateLimitConfig';
import {AdminRateLimitConfigs} from '@app/api/rate_limit_configs/AdminRateLimitConfig';
import {AuthRateLimitConfigs} from '@app/api/rate_limit_configs/AuthRateLimitConfig';
import {ChannelRateLimitConfigs} from '@app/api/rate_limit_configs/ChannelRateLimitConfig';
import {DiscoveryRateLimitConfigs} from '@app/api/rate_limit_configs/DiscoveryRateLimitConfig';
import {DonationRateLimitConfigs} from '@app/api/rate_limit_configs/DonationRateLimitConfig';
import {GuildRateLimitConfigs} from '@app/api/rate_limit_configs/GuildRateLimitConfig';
import {IntegrationRateLimitConfigs} from '@app/api/rate_limit_configs/IntegrationRateLimitConfig';
import {InviteRateLimitConfigs} from '@app/api/rate_limit_configs/InviteRateLimitConfig';
import {MiscRateLimitConfigs} from '@app/api/rate_limit_configs/MiscRateLimitConfig';
import {OAuthRateLimitConfigs} from '@app/api/rate_limit_configs/OAuthRateLimitConfig';
import type {RateLimitSection} from '@app/api/rate_limit_configs/RateLimitHelpers';
import {mergeRateLimitSections} from '@app/api/rate_limit_configs/RateLimitHelpers';
import {UserRateLimitConfigs} from '@app/api/rate_limit_configs/UserRateLimitConfig';
import {WebhookRateLimitConfigs} from '@app/api/rate_limit_configs/WebhookRateLimitConfig';
const rateLimitSections = [
AuthRateLimitConfigs,
+13 -13
View File
@@ -1,20 +1,20 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {Config} from '@app/api/Config';
import {ElasticsearchSearchProvider} from '@app/api/infrastructure/ElasticsearchSearchProvider';
import {MeilisearchSearchProvider} from '@app/api/infrastructure/MeilisearchSearchProvider';
import {NullSearchProvider} from '@app/api/infrastructure/NullSearchProvider';
import {Logger} from '@app/api/Logger';
import {getInjectedSearchProvider} from '@app/api/middleware/ServiceRegistry';
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 {ISearchProvider} from '@app/api/search/ISearchProvider';
import type {IUserSearchService} from '@app/api/search/IUserSearchService';
import {DEFAULT_SEARCH_CLIENT_TIMEOUT_MS} from '@fluxer/constants/src/Timeouts';
import type {ElasticsearchDistributedLock} from '@pkgs/elasticsearch_search/src/adapters/ElasticsearchIndexAdapter';
import {Config} from './Config';
import {ElasticsearchSearchProvider} from './infrastructure/ElasticsearchSearchProvider';
import {MeilisearchSearchProvider} from './infrastructure/MeilisearchSearchProvider';
import {NullSearchProvider} from './infrastructure/NullSearchProvider';
import {Logger} from './Logger';
import {getInjectedSearchProvider} from './middleware/ServiceRegistry';
import type {IAuditLogSearchService} from './search/IAuditLogSearchService';
import type {IGuildMemberSearchService} from './search/IGuildMemberSearchService';
import type {IGuildSearchService} from './search/IGuildSearchService';
import type {IMessageSearchService} from './search/IMessageSearchService';
import type {IReportSearchService} from './search/IReportSearchService';
import type {ISearchProvider} from './search/ISearchProvider';
import type {IUserSearchService} from './search/IUserSearchService';
let searchProvider: ISearchProvider | null = null;
+24 -21
View File
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AttachmentID, ChannelID, GuildID, MemeID, PasswordResetToken, UserID} from './BrandedTypes';
import {defineTable} from './database/CassandraTableDsl';
import type {AttachmentID, ChannelID, GuildID, MemeID, PasswordResetToken, UserID} from '@app/api/BrandedTypes';
import {defineTable} from '@app/api/database/CassandraTableDsl';
import {
ADMIN_ARCHIVE_COLUMNS,
ADMIN_ARCHIVE_INDEX_COLUMNS,
@@ -31,19 +31,19 @@ import {
type DisposableEmailDomainRow,
SUSPICIOUS_EMAIL_DOMAIN_COLUMNS,
type SuspiciousEmailDomainRow,
} from './database/types/AdminArchiveTypes';
} from '@app/api/database/types/AdminArchiveTypes';
import {
ADMIN_API_KEY_BY_CREATOR_COLUMNS,
ADMIN_API_KEY_COLUMNS,
type AdminApiKeyByCreatorRow,
type AdminApiKeyRow,
} from './database/types/AdminAuthTypes';
} from '@app/api/database/types/AdminAuthTypes';
import {
ATTACHMENT_UPLOAD_TRACE_BY_ATTACHMENT_COLUMNS,
ATTACHMENT_UPLOAD_TRACE_BY_KEY_COLUMNS,
type AttachmentUploadTraceByAttachmentRow,
type AttachmentUploadTraceByKeyRow,
} from './database/types/AttachmentUploadTypes';
} from '@app/api/database/types/AttachmentUploadTypes';
import {
AUTH_SESSION_COLUMNS,
AUTH_SESSION_TOMBSTONE_COLUMNS,
@@ -77,7 +77,7 @@ import {
type UserSsoIdentityRow,
WEBAUTHN_CREDENTIAL_COLUMNS,
type WebAuthnCredentialRow,
} from './database/types/AuthTypes';
} from '@app/api/database/types/AuthTypes';
import {
BILLING_ACTION_INTENT_COLUMNS,
BILLING_CHARGE_BY_CUSTOMER_COLUMNS,
@@ -133,7 +133,7 @@ import {
type BillingSubscriptionByCustomerRow,
type BillingSubscriptionByUserRow,
type BillingSubscriptionRow,
} from './database/types/BillingTypes';
} from '@app/api/database/types/BillingTypes';
import {
CHANNEL_COLUMNS,
CHANNELS_BY_GUILD_COLUMNS,
@@ -147,20 +147,20 @@ import {
type PrivateChannelRow,
WEBHOOK_COLUMNS,
type WebhookRow,
} from './database/types/ChannelTypes';
import {USER_CONNECTION_STORAGE_COLUMNS, type UserConnectionStorageRow} from './database/types/ConnectionTypes';
} from '@app/api/database/types/ChannelTypes';
import {USER_CONNECTION_STORAGE_COLUMNS, type UserConnectionStorageRow} from '@app/api/database/types/ConnectionTypes';
import {
NCMEC_ATTACHMENT_SUBMISSION_COLUMNS,
NCMEC_USER_WORKFLOW_COLUMNS,
type NcmecAttachmentSubmissionRow,
type NcmecUserWorkflowRow,
} from './database/types/CsamTypes';
} from '@app/api/database/types/CsamTypes';
import {
GUILD_DISCOVERY_BY_STATUS_COLUMNS,
GUILD_DISCOVERY_COLUMNS,
type GuildDiscoveryByStatusRow,
type GuildDiscoveryRow,
} from './database/types/GuildDiscoveryTypes';
} from '@app/api/database/types/GuildDiscoveryTypes';
import {
GUILD_AUDIT_LOG_COLUMNS,
GUILD_BAN_BY_EMAIL_COLUMNS,
@@ -186,8 +186,11 @@ import {
type GuildRoleRow,
type GuildRow,
type GuildStickerRow,
} from './database/types/GuildTypes';
import {INSTANCE_CONFIGURATION_COLUMNS, type InstanceConfigurationRow} from './database/types/InstanceConfigTypes';
} from '@app/api/database/types/GuildTypes';
import {
INSTANCE_CONFIGURATION_COLUMNS,
type InstanceConfigurationRow,
} from '@app/api/database/types/InstanceConfigTypes';
import {
JOB_ACTIVE_COLUMNS,
JOB_BY_DAY_BUCKET_COLUMNS,
@@ -195,7 +198,7 @@ import {
type JobActiveRow,
type JobByDayBucketRow,
type JobByIdRow,
} from './database/types/JobLedgerTypes';
} from '@app/api/database/types/JobLedgerTypes';
import {
ATTACHMENT_LOOKUP_COLUMNS,
type AttachmentLookupRow,
@@ -213,7 +216,7 @@ import {
type MessageByAuthorRow,
type MessageReactionRow,
type MessageRow,
} from './database/types/MessageTypes';
} from '@app/api/database/types/MessageTypes';
import {
APPLICATION_COLUMNS,
type ApplicationByOwnerRow,
@@ -226,7 +229,7 @@ import {
type OAuth2AuthorizationCodeRow,
type OAuth2RefreshTokenByUserRow,
type OAuth2RefreshTokenRow,
} from './database/types/OAuth2Types';
} from '@app/api/database/types/OAuth2Types';
import {
GIFT_CODE_BY_CREATOR_COLUMNS,
GIFT_CODE_BY_PAYMENT_INTENT_COLUMNS,
@@ -246,7 +249,7 @@ import {
type PaymentRow,
VISIONARY_SLOT_COLUMNS,
type VisionarySlotRow,
} from './database/types/PaymentTypes';
} from '@app/api/database/types/PaymentTypes';
import {
DSA_REPORT_EMAIL_VERIFICATION_COLUMNS,
DSA_REPORT_TICKET_COLUMNS,
@@ -256,7 +259,7 @@ import {
type IARSubmissionRow,
MESSAGE_REPORT_SUBMISSION_BY_REPORTER_COLUMNS,
type MessageReportSubmissionByReporterRow,
} from './database/types/ReportTypes';
} from '@app/api/database/types/ReportTypes';
import {
INBOUND_SMS_CHALLENGE_BY_USER_COLUMNS,
INBOUND_SMS_CHALLENGE_COLUMNS,
@@ -290,7 +293,7 @@ import {
type RiskOutcomeBySubnetRow,
SUSPICIOUS_IP_COLUMNS,
type SuspiciousIpRow,
} from './database/types/RiskTypes';
} from '@app/api/database/types/RiskTypes';
import {
FAVORITE_MEME_COLUMNS,
type FavoriteMemeRow,
@@ -336,8 +339,8 @@ import {
type UserRow,
type UserSettingsRow,
type UsersPendingDeletionRow,
} from './database/types/UserTypes';
import {ATTACHMENT_DECAY_COLUMNS, type AttachmentDecayRow} from './types/AttachmentDecayTypes';
} from '@app/api/database/types/UserTypes';
import {ATTACHMENT_DECAY_COLUMNS, type AttachmentDecayRow} from '@app/api/types/AttachmentDecayTypes';
export const Users = defineTable<UserRow, 'user_id'>({
name: 'users',
+2 -2
View File
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {requireRequestJsonBody} from '@app/api/utils/RequestJsonBody';
import {initializeFluxerErrorMap} from '@app/api/ZodErrorMap';
import type {ValidationErrorCode} from '@fluxer/constants/src/ValidationErrorCodes';
import {isValidationErrorCode, ValidationErrorCodes} from '@fluxer/constants/src/ValidationErrorCodes';
import {
@@ -11,8 +13,6 @@ import {schemaMetadata} from '@fluxer/schema/src/SchemaMetadata';
import type {Context, Env, Input, MiddlewareHandler, TypedResponse, ValidationTargets} from 'hono';
import {getCookie} from 'hono/cookie';
import {type core, type input, type output, ZodObject, ZodOptional, type ZodSafeParseResult, type ZodType} from 'zod';
import {requireRequestJsonBody} from './utils/RequestJsonBody';
import {initializeFluxerErrorMap} from './ZodErrorMap';
initializeFluxerErrorMap();
+1 -1
View File
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {initializeFluxerErrorMap} from '@app/api/ZodErrorMap';
import {ValidationErrorCodes} from '@fluxer/constants/src/ValidationErrorCodes';
import {beforeAll, describe, expect, it} from 'vitest';
import {z} from 'zod';
import {initializeFluxerErrorMap} from './ZodErrorMap';
function firstIssueMessage(schema: z.ZodType, value: unknown): string | undefined {
const result = schema.safeParse(value);
+10 -10
View File
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {getSameIpDecisionKey} from '@fluxer/ip_utils/src/IpAddress';
import {createUserID} from '../BrandedTypes';
import {deleteOneOrMany, fetchMany, fetchOne, upsertOne} from '../database/CassandraQueryExecution';
import type {AdminAuditLog, BannedIpEntry, BannedIpKind, IAdminRepository} from '@app/api/admin/IAdminRepository';
import {createUserID} from '@app/api/BrandedTypes';
import {deleteOneOrMany, fetchMany, fetchOne, upsertOne} from '@app/api/database/CassandraQueryExecution';
import type {
AdminAuditLogRow,
BannedAvatarHashRow,
@@ -11,9 +11,9 @@ import type {
BannedProfileSubstringScope,
BannedUrlDomainRow,
BannedUrlRow,
} from '../database/types/AdminArchiveTypes';
import {isAccountPolicyContactDomainReputationExempt} from '../risk/AccountPolicyService';
import {isIpBanExempt} from '../risk/IpBanExemptions';
} from '@app/api/database/types/AdminArchiveTypes';
import {isAccountPolicyContactDomainReputationExempt} from '@app/api/risk/AccountPolicyService';
import {isIpBanExempt} from '@app/api/risk/IpBanExemptions';
import {
AdminAuditLogs,
BannedAvatarHashes,
@@ -27,10 +27,10 @@ import {
BannedUrls,
DisposableEmailDomains,
SuspiciousEmailDomains,
} from '../Tables';
import {parseIpBanEntry, tryParseSingleIp} from '../utils/IpRangeUtils';
import {canonicalizeStoredPhrase} from '../utils/PhraseBlocklistNormalization';
import type {AdminAuditLog, BannedIpEntry, BannedIpKind, IAdminRepository} from './IAdminRepository';
} from '@app/api/Tables';
import {parseIpBanEntry, tryParseSingleIp} from '@app/api/utils/IpRangeUtils';
import {canonicalizeStoredPhrase} from '@app/api/utils/PhraseBlocklistNormalization';
import {getSameIpDecisionKey} from '@fluxer/ip_utils/src/IpAddress';
const FETCH_AUDIT_LOG_BY_ID_QUERY = AdminAuditLogs.select({
where: AdminAuditLogs.where.eq('log_id'),
+40 -40
View File
@@ -1,49 +1,49 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {SendSystemDmResponse} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import type {IpInfoService} from '@pkgs/geoip/src/IpInfoService';
import type Stripe from 'stripe';
import type {ApiContext} from '../ApiContext';
import type {UserID} from '../BrandedTypes';
import type {IChannelRepository} from '../channel/IChannelRepository';
import type {ChannelService} from '../channel/services/ChannelService';
import type {IGuildRepositoryAggregate} from '../guild/repositories/IGuildRepositoryAggregate';
import type {GuildService} from '../guild/services/GuildService';
import type {IDiscriminatorService} from '../infrastructure/DiscriminatorService';
import type {EntityAssetService} from '../infrastructure/EntityAssetService';
import type {IAssetDeletionQueue} from '../infrastructure/IAssetDeletionQueue';
import type {IStorageService} from '../infrastructure/IStorageService';
import type {KVBulkMessageDeletionQueueService} from '../infrastructure/KVBulkMessageDeletionQueueService';
import type {UserCacheService} from '../infrastructure/UserCacheService';
import type {InviteRepository} from '../invite/InviteRepository';
import type {IJobLedgerRepository} from '../jobs/IJobLedgerRepository';
import {JobAdminService} from '../jobs/JobAdminService';
import type {ApiContext} from '@app/api/ApiContext';
import type {IAdminRepository} from '@app/api/admin/IAdminRepository';
import {AdminApplicationService} from '@app/api/admin/services/AdminApplicationService';
import {AdminAssetPurgeService} from '@app/api/admin/services/AdminAssetPurgeService';
import {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import {AdminBanManagementService} from '@app/api/admin/services/AdminBanManagementService';
import {AdminCodeGenerationService} from '@app/api/admin/services/AdminCodeGenerationService';
import {AdminGuildService} from '@app/api/admin/services/AdminGuildService';
import {AdminMessageDeletionService} from '@app/api/admin/services/AdminMessageDeletionService';
import {AdminMessageService} from '@app/api/admin/services/AdminMessageService';
import {AdminMessageShredService} from '@app/api/admin/services/AdminMessageShredService';
import {AdminReportService} from '@app/api/admin/services/AdminReportService';
import {AdminSearchService} from '@app/api/admin/services/AdminSearchService';
import {AdminUserRelationshipService} from '@app/api/admin/services/AdminUserRelationshipService';
import {AdminUserService} from '@app/api/admin/services/AdminUserService';
import {AdminVoiceService} from '@app/api/admin/services/AdminVoiceService';
import 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 {IGuildRepositoryAggregate} from '@app/api/guild/repositories/IGuildRepositoryAggregate';
import type {GuildService} from '@app/api/guild/services/GuildService';
import type {IDiscriminatorService} from '@app/api/infrastructure/DiscriminatorService';
import type {EntityAssetService} from '@app/api/infrastructure/EntityAssetService';
import type {IAssetDeletionQueue} from '@app/api/infrastructure/IAssetDeletionQueue';
import type {IStorageService} from '@app/api/infrastructure/IStorageService';
import type {KVBulkMessageDeletionQueueService} from '@app/api/infrastructure/KVBulkMessageDeletionQueueService';
import type {UserCacheService} from '@app/api/infrastructure/UserCacheService';
import type {InviteRepository} from '@app/api/invite/InviteRepository';
import type {IJobLedgerRepository} from '@app/api/jobs/IJobLedgerRepository';
import {JobAdminService} from '@app/api/jobs/JobAdminService';
import {
getGuildDiscoveryRepository,
getKVAccountDeletionQueue,
getNcmecSubmissionService,
} from '../middleware/ServiceSingletons';
import type {IApplicationRepository} from '../oauth/repositories/IApplicationRepository';
import type {ReportService} from '../report/ReportService';
import type {IRiskHistoryRepository} from '../risk/HistoricalOutcomeRepository';
import type {ISuspiciousIpRepository} from '../risk/SuspiciousIpRepository';
import type {UserService} from '../user/services/UserService';
import type {VoiceRepository} from '../voice/VoiceRepository';
import type {IAdminRepository} from './IAdminRepository';
import {AdminApplicationService} from './services/AdminApplicationService';
import {AdminAssetPurgeService} from './services/AdminAssetPurgeService';
import {AdminAuditService} from './services/AdminAuditService';
import {AdminBanManagementService} from './services/AdminBanManagementService';
import {AdminCodeGenerationService} from './services/AdminCodeGenerationService';
import {AdminGuildService} from './services/AdminGuildService';
import {AdminMessageDeletionService} from './services/AdminMessageDeletionService';
import {AdminMessageService} from './services/AdminMessageService';
import {AdminMessageShredService} from './services/AdminMessageShredService';
import {AdminReportService} from './services/AdminReportService';
import {AdminSearchService} from './services/AdminSearchService';
import {AdminUserRelationshipService} from './services/AdminUserRelationshipService';
import {AdminUserService} from './services/AdminUserService';
import {AdminVoiceService} from './services/AdminVoiceService';
} from '@app/api/middleware/ServiceSingletons';
import type {IApplicationRepository} from '@app/api/oauth/repositories/IApplicationRepository';
import type {ReportService} from '@app/api/report/ReportService';
import type {IRiskHistoryRepository} from '@app/api/risk/HistoricalOutcomeRepository';
import type {ISuspiciousIpRepository} from '@app/api/risk/SuspiciousIpRepository';
import type {UserService} from '@app/api/user/services/UserService';
import type {VoiceRepository} from '@app/api/voice/VoiceRepository';
import type {SendSystemDmResponse} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import type {IpInfoService} from '@pkgs/geoip/src/IpInfoService';
import type Stripe from 'stripe';
export class AdminService {
readonly auditService: AdminAuditService;
+2 -2
View File
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {UserID} from '../BrandedTypes';
import type {UserID} from '@app/api/BrandedTypes';
import type {
AdminAuditLogRow,
BannedAvatarHashRow,
@@ -9,7 +9,7 @@ import type {
BannedProfileSubstringScope,
BannedUrlDomainRow,
BannedUrlRow,
} from '../database/types/AdminArchiveTypes';
} from '@app/api/database/types/AdminArchiveTypes';
export interface AdminAuditLog {
logId: bigint;
@@ -1,5 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AdminApiKeyView} from '@app/api/admin/services/AdminApiKeyService';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {
AdminApiKeyListResponse,
@@ -13,14 +20,6 @@ import {
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {KeyIdParam} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
import type {AdminApiKeyView} from '../services/AdminApiKeyService';
function toApiKeyResponse(key: AdminApiKeyView): ListAdminApiKeyResponseType {
return {
key_id: key.keyId,
@@ -1,5 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createApplicationID, createGuildID, createUserID} from '@app/api/BrandedTypes';
import {requireAdminACL, requireAnyAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {InputValidationError} from '@fluxer/errors/src/domains/core/InputValidationError';
import {MissingACLError} from '@fluxer/errors/src/domains/core/MissingACLError';
@@ -12,13 +19,6 @@ import {
TransferApplicationOwnershipRequest,
} from '@fluxer/schema/src/domains/admin/AdminApplicationSchemas';
import {UserIdParam} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
import {createApplicationID, createGuildID, createUserID} from '../../BrandedTypes';
import {requireAdminACL, requireAnyAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
function requireRequestAdminACL(granted: ReadonlySet<string>, required: string): void {
if (!granted.has(required) && !granted.has(AdminACLs.WILDCARD)) {
@@ -1,5 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createGuildID, createUserID} from '@app/api/BrandedTypes';
import {requireAdminACL, requireAnyAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {MissingACLError} from '@fluxer/errors/src/domains/core/MissingACLError';
import {
@@ -14,13 +21,6 @@ import {
ListArchivesResponseSchema,
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {ArchivePathParam, GuildIdParam, UserIdParam} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
import {createGuildID, createUserID} from '../../BrandedTypes';
import {requireAdminACL, requireAnyAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
function canViewArchive(adminAcls: Set<string>, subjectType: ArchiveSubjectType): boolean {
if (adminAcls.has(AdminACLs.WILDCARD) || adminAcls.has(AdminACLs.ARCHIVE_VIEW_ALL)) return true;
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createGuildID} from '@app/api/BrandedTypes';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
import {RateLimitMiddleware} from '@app/api/middleware/RateLimitMiddleware';
import {OpenAPI} from '@app/api/middleware/ResponseTypeMiddleware';
import {AdminRateLimitConfigs} from '@app/api/rate_limit_configs/AdminRateLimitConfig';
import type {HonoApp} from '@app/api/types/HonoEnv';
import {Validator} from '@app/api/Validator';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {PurgeGuildAssetsRequest, PurgeGuildAssetsResponseSchema} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {GuildIdParam} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
import {createGuildID} from '../../BrandedTypes';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {AdminRateLimitConfigs} from '../../rate_limit_configs/AdminRateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
export function AssetAdminController(app: HonoApp) {
app.delete(
@@ -1,5 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
import {NotFoundError} from '@fluxer/errors/src/domains/core/NotFoundError';
@@ -9,12 +15,6 @@ import {
AuditLogsListResponseSchema,
ListAdminAuditLogsQuery,
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
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 AuditLogAdminController(app: HonoApp) {
app.get(
@@ -1,5 +1,13 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {requireAdminACL, requireAnyAdminACL} from '@app/api/middleware/AdminMiddleware';
import {RateLimitMiddleware} from '@app/api/middleware/RateLimitMiddleware';
import {OpenAPI} from '@app/api/middleware/ResponseTypeMiddleware';
import {getWorkerService} from '@app/api/middleware/ServiceRegistry';
import {RateLimitConfigs} from '@app/api/RateLimitConfig';
import type {HonoApp} from '@app/api/types/HonoEnv';
import {requireRequestJsonBody} from '@app/api/utils/RequestJsonBody';
import {inputValidationErrorFromZodIssues, Validator} from '@app/api/Validator';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
import {BadRequestError} from '@fluxer/errors/src/domains/core/BadRequestError';
@@ -40,14 +48,6 @@ import {
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {UserIdParam} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
import type {ZodType} from 'zod';
import {requireAdminACL, requireAnyAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {getWorkerService} from '../../middleware/ServiceRegistry';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {requireRequestJsonBody} from '../../utils/RequestJsonBody';
import {inputValidationErrorFromZodIssues, Validator} from '../../Validator';
type ProfileSubstringScope = BanProfileSubstringRequest['scope'];
@@ -1,17 +1,17 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {UserID} from '@app/api/BrandedTypes';
import {requireAnyAdminACL} from '@app/api/middleware/AdminMiddleware';
import {RateLimitMiddleware} from '@app/api/middleware/RateLimitMiddleware';
import {OpenAPI} from '@app/api/middleware/ResponseTypeMiddleware';
import {getWorkerService} from '@app/api/middleware/ServiceRegistry';
import {RateLimitConfigs} from '@app/api/RateLimitConfig';
import type {HonoApp} from '@app/api/types/HonoEnv';
import {Validator} from '@app/api/Validator';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {MissingACLError} from '@fluxer/errors/src/domains/core/MissingACLError';
import {AdminBulkJobCreateRequest, AdminBulkTaskType} from '@fluxer/schema/src/domains/admin/AdminBulkSchemas';
import {BulkJobResponse} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import type {UserID} from '../../BrandedTypes';
import {requireAnyAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {getWorkerService} from '../../middleware/ServiceRegistry';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
const BULK_TASK_ACLS: Record<AdminBulkTaskType, string> = {
[AdminBulkTaskType.UPDATE_USER_FLAGS]: AdminACLs.BULK_UPDATE_USER_FLAGS,
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {Config} from '@app/api/Config';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {FeatureNotAvailableSelfHostedError} from '@fluxer/errors/src/domains/core/FeatureNotAvailableSelfHostedError';
import {CodesResponse, GenerateGiftCodesRequest} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {Config} from '../../Config';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
function trimTrailingSlash(value: string): string {
return value.endsWith('/') ? value.slice(0, -1) : value;
@@ -1,5 +1,17 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createGuildID} from '@app/api/BrandedTypes';
import type {GuildDiscoveryRow} from '@app/api/database/types/GuildDiscoveryTypes';
import {mapGuildFeatures} from '@app/api/guild/GuildFeatureUtils';
import type {GuildService} from '@app/api/guild/services/GuildService';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
import {RateLimitMiddleware} from '@app/api/middleware/RateLimitMiddleware';
import {OpenAPI} from '@app/api/middleware/ResponseTypeMiddleware';
import type {User} from '@app/api/models/User';
import {RateLimitConfigs} from '@app/api/RateLimitConfig';
import type {HonoApp} from '@app/api/types/HonoEnv';
import type {IUserRepository} from '@app/api/user/IUserRepository';
import {Validator} from '@app/api/Validator';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {DiscoveryApplicationStatus, DiscoveryCategoryLabels} from '@fluxer/constants/src/DiscoveryConstants';
import {GuildIdParam} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
@@ -17,19 +29,6 @@ import {
DiscoveryCategoryListResponse,
} from '@fluxer/schema/src/domains/guild/GuildDiscoverySchemas';
import {createGuildID} from '../../BrandedTypes';
import type {GuildDiscoveryRow} from '../../database/types/GuildDiscoveryTypes';
import {mapGuildFeatures} from '../../guild/GuildFeatureUtils';
import type {GuildService} from '../../guild/services/GuildService';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import type {User} from '../../models/User';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import type {IUserRepository} from '../../user/IUserRepository';
import {Validator} from '../../Validator';
function mapRowToApplicationResponse(row: GuildDiscoveryRow) {
return {
guild_id: row.guild_id.toString(),
@@ -1,5 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createGuildID} from '@app/api/BrandedTypes';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {GetProcessMemoryStatsQuery} from '@fluxer/schema/src/domains/admin/AdminGuildSchemas';
import {
@@ -9,13 +16,6 @@ import {
ReloadAllGuildsResponse,
ReloadGuildsRequest,
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {createGuildID} from '../../BrandedTypes';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
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 GatewayAdminController(app: HonoApp) {
app.get(
@@ -1,5 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createGuildID} from '@app/api/BrandedTypes';
import {requireAdminACL, requireAnyAdminACL} from '@app/api/middleware/AdminMiddleware';
import {RateLimitMiddleware} from '@app/api/middleware/RateLimitMiddleware';
import {OpenAPI} from '@app/api/middleware/ResponseTypeMiddleware';
import {AdminRateLimitConfigs} from '@app/api/rate_limit_configs/AdminRateLimitConfig';
import type {HonoApp} from '@app/api/types/HonoEnv';
import {Validator} from '@app/api/Validator';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {MissingACLError} from '@fluxer/errors/src/domains/core/MissingACLError';
import {UnknownGuildError} from '@fluxer/errors/src/domains/guild/UnknownGuildError';
@@ -20,13 +27,6 @@ import {
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {GuildIdParam, GuildIdUserIdParam, SuccessResponse} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
import {GuildAuditLogListQuery} from '@fluxer/schema/src/domains/guild/GuildAuditLogSchemas';
import {createGuildID} from '../../BrandedTypes';
import {requireAdminACL, requireAnyAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {AdminRateLimitConfigs} from '../../rate_limit_configs/AdminRateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
const GUILD_UPDATE_ACLS = [
AdminACLs.GUILD_UPDATE_NAME,
@@ -1,5 +1,20 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createUserID} from '@app/api/BrandedTypes';
import {Config} from '@app/api/Config';
import {
type InstancePolicyConfig,
REGISTRATION_PENDING_APPROVAL_TRAIT,
REGISTRATION_REJECTED_TRAIT,
} from '@app/api/instance/InstanceConfigRepository';
import {deriveSsoRedirectUri, normalizeAndValidateSsoConfig} from '@app/api/instance/SsoConfigValidation';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
import {RateLimitMiddleware} from '@app/api/middleware/RateLimitMiddleware';
import {OpenAPI} from '@app/api/middleware/ResponseTypeMiddleware';
import {getGatewayRolloutConfigPublisher, getInstanceConfigRepository} from '@app/api/middleware/ServiceSingletons';
import {RateLimitConfigs} from '@app/api/RateLimitConfig';
import type {HonoApp, HonoEnv} from '@app/api/types/HonoEnv';
import {Validator} from '@app/api/Validator';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {InstancePolicyTransitionNotAllowedError} from '@fluxer/errors/src/domains/core/InstancePolicyTransitionNotAllowedError';
import {
@@ -21,21 +36,6 @@ import type {InstanceBranding} from '@fluxer/schema/src/domains/instance/Instanc
import {SmtpEmailProvider} from '@pkgs/email/src/SmtpEmailProvider';
import type {Context} from 'hono';
import {createMiddleware} from 'hono/factory';
import {createUserID} from '../../BrandedTypes';
import {Config} from '../../Config';
import {
type InstancePolicyConfig,
REGISTRATION_PENDING_APPROVAL_TRAIT,
REGISTRATION_REJECTED_TRAIT,
} from '../../instance/InstanceConfigRepository';
import {deriveSsoRedirectUri, normalizeAndValidateSsoConfig} from '../../instance/SsoConfigValidation';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {getGatewayRolloutConfigPublisher, getInstanceConfigRepository} from '../../middleware/ServiceSingletons';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp, HonoEnv} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
const INSTANCE_BRANDING_ENTITY_ID = 0n;
@@ -1,5 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {
ActiveJobsResponseSchema,
@@ -10,12 +16,6 @@ import {
ListJobsResponseSchema,
} from '@fluxer/schema/src/domains/admin/JobsSchemas';
import {JobIdParam} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
function toListJobsRequest(query: ListJobsQuery): ListJobsRequest {
return {
@@ -1,17 +1,17 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {Config} from '@app/api/Config';
import type {LimitConfigService} from '@app/api/limits/LimitConfigService';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {LIMIT_CATEGORY_LABELS, LIMIT_KEY_METADATA, LIMIT_KEYS} from '@fluxer/constants/src/LimitConfigMetadata';
import type {LimitConfigSnapshot} from '@fluxer/limits/src/LimitTypes';
import {LimitConfigGetResponse, LimitConfigUpdateRequest} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {Config} from '../../Config';
import type {LimitConfigService} from '../../limits/LimitConfigService';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
function formatConfig(service: LimitConfigService) {
const config = service.getConfigSnapshot();
@@ -1,5 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createAttachmentID, createChannelID, createMessageID, createReportID} from '@app/api/BrandedTypes';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {ValidationErrorCodes} from '@fluxer/constants/src/ValidationErrorCodes';
import {InputValidationError} from '@fluxer/errors/src/domains/core/InputValidationError';
@@ -29,13 +36,6 @@ import {
ChannelIdParam,
UserIdParam,
} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
import {createAttachmentID, createChannelID, createMessageID, createReportID} from '../../BrandedTypes';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
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 MessageAdminController(app: HonoApp) {
app.get(
@@ -1,5 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {createReportID} from '@app/api/BrandedTypes';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {
AdminReportListResponse,
@@ -10,13 +17,6 @@ import {
UpdateReportRequest,
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {ReportIdParam} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
import {createReportID} from '../../BrandedTypes';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
const REPORT_STATUS_BY_FILTER = {
pending: 0,
@@ -1,5 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {
IndexRefreshStatusResponse,
@@ -8,12 +14,6 @@ import {
SearchIndexNameParam,
SearchIndexRefreshIdParam,
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
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 SearchAdminController(app: HonoApp) {
app.post(
@@ -4,13 +4,13 @@ import * as fs from 'node:fs';
import * as path from 'node:path';
import {Readable} from 'node:stream';
import * as v8 from 'node:v8';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {HeapSnapshotResponse} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
export function SystemAdminController(app: HonoApp) {
app.post(
@@ -1,13 +1,13 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {SendSystemDmRequest, SendSystemDmResponse} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
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 SystemDmAdminController(app: HonoApp) {
app.post(
@@ -1,5 +1,13 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {mapUserToAdminResponse} from '@app/api/admin/models/UserTypes';
import {createUserID} from '@app/api/BrandedTypes';
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
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 {inputValidationErrorFromZodIssues, Validator} from '@app/api/Validator';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {MissingACLError} from '@fluxer/errors/src/domains/core/MissingACLError';
import {ListUserGuildsResponse} from '@fluxer/schema/src/domains/admin/AdminGuildSchemas';
@@ -41,14 +49,6 @@ import {
} from '@fluxer/schema/src/domains/admin/AdminUserSchemas';
import {WebAuthnCredentialListResponse} from '@fluxer/schema/src/domains/auth/AuthSchemas';
import {UserIdParam} from '@fluxer/schema/src/domains/common/CommonParamSchemas';
import {createUserID} from '../../BrandedTypes';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp} from '../../types/HonoEnv';
import {inputValidationErrorFromZodIssues, Validator} from '../../Validator';
import {mapUserToAdminResponse} from '../models/UserTypes';
function requireSelectorACL(granted: ReadonlySet<string>, acl: string): void {
if (!granted.has(acl) && !granted.has(AdminACLs.WILDCARD)) {
@@ -1,5 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {requireAdminACL} from '@app/api/middleware/AdminMiddleware';
import {RateLimitMiddleware} from '@app/api/middleware/RateLimitMiddleware';
import {OpenAPI} from '@app/api/middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '@app/api/RateLimitConfig';
import type {HonoApp, HonoEnv} from '@app/api/types/HonoEnv';
import {Validator} from '@app/api/Validator';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {
CreateVoiceRegionRequest,
@@ -24,12 +30,6 @@ import {
VoiceServerIdParam,
} from '@fluxer/schema/src/domains/admin/AdminVoiceSchemas';
import type {Context} from 'hono';
import {requireAdminACL} from '../../middleware/AdminMiddleware';
import {RateLimitMiddleware} from '../../middleware/RateLimitMiddleware';
import {OpenAPI} from '../../middleware/ResponseTypeMiddleware';
import {RateLimitConfigs} from '../../RateLimitConfig';
import type {HonoApp, HonoEnv} from '../../types/HonoEnv';
import {Validator} from '../../Validator';
function isPlainObject(value: unknown): value is Record<string, unknown> {
return typeof value === 'object' && value !== null && !Array.isArray(value);
+22 -22
View File
@@ -1,27 +1,27 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {HonoApp} from '../../types/HonoEnv';
import {AdminApiKeyAdminController} from './AdminApiKeyAdminController';
import {ApplicationAdminController} from './ApplicationAdminController';
import {ArchiveAdminController} from './ArchiveAdminController';
import {AssetAdminController} from './AssetAdminController';
import {AuditLogAdminController} from './AuditLogAdminController';
import {BanAdminController} from './BanAdminController';
import {BulkAdminController} from './BulkAdminController';
import {CodesAdminController} from './CodesAdminController';
import {DiscoveryAdminController} from './DiscoveryAdminController';
import {GatewayAdminController} from './GatewayAdminController';
import {GuildAdminController} from './GuildAdminController';
import {InstanceConfigAdminController} from './InstanceConfigAdminController';
import {JobsAdminController} from './JobsAdminController';
import {LimitConfigAdminController} from './LimitConfigAdminController';
import {MessageAdminController} from './MessageAdminController';
import {ReportAdminController} from './ReportAdminController';
import {SearchAdminController} from './SearchAdminController';
import {SystemAdminController} from './SystemAdminController';
import {SystemDmAdminController} from './SystemDmAdminController';
import {UserAdminController} from './UserAdminController';
import {VoiceAdminController} from './VoiceAdminController';
import {AdminApiKeyAdminController} from '@app/api/admin/controllers/AdminApiKeyAdminController';
import {ApplicationAdminController} from '@app/api/admin/controllers/ApplicationAdminController';
import {ArchiveAdminController} from '@app/api/admin/controllers/ArchiveAdminController';
import {AssetAdminController} from '@app/api/admin/controllers/AssetAdminController';
import {AuditLogAdminController} from '@app/api/admin/controllers/AuditLogAdminController';
import {BanAdminController} from '@app/api/admin/controllers/BanAdminController';
import {BulkAdminController} from '@app/api/admin/controllers/BulkAdminController';
import {CodesAdminController} from '@app/api/admin/controllers/CodesAdminController';
import {DiscoveryAdminController} from '@app/api/admin/controllers/DiscoveryAdminController';
import {GatewayAdminController} from '@app/api/admin/controllers/GatewayAdminController';
import {GuildAdminController} from '@app/api/admin/controllers/GuildAdminController';
import {InstanceConfigAdminController} from '@app/api/admin/controllers/InstanceConfigAdminController';
import {JobsAdminController} from '@app/api/admin/controllers/JobsAdminController';
import {LimitConfigAdminController} from '@app/api/admin/controllers/LimitConfigAdminController';
import {MessageAdminController} from '@app/api/admin/controllers/MessageAdminController';
import {ReportAdminController} from '@app/api/admin/controllers/ReportAdminController';
import {SearchAdminController} from '@app/api/admin/controllers/SearchAdminController';
import {SystemAdminController} from '@app/api/admin/controllers/SystemAdminController';
import {SystemDmAdminController} from '@app/api/admin/controllers/SystemDmAdminController';
import {UserAdminController} from '@app/api/admin/controllers/UserAdminController';
import {VoiceAdminController} from '@app/api/admin/controllers/VoiceAdminController';
import type {HonoApp} from '@app/api/types/HonoEnv';
export function registerAdminControllers(app: HonoApp) {
AdminApiKeyAdminController(app);
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AdminArchiveRow} from '@app/api/database/types/AdminArchiveTypes';
import type {AdminArchiveResponse, ArchiveSubjectType} from '@fluxer/schema/src/domains/admin/AdminArchiveSchemas';
import type {AdminArchiveRow} from '../../database/types/AdminArchiveTypes';
export class AdminArchive {
subjectType: ArchiveSubjectType;
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {mapGuildFeatures} from '@app/api/guild/GuildFeatureUtils';
import type {Guild} from '@app/api/models/Guild';
import type {User} from '@app/api/models/User';
import type {GuildAdminResponse, ListUserGuildsResponse} from '@fluxer/schema/src/domains/admin/AdminGuildSchemas';
import {mapGuildFeatures} from '../../guild/GuildFeatureUtils';
import type {Guild} from '../../models/Guild';
import type {User} from '../../models/User';
function formatOwnerFields(ownerUser: User | null): {
owner_username: string | null;
+2 -2
View File
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {User} from '@app/api/models/User';
import {getIpAddressReverse, lookupGeoip} from '@app/api/utils/IpUtils';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {DEFERRED_PHONE_ON_COMMUNITY_JOIN} from '@fluxer/constants/src/UserConstants';
import type {UserAdminResponse} from '@fluxer/schema/src/domains/admin/AdminUserSchemas';
import type {ICacheService} from '@pkgs/cache/src/ICacheService';
import {formatGeoipLocation} from '@pkgs/geoip/src/GeoipLookup';
import type {User} from '../../models/User';
import {getIpAddressReverse, lookupGeoip} from '../../utils/IpUtils';
function hasAcl(acls: ReadonlySet<string>, acl: string): boolean {
return acls.has(acl) || acls.has(AdminACLs.WILDCARD);
@@ -1,13 +1,23 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {UserID} from '../../BrandedTypes';
import {BatchBuilder, fetchMany, fetchManyInChunks, fetchOne, upsertOne} from '../../database/CassandraQueryExecution';
import {Db} from '../../database/CassandraTypes';
import type {AdminApiKeyByCreatorRow, AdminApiKeyRow} from '../../database/types/AdminAuthTypes';
import {AdminApiKey} from '../../models/AdminApiKey';
import {AdminApiKeys, AdminApiKeysByCreator} from '../../Tables';
import {hashPassword} from '../../utils/PasswordUtils';
import type {CreateAdminApiKeyData, IAdminApiKeyRepository, UpdateAdminApiKeyData} from './IAdminApiKeyRepository';
import type {
CreateAdminApiKeyData,
IAdminApiKeyRepository,
UpdateAdminApiKeyData,
} from '@app/api/admin/repositories/IAdminApiKeyRepository';
import type {UserID} from '@app/api/BrandedTypes';
import {
BatchBuilder,
fetchMany,
fetchManyInChunks,
fetchOne,
upsertOne,
} from '@app/api/database/CassandraQueryExecution';
import {Db} from '@app/api/database/CassandraTypes';
import type {AdminApiKeyByCreatorRow, AdminApiKeyRow} from '@app/api/database/types/AdminAuthTypes';
import {AdminApiKey} from '@app/api/models/AdminApiKey';
import {AdminApiKeys, AdminApiKeysByCreator} from '@app/api/Tables';
import {hashPassword} from '@app/api/utils/PasswordUtils';
function computeTtlSeconds(expiresAt: Date): number {
const diffSeconds = Math.floor((expiresAt.getTime() - Date.now()) / 1000);
@@ -2,20 +2,20 @@
import assert from 'node:assert/strict';
import {randomUUID} from 'node:crypto';
import type {ArchiveSubjectType} from '@fluxer/schema/src/domains/admin/AdminArchiveSchemas';
import {ms} from 'itty-time';
import {ArchiveAttemptSupersededError} from '../../archive/ArchiveAttemptSupersededError';
import {BatchBuilder, executeConditional, fetchMany, fetchOne} from '../../database/CassandraQueryExecution';
import {Db, type DbOp} from '../../database/CassandraTypes';
import {AdminArchive} from '@app/api/admin/models/AdminArchiveModel';
import {ArchiveAttemptSupersededError} from '@app/api/archive/ArchiveAttemptSupersededError';
import {BatchBuilder, executeConditional, fetchMany, fetchOne} from '@app/api/database/CassandraQueryExecution';
import {Db, type DbOp} from '@app/api/database/CassandraTypes';
import {
ADMIN_ARCHIVE_INDEX_COLUMNS,
type AdminArchiveIndexRow,
type AdminArchiveRow,
} from '../../database/types/AdminArchiveTypes';
import {Logger} from '../../Logger';
import {AdminArchivesByRequester, AdminArchivesBySubject, AdminArchivesByType} from '../../Tables';
import {mapWithConcurrency} from '../../utils/ConcurrencyUtils';
import {AdminArchive} from '../models/AdminArchiveModel';
} from '@app/api/database/types/AdminArchiveTypes';
import {Logger} from '@app/api/Logger';
import {AdminArchivesByRequester, AdminArchivesBySubject, AdminArchivesByType} from '@app/api/Tables';
import {mapWithConcurrency} from '@app/api/utils/ConcurrencyUtils';
import type {ArchiveSubjectType} from '@fluxer/schema/src/domains/admin/AdminArchiveSchemas';
import {ms} from 'itty-time';
const RETENTION_DAYS = 365;
const DEFAULT_RETENTION_MS = ms(`${RETENTION_DAYS} days`);
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {UserID} from '../../BrandedTypes';
import type {AdminApiKey} from '../../models/AdminApiKey';
import type {UserID} from '@app/api/BrandedTypes';
import type {AdminApiKey} from '@app/api/models/AdminApiKey';
export interface CreateAdminApiKeyData {
name: string;
@@ -1,16 +1,16 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {randomInt} from 'node:crypto';
import type {IAdminApiKeyRepository} from '@app/api/admin/repositories/IAdminApiKeyRepository';
import type {UserID} from '@app/api/BrandedTypes';
import type {ISnowflakeService} from '@app/api/infrastructure/ISnowflakeService';
import type {AdminApiKey} from '@app/api/models/AdminApiKey';
import {verifyPassword} from '@app/api/utils/PasswordUtils';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {AdminApiKeyNotFoundError} from '@fluxer/errors/src/domains/admin/AdminApiKeyNotFoundError';
import {MissingACLError} from '@fluxer/errors/src/domains/core/MissingACLError';
import type {CreateAdminApiKeyRequest, UpdateAdminApiKeyRequest} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {ms} from 'itty-time';
import type {UserID} from '../../BrandedTypes';
import type {ISnowflakeService} from '../../infrastructure/ISnowflakeService';
import type {AdminApiKey} from '../../models/AdminApiKey';
import {verifyPassword} from '../../utils/PasswordUtils';
import type {IAdminApiKeyRepository} from '../repositories/IAdminApiKeyRepository';
const ADMIN_KEY_PREFIX = 'fa_';
const RANDOM_KEY_LENGTH = 32;
@@ -1,5 +1,11 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ApiContext} from '@app/api/ApiContext';
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import {type ApplicationID, createApplicationID, createUserID, type GuildID, type UserID} from '@app/api/BrandedTypes';
import type {IGuildRepositoryAggregate} from '@app/api/guild/repositories/IGuildRepositoryAggregate';
import type {Application} from '@app/api/models/Application';
import type {IApplicationRepository} from '@app/api/oauth/repositories/IApplicationRepository';
import {UnknownGuildError} from '@fluxer/errors/src/domains/guild/UnknownGuildError';
import {UnknownApplicationError} from '@fluxer/errors/src/domains/oauth/UnknownApplicationError';
import {UnknownUserError} from '@fluxer/errors/src/domains/user/UnknownUserError';
@@ -9,12 +15,6 @@ import type {
LookupApplicationResponse,
TransferApplicationOwnershipRequest,
} from '@fluxer/schema/src/domains/admin/AdminApplicationSchemas';
import type {ApiContext} from '../../ApiContext';
import {type ApplicationID, createApplicationID, createUserID, type GuildID, type UserID} from '../../BrandedTypes';
import type {IGuildRepositoryAggregate} from '../../guild/repositories/IGuildRepositoryAggregate';
import type {Application} from '../../models/Application';
import type {IApplicationRepository} from '../../oauth/repositories/IApplicationRepository';
import type {AdminAuditService} from './AdminAuditService';
interface AdminApplicationServiceDeps {
apiContext: ApiContext;
@@ -1,5 +1,14 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {AdminArchive} from '@app/api/admin/models/AdminArchiveModel';
import type {AdminArchiveRepository} from '@app/api/admin/repositories/AdminArchiveRepository';
import type {GuildID, UserID} from '@app/api/BrandedTypes';
import {Config} from '@app/api/Config';
import type {IGuildRepositoryAggregate} from '@app/api/guild/repositories/IGuildRepositoryAggregate';
import type {ISnowflakeService} from '@app/api/infrastructure/ISnowflakeService';
import type {IStorageService} from '@app/api/infrastructure/IStorageService';
import type {IUserRepository} from '@app/api/user/IUserRepository';
import type {WorkerTaskName} from '@app/api/worker/WorkerLaneConfig';
import {InputValidationError} from '@fluxer/errors/src/domains/core/InputValidationError';
import {UnknownGuildError} from '@fluxer/errors/src/domains/guild/UnknownGuildError';
import {HarvestExpiredError} from '@fluxer/errors/src/domains/moderation/HarvestExpiredError';
@@ -10,15 +19,6 @@ import {UnknownUserError} from '@fluxer/errors/src/domains/user/UnknownUserError
import type {AdminArchiveResponse, ArchiveSubjectType} from '@fluxer/schema/src/domains/admin/AdminArchiveSchemas';
import type {IWorkerService} from '@pkgs/worker/src/contracts/IWorkerService';
import {ms, seconds} from 'itty-time';
import type {GuildID, UserID} from '../../BrandedTypes';
import {Config} from '../../Config';
import type {IGuildRepositoryAggregate} from '../../guild/repositories/IGuildRepositoryAggregate';
import type {ISnowflakeService} from '../../infrastructure/ISnowflakeService';
import type {IStorageService} from '../../infrastructure/IStorageService';
import type {IUserRepository} from '../../user/IUserRepository';
import type {WorkerTaskName} from '../../worker/WorkerLaneConfig';
import {AdminArchive} from '../models/AdminArchiveModel';
import type {AdminArchiveRepository} from '../repositories/AdminArchiveRepository';
const ARCHIVE_RETENTION_DAYS = 365;
const DOWNLOAD_LINK_DAYS = 7;
@@ -1,18 +1,18 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import {createEmojiID, createStickerID, type GuildID, type UserID} from '@app/api/BrandedTypes';
import {mapGuildEmojiToResponse, mapGuildStickerToResponse} from '@app/api/guild/GuildModel';
import type {IGuildRepositoryAggregate} from '@app/api/guild/repositories/IGuildRepositoryAggregate';
import {ExpressionAssetPurger} from '@app/api/guild/services/content/ExpressionAssetPurger';
import type {IAssetDeletionQueue} from '@app/api/infrastructure/IAssetDeletionQueue';
import type {IGatewayService} from '@app/api/infrastructure/IGatewayService';
import type {GuildNSFWLevelValue} from '@fluxer/constants/src/GuildConstants';
import type {
PurgeGuildAssetError,
PurgeGuildAssetResult,
PurgeGuildAssetsResponse,
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import {createEmojiID, createStickerID, type GuildID, type UserID} from '../../BrandedTypes';
import {mapGuildEmojiToResponse, mapGuildStickerToResponse} from '../../guild/GuildModel';
import type {IGuildRepositoryAggregate} from '../../guild/repositories/IGuildRepositoryAggregate';
import {ExpressionAssetPurger} from '../../guild/services/content/ExpressionAssetPurger';
import type {IAssetDeletionQueue} from '../../infrastructure/IAssetDeletionQueue';
import type {IGatewayService} from '../../infrastructure/IGatewayService';
import type {AdminAuditService} from './AdminAuditService';
interface AdminAssetPurgeServiceDeps {
guildRepository: IGuildRepositoryAggregate;
@@ -1,5 +1,17 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AdminAuditLog, IAdminRepository} from '@app/api/admin/IAdminRepository';
import type {UserID} from '@app/api/BrandedTypes';
import {createChannelID, createGuildID, createUserID} from '@app/api/BrandedTypes';
import type {IChannelRepository} from '@app/api/channel/IChannelRepository';
import type {IGuildRepositoryAggregate} from '@app/api/guild/repositories/IGuildRepositoryAggregate';
import type {ISnowflakeService} from '@app/api/infrastructure/ISnowflakeService';
import {Logger} from '@app/api/Logger';
import type {Channel} from '@app/api/models/Channel';
import type {Guild} from '@app/api/models/Guild';
import type {User} from '@app/api/models/User';
import {getAuditLogSearchService} from '@app/api/SearchFactory';
import type {IUserRepository} from '@app/api/user/IUserRepository';
import type {
AdminAuditLogChannelSummary,
AdminAuditLogGuildSummary,
@@ -7,18 +19,6 @@ import type {
AdminAuditLogUserSummary,
AuditLogsListResponse,
} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import type {UserID} from '../../BrandedTypes';
import {createChannelID, createGuildID, createUserID} from '../../BrandedTypes';
import type {IChannelRepository} from '../../channel/IChannelRepository';
import type {IGuildRepositoryAggregate} from '../../guild/repositories/IGuildRepositoryAggregate';
import type {ISnowflakeService} from '../../infrastructure/ISnowflakeService';
import {Logger} from '../../Logger';
import type {Channel} from '../../models/Channel';
import type {Guild} from '../../models/Guild';
import type {User} from '../../models/User';
import {getAuditLogSearchService} from '../../SearchFactory';
import type {IUserRepository} from '../../user/IUserRepository';
import type {AdminAuditLog, IAdminRepository} from '../IAdminRepository';
interface CreateAdminAuditLogParams {
adminUserId: UserID;
@@ -1,15 +1,9 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
import {ValidationErrorCodes} from '@fluxer/constants/src/ValidationErrorCodes';
import {BadRequestError} from '@fluxer/errors/src/domains/core/BadRequestError';
import {InputValidationError} from '@fluxer/errors/src/domains/core/InputValidationError';
import {NotFoundError} from '@fluxer/errors/src/domains/core/NotFoundError';
import {UnknownUserError} from '@fluxer/errors/src/domains/user/UnknownUserError';
import type {AdminBlocklistListType} from '@fluxer/schema/src/domains/admin/AdminBlocklistSchemas';
import type {IpInfoLookupResult, IpInfoService} from '@pkgs/geoip/src/IpInfoService';
import type {ApiContext} from '../../ApiContext';
import {createUserID, type UserID} from '../../BrandedTypes';
import type {ApiContext} from '@app/api/ApiContext';
import type {IAdminRepository} from '@app/api/admin/IAdminRepository';
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import {createUserID, type UserID} from '@app/api/BrandedTypes';
import {
BANNED_AVATAR_HASHES_REFRESH_CHANNEL,
BANNED_FILE_SHAS_REFRESH_CHANNEL,
@@ -19,28 +13,34 @@ import {
BANNED_URLS_REFRESH_CHANNEL,
ContentBlocklistCategory,
ContentBlocklistSeverity,
} from '../../constants/ContentModeration';
import {IP_BAN_REFRESH_CHANNEL} from '../../constants/IpBan';
import type {BannedProfileSubstringScope} from '../../database/types/AdminArchiveTypes';
import {Logger} from '../../Logger';
import {bannedAvatarHashCache} from '../../middleware/BannedAvatarHashCache';
import {fileShaCache} from '../../middleware/FileShaCache';
import {ipBanCache} from '../../middleware/IpBanMiddleware';
import {phraseBlocklistCache} from '../../middleware/PhraseBlocklistCache';
import {profileSubstringBlocklistCache} from '../../middleware/ProfileSubstringBlocklistCache';
import {urlBlocklistCache} from '../../middleware/UrlBlocklistCache';
} from '@app/api/constants/ContentModeration';
import {IP_BAN_REFRESH_CHANNEL} from '@app/api/constants/IpBan';
import type {BannedProfileSubstringScope} from '@app/api/database/types/AdminArchiveTypes';
import {Logger} from '@app/api/Logger';
import {bannedAvatarHashCache} from '@app/api/middleware/BannedAvatarHashCache';
import {fileShaCache} from '@app/api/middleware/FileShaCache';
import {ipBanCache} from '@app/api/middleware/IpBanMiddleware';
import {phraseBlocklistCache} from '@app/api/middleware/PhraseBlocklistCache';
import {profileSubstringBlocklistCache} from '@app/api/middleware/ProfileSubstringBlocklistCache';
import {urlBlocklistCache} from '@app/api/middleware/UrlBlocklistCache';
import {
getIpBanBlastRadiusVerdict,
getSuspiciousIpSkipReason,
isSingleIpBanCandidate,
} from '../../risk/IpBanCgnatGuard';
import {isIpBanExempt} from '../../risk/IpBanExemptions';
import type {ISuspiciousIpRepository} from '../../risk/SuspiciousIpRepository';
import {tryParseSingleIp} from '../../utils/IpRangeUtils';
import {canonicalizeStoredPhrase} from '../../utils/PhraseBlocklistNormalization';
import {canonicalizeUrl} from '../../utils/UrlNormalizer';
import type {IAdminRepository} from '../IAdminRepository';
import type {AdminAuditService} from './AdminAuditService';
} from '@app/api/risk/IpBanCgnatGuard';
import {isIpBanExempt} from '@app/api/risk/IpBanExemptions';
import type {ISuspiciousIpRepository} from '@app/api/risk/SuspiciousIpRepository';
import {tryParseSingleIp} from '@app/api/utils/IpRangeUtils';
import {canonicalizeStoredPhrase} from '@app/api/utils/PhraseBlocklistNormalization';
import {canonicalizeUrl} from '@app/api/utils/UrlNormalizer';
import {APIErrorCodes} from '@fluxer/constants/src/ApiErrorCodes';
import {ValidationErrorCodes} from '@fluxer/constants/src/ValidationErrorCodes';
import {BadRequestError} from '@fluxer/errors/src/domains/core/BadRequestError';
import {InputValidationError} from '@fluxer/errors/src/domains/core/InputValidationError';
import {NotFoundError} from '@fluxer/errors/src/domains/core/NotFoundError';
import {UnknownUserError} from '@fluxer/errors/src/domains/user/UnknownUserError';
import type {AdminBlocklistListType} from '@fluxer/schema/src/domains/admin/AdminBlocklistSchemas';
import type {IpInfoLookupResult, IpInfoService} from '@pkgs/geoip/src/IpInfoService';
interface AdminBanManagementServiceDeps {
apiContext: ApiContext;
@@ -1,10 +1,10 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {SYSTEM_USER_ID} from '../../constants/Core';
import type {GiftCodeDurationType, GiftCodeRow} from '../../database/types/PaymentTypes';
import {mapGiftCodeDurationToMonths} from '../../models/GiftCode';
import type {IUserRepository} from '../../user/IUserRepository';
import * as RandomUtils from '../../utils/RandomUtils';
import {SYSTEM_USER_ID} from '@app/api/constants/Core';
import type {GiftCodeDurationType, GiftCodeRow} from '@app/api/database/types/PaymentTypes';
import {mapGiftCodeDurationToMonths} from '@app/api/models/GiftCode';
import type {IUserRepository} from '@app/api/user/IUserRepository';
import * as RandomUtils from '@app/api/utils/RandomUtils';
const CODE_LENGTH = 32;
const MAX_GENERATION_ATTEMPTS = 100;
@@ -1,24 +1,24 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import {AdminGuildBulkService} from '@app/api/admin/services/guild/AdminGuildBulkService';
import {AdminGuildLookupService} from '@app/api/admin/services/guild/AdminGuildLookupService';
import {AdminGuildManagementService} from '@app/api/admin/services/guild/AdminGuildManagementService';
import {AdminGuildMembershipService} from '@app/api/admin/services/guild/AdminGuildMembershipService';
import {AdminGuildUpdatePropagator} from '@app/api/admin/services/guild/AdminGuildUpdatePropagator';
import {AdminGuildUpdateService} from '@app/api/admin/services/guild/AdminGuildUpdateService';
import {AdminGuildVanityService} from '@app/api/admin/services/guild/AdminGuildVanityService';
import {createGuildID, createUserID} from '@app/api/BrandedTypes';
import type {IChannelRepository} from '@app/api/channel/IChannelRepository';
import type {IGuildDiscoveryRepository} from '@app/api/guild/repositories/GuildDiscoveryRepository';
import type {IGuildRepositoryAggregate} from '@app/api/guild/repositories/IGuildRepositoryAggregate';
import type {GuildService} from '@app/api/guild/services/GuildService';
import type {EntityAssetService} from '@app/api/infrastructure/EntityAssetService';
import type {IGatewayService} from '@app/api/infrastructure/IGatewayService';
import type {InviteRepository} from '@app/api/invite/InviteRepository';
import {createRequestCache} from '@app/api/middleware/RequestCacheMiddleware';
import type {IUserRepository} from '@app/api/user/IUserRepository';
import type {ListGuildAuditLogsRequest} from '@fluxer/schema/src/domains/admin/AdminGuildSchemas';
import {createGuildID, createUserID} from '../../BrandedTypes';
import type {IChannelRepository} from '../../channel/IChannelRepository';
import type {IGuildDiscoveryRepository} from '../../guild/repositories/GuildDiscoveryRepository';
import type {IGuildRepositoryAggregate} from '../../guild/repositories/IGuildRepositoryAggregate';
import type {GuildService} from '../../guild/services/GuildService';
import type {EntityAssetService} from '../../infrastructure/EntityAssetService';
import type {IGatewayService} from '../../infrastructure/IGatewayService';
import type {InviteRepository} from '../../invite/InviteRepository';
import {createRequestCache} from '../../middleware/RequestCacheMiddleware';
import type {IUserRepository} from '../../user/IUserRepository';
import type {AdminAuditService} from './AdminAuditService';
import {AdminGuildBulkService} from './guild/AdminGuildBulkService';
import {AdminGuildLookupService} from './guild/AdminGuildLookupService';
import {AdminGuildManagementService} from './guild/AdminGuildManagementService';
import {AdminGuildMembershipService} from './guild/AdminGuildMembershipService';
import {AdminGuildUpdatePropagator} from './guild/AdminGuildUpdatePropagator';
import {AdminGuildUpdateService} from './guild/AdminGuildUpdateService';
import {AdminGuildVanityService} from './guild/AdminGuildVanityService';
interface AdminGuildServiceDeps {
guildRepository: IGuildRepositoryAggregate;
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import type {AdminMessageShredService} from '@app/api/admin/services/AdminMessageShredService';
import type {ChannelID, MessageID, UserID} from '@app/api/BrandedTypes';
import {createUserID} from '@app/api/BrandedTypes';
import type {IChannelRepository} from '@app/api/channel/IChannelRepository';
import {Logger} from '@app/api/Logger';
import type {
DeleteAllUserMessagesRequest,
DeleteAllUserMessagesResponse,
} from '@fluxer/schema/src/domains/admin/AdminMessageSchemas';
import type {ChannelID, MessageID, UserID} from '../../BrandedTypes';
import {createUserID} from '../../BrandedTypes';
import type {IChannelRepository} from '../../channel/IChannelRepository';
import {Logger} from '../../Logger';
import type {AdminAuditService} from './AdminAuditService';
import type {AdminMessageShredService} from './AdminMessageShredService';
interface AdminMessageDeletionServiceDeps {
channelRepository: IChannelRepository;
@@ -1,5 +1,32 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ApiContext} from '@app/api/ApiContext';
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import {
type AttachmentID,
type ChannelID,
createAttachmentID,
createChannelID,
createMessageID,
createUserID,
type MessageID,
type UserID,
} from '@app/api/BrandedTypes';
import type {IChannelRepository} from '@app/api/channel/IChannelRepository';
import {purgeMessageAttachments} from '@app/api/channel/services/message/MessageHelpers';
import {
createMessageResponseDataService,
type MessageResponseAccessContext,
messageResponseAccessForChannel,
messageResponseAccessForGuild,
} from '@app/api/channel/services/message/MessageResponseDataService';
import type {NcmecAttachmentStatusResponse, NcmecSubmissionService} from '@app/api/csam/NcmecSubmissionService';
import type {IGuildRepositoryAggregate} from '@app/api/guild/repositories/IGuildRepositoryAggregate';
import {getPurgeQueue, getStorageService} from '@app/api/middleware/ServiceSingletons';
import {getMessageSearchService} from '@app/api/SearchFactory';
import {deleteMessageSearchDocuments} from '@app/api/search/MessageSearchIndexCleanup';
import {searchExistingMessages} from '@app/api/search/MessageSearchResultReconciler';
import {assertSafeByteSize} from '@app/api/utils/ByteSizeUtils';
import type {
BrowseChannelRequest,
SearchChannelMessagesRequest,
@@ -10,33 +37,6 @@ import type {
LookupMessageRequest,
} from '@fluxer/schema/src/domains/admin/AdminMessageSchemas';
import type {MessageResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
import type {ApiContext} from '../../ApiContext';
import {
type AttachmentID,
type ChannelID,
createAttachmentID,
createChannelID,
createMessageID,
createUserID,
type MessageID,
type UserID,
} from '../../BrandedTypes';
import type {IChannelRepository} from '../../channel/IChannelRepository';
import {purgeMessageAttachments} from '../../channel/services/message/MessageHelpers';
import {
createMessageResponseDataService,
type MessageResponseAccessContext,
messageResponseAccessForChannel,
messageResponseAccessForGuild,
} from '../../channel/services/message/MessageResponseDataService';
import type {NcmecAttachmentStatusResponse, NcmecSubmissionService} from '../../csam/NcmecSubmissionService';
import type {IGuildRepositoryAggregate} from '../../guild/repositories/IGuildRepositoryAggregate';
import {getPurgeQueue, getStorageService} from '../../middleware/ServiceSingletons';
import {getMessageSearchService} from '../../SearchFactory';
import {deleteMessageSearchDocuments} from '../../search/MessageSearchIndexCleanup';
import {searchExistingMessages} from '../../search/MessageSearchResultReconciler';
import {assertSafeByteSize} from '../../utils/ByteSizeUtils';
import type {AdminAuditService} from './AdminAuditService';
interface AdminMessageServiceDeps {
apiContext: ApiContext;
@@ -1,13 +1,13 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ApiContext} from '@app/api/ApiContext';
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import type {UserID} from '@app/api/BrandedTypes';
import {Logger} from '@app/api/Logger';
import {ValidationErrorCodes} from '@fluxer/constants/src/ValidationErrorCodes';
import {InputValidationError} from '@fluxer/errors/src/domains/core/InputValidationError';
import type {MessageShredRequest} from '@fluxer/schema/src/domains/admin/AdminMessageSchemas';
import type {WorkerJobPayload} from '@pkgs/worker/src/contracts/WorkerTypes';
import type {ApiContext} from '../../ApiContext';
import type {UserID} from '../../BrandedTypes';
import {Logger} from '../../Logger';
import type {AdminAuditService} from './AdminAuditService';
type MessageShredStatusCacheEntry = {
status: 'in_progress' | 'completed' | 'failed';
@@ -1,12 +1,7 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {FeatureTemporarilyDisabledError} from '@fluxer/errors/src/domains/core/FeatureTemporarilyDisabledError';
import type {SearchReportsRequest} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import type {MessageResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
import {getEmailTemplate} from '@pkgs/email/src/email_i18n/EmailI18n';
import {seconds} from 'itty-time';
import type {ApiContext} from '../../ApiContext';
import type {ApiContext} from '@app/api/ApiContext';
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import {
type ChannelID,
createReportID,
@@ -14,33 +9,38 @@ import {
type GuildID,
type ReportID,
type UserID,
} from '../../BrandedTypes';
import {Config} from '../../Config';
import type {IChannelRepository} from '../../channel/IChannelRepository';
import type {ChannelService} from '../../channel/services/ChannelService';
import {makeAttachmentCdnKey} from '../../channel/services/message/MessageHelpers';
} from '@app/api/BrandedTypes';
import {Config} from '@app/api/Config';
import type {IChannelRepository} from '@app/api/channel/IChannelRepository';
import type {ChannelService} from '@app/api/channel/services/ChannelService';
import {makeAttachmentCdnKey} from '@app/api/channel/services/message/MessageHelpers';
import {
createMessageResponseDataService,
type MessageResponseAccessContext,
messageResponseAccessForChannel,
messageResponseAccessForGuild,
} from '../../channel/services/message/MessageResponseDataService';
import {SYSTEM_USER_ID} from '../../constants/Core';
import type {NcmecAttachmentStatusResponse, NcmecSubmissionService} from '../../csam/NcmecSubmissionService';
import type {MessageAttachment} from '../../database/types/MessageTypes';
import type {IGuildRepositoryAggregate} from '../../guild/repositories/IGuildRepositoryAggregate';
import type {IStorageService} from '../../infrastructure/IStorageService';
import type {UserCacheService} from '../../infrastructure/UserCacheService';
import {Logger} from '../../Logger';
import type {RequestCache} from '../../middleware/RequestCacheMiddleware';
import {createRequestCache} from '../../middleware/RequestCacheMiddleware';
import type {User} from '../../models/User';
import type {IARMessageContext, IARSubmission} from '../../report/IReportRepository';
import type {ReportService} from '../../report/ReportService';
import {getReportSearchService} from '../../SearchFactory';
import type {UserChannelService} from '../../user/services/UserChannelService';
import {assertSafeByteSize} from '../../utils/ByteSizeUtils';
import type {AdminAuditService} from './AdminAuditService';
} from '@app/api/channel/services/message/MessageResponseDataService';
import {SYSTEM_USER_ID} from '@app/api/constants/Core';
import type {NcmecAttachmentStatusResponse, NcmecSubmissionService} from '@app/api/csam/NcmecSubmissionService';
import type {MessageAttachment} from '@app/api/database/types/MessageTypes';
import type {IGuildRepositoryAggregate} from '@app/api/guild/repositories/IGuildRepositoryAggregate';
import type {IStorageService} from '@app/api/infrastructure/IStorageService';
import type {UserCacheService} from '@app/api/infrastructure/UserCacheService';
import {Logger} from '@app/api/Logger';
import type {RequestCache} from '@app/api/middleware/RequestCacheMiddleware';
import {createRequestCache} from '@app/api/middleware/RequestCacheMiddleware';
import type {User} from '@app/api/models/User';
import type {IARMessageContext, IARSubmission} from '@app/api/report/IReportRepository';
import type {ReportService} from '@app/api/report/ReportService';
import {getReportSearchService} from '@app/api/SearchFactory';
import type {UserChannelService} from '@app/api/user/services/UserChannelService';
import {assertSafeByteSize} from '@app/api/utils/ByteSizeUtils';
import {AdminACLs} from '@fluxer/constants/src/AdminACLs';
import {FeatureTemporarilyDisabledError} from '@fluxer/errors/src/domains/core/FeatureTemporarilyDisabledError';
import type {SearchReportsRequest} from '@fluxer/schema/src/domains/admin/AdminSchemas';
import type {MessageResponse} from '@fluxer/schema/src/domains/message/MessageResponseSchemas';
import {getEmailTemplate} from '@pkgs/email/src/email_i18n/EmailI18n';
import {seconds} from 'itty-time';
interface AdminReportServiceDeps {
apiContext: ApiContext;
@@ -1,17 +1,17 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ApiContext} from '@app/api/ApiContext';
import {mapGuildToAdminResponse} from '@app/api/admin/models/GuildTypes';
import {mapUserToAdminResponse} from '@app/api/admin/models/UserTypes';
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import {createGuildID, createUserID, type UserID} from '@app/api/BrandedTypes';
import {isSyntheticUserId} from '@app/api/constants/Core';
import type {IGuildRepositoryAggregate} from '@app/api/guild/repositories/IGuildRepositoryAggregate';
import {Logger} from '@app/api/Logger';
import {getGuildSearchService, getUserSearchService} from '@app/api/SearchFactory';
import {FeatureTemporarilyDisabledError} from '@fluxer/errors/src/domains/core/FeatureTemporarilyDisabledError';
import {InputValidationError} from '@fluxer/errors/src/domains/core/InputValidationError';
import type {WorkerJobPayload} from '@pkgs/worker/src/contracts/WorkerTypes';
import type {ApiContext} from '../../ApiContext';
import {createGuildID, createUserID, type UserID} from '../../BrandedTypes';
import {isSyntheticUserId} from '../../constants/Core';
import type {IGuildRepositoryAggregate} from '../../guild/repositories/IGuildRepositoryAggregate';
import {Logger} from '../../Logger';
import {getGuildSearchService, getUserSearchService} from '../../SearchFactory';
import {mapGuildToAdminResponse} from '../models/GuildTypes';
import {mapUserToAdminResponse} from '../models/UserTypes';
import type {AdminAuditService} from './AdminAuditService';
interface RefreshSearchIndexJobPayload extends WorkerJobPayload {
index_type:
@@ -1,14 +1,14 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ApiContext} from '@app/api/ApiContext';
import {mapUserToAdminResponse} from '@app/api/admin/models/UserTypes';
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import type {AdminUserUpdatePropagator} from '@app/api/admin/services/AdminUserUpdatePropagator';
import * as AuthSession from '@app/api/auth/AuthSession';
import {createUserID, type UserID} from '@app/api/BrandedTypes';
import {UserFlags} from '@fluxer/constants/src/UserConstants';
import {UnknownUserError} from '@fluxer/errors/src/domains/user/UnknownUserError';
import type {TempBanUserRequest} from '@fluxer/schema/src/domains/admin/AdminUserSchemas';
import type {ApiContext} from '../../ApiContext';
import * as AuthSession from '../../auth/AuthSession';
import {createUserID, type UserID} from '../../BrandedTypes';
import {mapUserToAdminResponse} from '../models/UserTypes';
import type {AdminAuditService} from './AdminAuditService';
import type {AdminUserUpdatePropagator} from './AdminUserUpdatePropagator';
interface AdminUserBanServiceDeps {
apiContext: ApiContext;
@@ -1,5 +1,21 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
import type {ApiContext} from '@app/api/ApiContext';
import {mapUserToAdminResponse} from '@app/api/admin/models/UserTypes';
import type {AdminAuditService} from '@app/api/admin/services/AdminAuditService';
import type {AdminBanManagementService} from '@app/api/admin/services/AdminBanManagementService';
import type {AdminUserUpdatePropagator} from '@app/api/admin/services/AdminUserUpdatePropagator';
import {BulkCancelledError, type BulkProgressHelpers} from '@app/api/admin/services/BulkProgressHelpers';
import * as AuthSession from '@app/api/auth/AuthSession';
import {createReportID, createUserID, type UserID} from '@app/api/BrandedTypes';
import type {BillingRepository} from '@app/api/billing/repositories/BillingRepository';
import type {KVAccountDeletionQueueService} from '@app/api/infrastructure/KVAccountDeletionQueueService';
import {Logger} from '@app/api/Logger';
import type {User} from '@app/api/models/User';
import {ReportStatus} from '@app/api/report/IReportRepository';
import type {ReportService} from '@app/api/report/ReportService';
import {getReportSearchService} from '@app/api/SearchFactory';
import {clearPendingDeletion, reschedulePendingDeletion} from '@app/api/user/services/PendingDeletionCoordinator';
import {DeletionReasons} from '@fluxer/constants/src/Core';
import {UserFlags} from '@fluxer/constants/src/UserConstants';
import {ReportAlreadyResolvedError} from '@fluxer/errors/src/domains/moderation/ReportAlreadyResolvedError';
@@ -9,22 +25,6 @@ import type {
ScheduleAccountDeletionRequest,
} from '@fluxer/schema/src/domains/admin/AdminUserSchemas';
import type Stripe from 'stripe';
import type {ApiContext} from '../../ApiContext';
import * as AuthSession from '../../auth/AuthSession';
import {createReportID, createUserID, type UserID} from '../../BrandedTypes';
import type {BillingRepository} from '../../billing/repositories/BillingRepository';
import type {KVAccountDeletionQueueService} from '../../infrastructure/KVAccountDeletionQueueService';
import {Logger} from '../../Logger';
import type {User} from '../../models/User';
import {ReportStatus} from '../../report/IReportRepository';
import type {ReportService} from '../../report/ReportService';
import {getReportSearchService} from '../../SearchFactory';
import {clearPendingDeletion, reschedulePendingDeletion} from '../../user/services/PendingDeletionCoordinator';
import {mapUserToAdminResponse} from '../models/UserTypes';
import type {AdminAuditService} from './AdminAuditService';
import type {AdminBanManagementService} from './AdminBanManagementService';
import type {AdminUserUpdatePropagator} from './AdminUserUpdatePropagator';
import {BulkCancelledError, type BulkProgressHelpers} from './BulkProgressHelpers';
interface AdminUserDeletionServiceDeps {
apiContext: ApiContext;

Some files were not shown because too many files have changed in this diff Show More