Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/api/src/cache/leaderboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { DatabaseClient } from '@rctf/db'
import { challenges, scoreEvents, users } from '@rctf/db'
import { and, asc, eq, gte, inArray, sql } from 'drizzle-orm'
import { inJsonbArray } from '../lib/db-bulk'
import { challengeIsPublicSql } from '../services/challenges'
import { challengeIsPublicSql } from '../services/challenge-queries'
import { getCompetitionTiming } from '../services/settings'
import type { TypedRedis } from './scripts'

Expand Down
8 changes: 3 additions & 5 deletions apps/api/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,9 @@ import type { AppEnv } from './lib/app-env'
import { runMigrationsOnStartup } from './lib/migrations'
import { appEnvMiddleware } from './middlewares/app-env'
import { dynamicChallengeAuthMiddleware } from './middlewares/dynamic-challenge-auth'
import {
adminBotProvider,
analyticsProvider,
uploadProvider,
} from './providers'
import { adminBotProvider } from './providers/instances/admin-bot'
import { analyticsProvider } from './providers/instances/analytics'
import { uploadProvider } from './providers/instances/uploads'
import { routeModules } from './routes'
import { analyticsScriptHandler } from './routes/v2/integrations/routes/get-analytics-script'
import { startLeaderboardWorker, stopWorkers } from './workers'
Expand Down
115 changes: 0 additions & 115 deletions apps/api/src/providers/index.ts

This file was deleted.

9 changes: 9 additions & 0 deletions apps/api/src/providers/instances/admin-bot.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { config } from '@rctf/config'
import { adminBotProviders } from '../admin-bot'
import { loadProvider } from './load'

export const adminBotProvider = loadProvider(
adminBotProviders,
config.adminBot?.provider
)
export const adminBotEnabled = adminBotProvider !== undefined
19 changes: 19 additions & 0 deletions apps/api/src/providers/instances/analytics.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { config } from '@rctf/config'
import { analyticsProviders } from '../analytics'
import { loadProvider } from './load'

export const analyticsProvider = (() => {
if (config.analytics?.provider) {
return loadProvider(analyticsProviders, config.analytics.provider)
}

// NOTE(es3n1n): backporting v1 google analytics config
if (config.globalSiteTag) {
return loadProvider(analyticsProviders, {
name: 'analytics/google',
options: { siteTag: config.globalSiteTag },
})
}

return undefined
})()
28 changes: 28 additions & 0 deletions apps/api/src/providers/instances/captcha.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { config } from '@rctf/config'
import { captchaProviders } from '../captcha'
import { loadProvider } from './load'

export const captchaProvider = (() => {
if (config.captcha?.provider) {
return loadProvider(captchaProviders, config.captcha.provider)
}

// NOTE(es3n1n): backporting v1 google captcha config
if (config.recaptcha) {
const provider = {
name: 'captcha/recaptcha' as const,
options: {
secretKey: config.recaptcha.secretKey,
siteKey: config.recaptcha.siteKey,
},
}
config.captcha = {
provider,
protectedEndpoints: config.recaptcha.protectedActions ?? [],
}

return loadProvider(captchaProviders, provider)
}

return undefined
})()
8 changes: 8 additions & 0 deletions apps/api/src/providers/instances/emails.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { config } from '@rctf/config'
import { emailProviders } from '../emails'
import { loadProvider } from './load'

export const emailProvider = loadProvider(
emailProviders,
config.email?.provider
)
15 changes: 15 additions & 0 deletions apps/api/src/providers/instances/instancer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { config } from '@rctf/config'
import { instancerProviders } from '../instancer'
import type { InstancerProvider } from '../instancer/base'
import { resolveInstancerConfigs } from '../instancer/resolve'
import { loadProvider } from './load'

const resolvedInstancers = resolveInstancerConfigs(config)
export const instancers: Record<string, InstancerProvider> = Object.fromEntries(
Object.entries(resolvedInstancers.configs).map(([name, providerConfig]) => [
name,
loadProvider(instancerProviders, providerConfig)!,
])
)
export const defaultInstancerName = resolvedInstancers.defaultName
export const instancerEnabled = Object.keys(instancers).length > 0
21 changes: 21 additions & 0 deletions apps/api/src/providers/instances/load.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import type { ProviderConfig } from '@rctf/config'

export const loadProvider = <Base>(
providers: Record<string, (options: any) => Base>,
providerConfig: ProviderConfig | undefined
): Base | undefined => {
if (!providerConfig) {
return undefined
}

const provider = providers[providerConfig.name]
if (!provider) {
throw new Error(
`Unsupported provider: ${providerConfig.name}. Available: ${Object.keys(
providers
).join(', ')}`
)
}

return provider(providerConfig.options)
}
7 changes: 7 additions & 0 deletions apps/api/src/providers/instances/messages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { config } from '@rctf/config'
import { messagesProviders } from '../messages'
import { loadProvider } from './load'

export const bloodBotProviders = config.bloodBot?.destinations.map(
({ provider }) => loadProvider(messagesProviders, provider)!
)
8 changes: 8 additions & 0 deletions apps/api/src/providers/instances/moderation.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { config } from '@rctf/config'
import { moderationProviders } from '../moderation'
import { loadProvider } from './load'

export const avatarModerationProvider = loadProvider(
moderationProviders,
config.avatarsModeration?.provider
)
8 changes: 8 additions & 0 deletions apps/api/src/providers/instances/score.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { config } from '@rctf/config'
import { scoreProviders, type ScoreProvider } from '@rctf/scoring'
import { loadProvider } from './load'

export const scoreProvider = loadProvider<ScoreProvider>(
scoreProviders,
config.scoreProvider
)!
8 changes: 8 additions & 0 deletions apps/api/src/providers/instances/uploads.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { config } from '@rctf/config'
import { uploadProviders } from '../uploads'
import { loadProvider } from './load'

export const uploadProvider = loadProvider(
uploadProviders,
config.uploadProvider
)!
2 changes: 1 addition & 1 deletion apps/api/src/routes/v1/admin/routes/query-uploads.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { QueryUploadsRoute } from '@rctf/types'
import { uploadProvider } from '../../../../providers'
import { uploadProvider } from '../../../../providers/instances/uploads'
import adminGroup from '../group'

adminGroup.route(QueryUploadsRoute, async ({ body, res }) => {
Expand Down
2 changes: 1 addition & 1 deletion apps/api/src/routes/v1/admin/routes/upload-files.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { UploadFilesRoute } from '@rctf/types'
import { dataUriToBuffer } from 'data-uri-to-buffer'
import { uploadProvider } from '../../../../providers'
import { uploadProvider } from '../../../../providers/instances/uploads'
import adminGroup from '../group'

adminGroup.route(UploadFilesRoute, async ({ res, body }) => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { config } from '@rctf/config'
import { GetLeaderboardRoute } from '@rctf/types'
import { getLeaderboardWithTotal } from '../../../../services/leaderboard'
import { getLeaderboardWithTotal } from '../../../../services/leaderboard-queries'
import leaderboardGroup from '../group'

leaderboardGroup.route(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { GetAdminBotStatusRouteV2 } from '@rctf/types'
import { adminBotProvider } from '../../../../providers'
import { adminBotProvider } from '../../../../providers/instances/admin-bot'
import adminGroup from '../group'

adminGroup.route(GetAdminBotStatusRouteV2, async ({ res }) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {
defaultInstancerName,
instancerEnabled,
instancers,
} from '../../../../providers'
} from '../../../../providers/instances/instancer'
import adminGroup from '../group'

adminGroup.route(GetInstancerSchemaRouteV2, async ({ res }) => {
Expand Down
2 changes: 1 addition & 1 deletion apps/api/src/routes/v2/admin/routes/query-uploads.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { QueryUploadsRouteV2 } from '@rctf/types'
import { uploadProvider } from '../../../../providers'
import { uploadProvider } from '../../../../providers/instances/uploads'
import adminGroup from '../group'

adminGroup.route(QueryUploadsRouteV2, async ({ body, res }) => {
Expand Down
3 changes: 2 additions & 1 deletion apps/api/src/routes/v2/admin/routes/update-challenge.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import type { AdminBotConfig } from '@rctf/db'
import { UpdateChallengeRouteV2 } from '@rctf/types'
import { adminBotProvider, instancerEnabled } from '../../../../providers'
import { adminBotProvider } from '../../../../providers/instances/admin-bot'
import { instancerEnabled } from '../../../../providers/instances/instancer'
import { createDefaultFlag, getFlagProvider } from '../../../../providers/flags'
import {
ChallengeKindChangeBlockedError,
Expand Down
2 changes: 1 addition & 1 deletion apps/api/src/routes/v2/admin/routes/upload-files.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { UploadFilesRouteV2 } from '@rctf/types'
import { uploadProvider } from '../../../../providers'
import { uploadProvider } from '../../../../providers/instances/uploads'
import adminGroup from '../group'

adminGroup.route(UploadFilesRouteV2, async ({ res, body }) => {
Expand Down
3 changes: 2 additions & 1 deletion apps/api/src/routes/v2/challs/routes/get-challenges.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { ChallengeScoringKind, GetChallengesRouteV2 } from '@rctf/types'
import { adminBotEnabled, instancerEnabled } from '../../../../providers'
import { adminBotEnabled } from '../../../../providers/instances/admin-bot'
import { instancerEnabled } from '../../../../providers/instances/instancer'
import { getChallenges } from '../../../../services/challenges'
import {
resolveInstancerActions,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { GetAdminBotConfigRouteV2 } from '@rctf/types'
import { adminBotProvider } from '../../../../providers'
import { adminBotProvider } from '../../../../providers/instances/admin-bot'
import { getChallenge } from '../../../../services/challenges'
import integrationsGroup from '../group'

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AdminBotJobStatus, GetAdminBotJobHistoryRouteV2 } from '@rctf/types'
import { adminBotProvider } from '../../../../providers'
import { adminBotProvider } from '../../../../providers/instances/admin-bot'
import { getJobHistory } from '../../../../services/admin-bot-jobs'
import { getChallenge } from '../../../../services/challenges'
import integrationsGroup from '../group'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { GetAdminBotJobLogsRouteV2 } from '@rctf/types'
import { adminBotProvider } from '../../../../providers'
import { adminBotProvider } from '../../../../providers/instances/admin-bot'
import { getJobLogs } from '../../../../services/admin-bot-jobs'
import { getChallenge } from '../../../../services/challenges'
import integrationsGroup from '../group'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AdminBotJobStatus, GetAdminBotJobStatusRouteV2 } from '@rctf/types'
import { adminBotProvider } from '../../../../providers'
import { adminBotProvider } from '../../../../providers/instances/admin-bot'
import { getLatestJob } from '../../../../services/admin-bot-jobs'
import { getChallenge } from '../../../../services/challenges'
import integrationsGroup from '../group'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Context } from 'hono'
import type { AppEnv } from '../../../../lib/app-env'
import { analyticsProvider } from '../../../../providers'
import { analyticsProvider } from '../../../../providers/instances/analytics'

let cachedScript: { content: string; fetchedAt: number } | null = null
const CACHE_TTL_MS = 60 * 60 * 1000 // 1 hour
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { config } from '@rctf/config'
import { GetClientConfigRouteV2, ProtectedAction } from '@rctf/types'
import { captchaProvider, instancerEnabled } from '../../../../providers'
import { captchaProvider } from '../../../../providers/instances/captcha'
import { instancerEnabled } from '../../../../providers/instances/instancer'
import { getResolvedSettings } from '../../../../services/settings'
import integrationsGroup from '../group'

Expand Down
Loading