Files
classroomio/apps/api/src/app.ts
T

104 lines
3.3 KiB
TypeScript
Raw Normal View History

import 'dotenv/config';
import { API_SERVER_URL, TRUSTED_ORIGINS } from '@api/constants';
2026-03-09 11:18:22 +01:00
import { Hono } from '@api/utils/hono';
2025-12-02 15:27:41 +01:00
import { accountRouter } from '@api/routes/account';
2026-03-09 11:18:22 +01:00
import { auth } from '@cio/db/auth';
import { communityRouter } from '@api/routes/community';
import { cors } from 'hono/cors';
import { courseRouter } from '@api/routes/course';
2025-12-02 15:27:41 +01:00
import { dashAnalyticsRouter } from '@api/routes/dash';
2026-03-09 11:18:22 +01:00
import { domainRouter } from '@api/routes/domain/domain';
import { inviteRouter } from '@api/routes/invite';
import { logger } from 'hono/logger';
// ROUTES
import { mailRouter } from '@api/routes/mail';
import { mediaRouter } from '@api/routes/media';
import { onboardingRouter } from '@api/routes/onboarding';
import { organizationRouter } from '@api/routes/organization';
2026-03-09 11:18:22 +01:00
import { licenseRouter } from '@api/routes/license';
import { organizationSsoRouter } from '@api/routes/organization/sso';
import { organizationTokenAuthRouter } from '@api/routes/organization/token-auth';
import { ssoDiscoveryRouter } from '@api/routes/sso/discovery';
import { prettyJSON } from 'hono/pretty-json';
import rateLimiter from '@api/middlewares/rate-limiter';
import { secureHeaders } from 'hono/secure-headers';
import { signupGuard } from '@api/middlewares/signup-guard';
import { unsplashRouter } from '@api/routes/unsplash/unsplash';
// Create Hono app with chaining for RPC support
export const app = new Hono()
// Middleware
.use('*', logger())
.use('*', prettyJSON())
.use('*', secureHeaders())
.use(
'*',
cors({
origin: TRUSTED_ORIGINS,
allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowHeaders: ['Content-Type', 'Authorization', 'Cio-org-id'],
exposeHeaders: ['Content-Length', 'X-Kuma-Revision'],
maxAge: 600,
credentials: true
})
)
.use('*', rateLimiter)
.use('*', async (c, next) => {
const session = await auth.api.getSession({ headers: c.req.raw.headers });
if (!session) {
c.set('user', null);
c.set('session', null);
await next();
return;
}
c.set('user', session.user);
c.set('session', session.session);
await next();
})
// Routes
.get('/', (c) =>
c.json({
message: `"Welcome to Classroomio.com API - docs are at ${API_SERVER_URL}/docs"`
})
)
2026-03-09 11:18:22 +01:00
.use('/api/auth/sign-up/*', signupGuard)
.on(['POST', 'GET'], '/api/auth/*', (c) => auth.handler(c.req.raw))
.get('/session', async (c) => {
const session = c.get('session');
const user = c.get('user');
if (!user) return c.body(null, 401);
return c.json({
session,
user
});
})
.route('/onboarding', onboardingRouter)
.route('/account', accountRouter)
.route('/course', courseRouter)
2026-03-09 11:18:22 +01:00
.route('/domain', domainRouter)
.route('/mail', mailRouter)
.route('/media', mediaRouter)
2026-03-09 11:18:22 +01:00
.route('/license', licenseRouter)
.route('/organization', organizationRouter)
2026-03-09 11:18:22 +01:00
.route('/organization/sso', organizationSsoRouter)
.route('/organization/token-auth', organizationTokenAuthRouter)
.route('/sso', ssoDiscoveryRouter)
2025-12-02 15:27:41 +01:00
.route('/dash', dashAnalyticsRouter)
.route('/community', communityRouter)
2026-03-09 11:18:22 +01:00
.route('/invite', inviteRouter)
.route('/unsplash', unsplashRouter)
// Error handling
.onError((err, c) => {
console.error('Error:', err);
return c.json({ error: 'Internal Server Error' }, 500);
});