* feat: setup secure presigned uploads and downloads * clean up * update lock * Get presigned url finally working * 557: Migrate backend to hono + ts * chore: update Dockerfile and package.json for backend configuration * add dev command * remove unused packages * Enhance backend API and frontend components for course management - Updated CORS configuration in the backend to allow specific methods and headers. - Refactored lesson download endpoint to use a new route for PDF downloads. - Removed unused certificate download functionality from the lesson router. - Updated frontend components to reflect changes in API endpoints and improve video upload functionality. - Introduced new video upload component and adjusted video handling in lesson materials. - Cleaned up unnecessary imports and optimized component structure for better performance. * PR cleanups * Enhance email configuration by adding SMTP_SENDER environment variable - Updated docker-compose.yaml to include SMTP_SENDER. - Modified Dockerfile to accept SMTP_SENDER as an argument. - Updated environment schema in env.ts to define SMTP_SENDER as optional. - Adjusted mail service to use SMTP_SENDER for the email 'from' field. - Updated documentation to reflect the new SMTP_SENDER variable. * Remove debug log statement from sendEmail function --------- Co-authored-by: Iniubong Obonguko <iniubongobonguko2018@gmail.com>
67 lines
1.8 KiB
TypeScript
67 lines
1.8 KiB
TypeScript
import 'dotenv/config';
|
|
|
|
import { Hono } from 'hono';
|
|
import { cors } from 'hono/cors';
|
|
import { courseRouter } from '$src/routes/course/course';
|
|
import { env } from '$src/config/env';
|
|
import { logger } from 'hono/logger';
|
|
import { mailRouter } from '$src/routes/mail';
|
|
import { prettyJSON } from 'hono/pretty-json';
|
|
import { rateLimiter } from 'hono-rate-limiter';
|
|
import { secureHeaders } from 'hono/secure-headers';
|
|
import { serve } from '@hono/node-server';
|
|
import { showRoutes } from 'hono/dev';
|
|
|
|
// Create Hono app
|
|
const app = new Hono();
|
|
|
|
// Middleware
|
|
app.use('*', logger());
|
|
app.use('*', prettyJSON());
|
|
app.use('*', secureHeaders());
|
|
app.use(
|
|
'*',
|
|
cors({
|
|
origin: '*',
|
|
allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
|
allowHeaders: ['Content-Type', 'Authorization'],
|
|
exposeHeaders: ['Content-Length', 'X-Kuma-Revision'],
|
|
maxAge: 600,
|
|
credentials: true
|
|
})
|
|
);
|
|
|
|
app.use(
|
|
rateLimiter({
|
|
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
limit: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes).
|
|
standardHeaders: 'draft-6', // draft-6: `RateLimit-*` headers; draft-7: combined `RateLimit` header
|
|
keyGenerator: (c) => c.req.header('Authorization')?.split(' ')[1] ?? 'unknown' // Method to generate custom identifiers for clients.
|
|
})
|
|
);
|
|
|
|
// Routes
|
|
app.get('/', (c) => c.json({ message: 'Welcome to ClassroomIO' }));
|
|
|
|
app.route('/course', courseRouter);
|
|
app.route('/mail', mailRouter);
|
|
|
|
// Error handling
|
|
app.onError((err, c) => {
|
|
console.error('Error:', err);
|
|
return c.json({ error: 'Internal Server Error' }, 500);
|
|
});
|
|
|
|
// Start server
|
|
const port = env.PORT ? parseInt(env.PORT) : 3002;
|
|
|
|
function startServer() {
|
|
console.log('Starting server...');
|
|
|
|
serve({ fetch: app.fetch, port });
|
|
|
|
showRoutes(app, { colorize: true });
|
|
}
|
|
|
|
startServer();
|