feat(server): stripe integration and credits system (#1024)

This commit is contained in:
RainbowBird
2026-03-28 02:25:44 +08:00
parent f92b07defb
commit fc51738209
27 changed files with 2477 additions and 87 deletions
+32 -4
View File
@@ -1,3 +1,4 @@
import type { Env } from './libs/env'
import type { HonoEnv } from './types/hono'
import process from 'node:process'
@@ -18,9 +19,13 @@ import { sessionMiddleware } from './middlewares/auth'
import { otelMiddleware } from './middlewares/otel'
import { createCharacterRoutes } from './routes/characters'
import { createChatRoutes } from './routes/chats'
import { createFluxRoutes } from './routes/flux'
import { createProviderRoutes } from './routes/providers'
import { createStripeRoutes } from './routes/stripe'
import { createV1CompletionsRoutes } from './routes/v1completions'
import { createCharacterService } from './services/characters'
import { createChatService } from './services/chats'
import { createFluxService } from './services/flux'
import { createProviderService } from './services/providers'
import { ApiError, createInternalError } from './utils/error'
import { getTrustedOrigin } from './utils/origin'
@@ -29,6 +34,7 @@ type AuthService = ReturnType<typeof createAuth>
type CharacterService = ReturnType<typeof createCharacterService>
type ChatService = ReturnType<typeof createChatService>
type ProviderService = ReturnType<typeof createProviderService>
type FluxService = ReturnType<typeof createFluxService>
type OtelMetrics = ReturnType<typeof initOtel>
@@ -37,10 +43,11 @@ interface AppDeps {
characterService: CharacterService
chatService: ChatService
providerService: ProviderService
otel: OtelMetrics | null
fluxService: FluxService
env: Env
}
function buildApp({ auth, characterService, chatService, providerService, otel }: AppDeps) {
function buildApp({ auth, characterService, chatService, providerService, fluxService, env }: AppDeps) {
const logger = useLogger('app').useGlobalConfig()
const app = new Hono<HonoEnv>()
@@ -104,6 +111,21 @@ function buildApp({ auth, characterService, chatService, providerService, otel }
* Chat routes are handled by the chat service.
*/
.route('/api/chats', createChatRoutes(chatService))
/**
* V1 routes for official provider.
*/
.route('/v1', createV1CompletionsRoutes(fluxService, env))
/**
* Flux routes.
*/
.route('/api/flux', createFluxRoutes(fluxService))
/**
* Stripe routes.
*/
.route('/api/stripe', createStripeRoutes(fluxService, env))
}
export type AppType = ReturnType<typeof buildApp>
@@ -159,14 +181,20 @@ async function createApp() {
build: ({ dependsOn }) => createChatService(dependsOn.db),
})
const fluxService = injeca.provide('services:flux', {
dependsOn: { db },
build: ({ dependsOn }) => createFluxService(dependsOn.db),
})
await injeca.start()
const resolved = await injeca.resolve({ auth, characterService, chatService, providerService, otel })
const resolved = await injeca.resolve({ auth, characterService, chatService, providerService, fluxService, env: parsedEnv })
const app = buildApp({
auth: resolved.auth,
characterService: resolved.characterService,
chatService: resolved.chatService,
providerService: resolved.providerService,
otel: resolved.otel,
fluxService: resolved.fluxService,
env: resolved.env,
})
logger.withFields({ port: 3000 }).log('Server started')