import { Hono } from 'hono' import { logger } from 'hono/logger' import type { AuthPayload } from './db/repo/auth.repo' import { authRouter } from './routes/auth.route' import { jwt } from 'hono/jwt' import env from './env' import { prettyJSON } from 'hono/pretty-json' import { cors } from 'hono/cors' import { bodyLimit } from 'hono/body-limit' import { HttpStatus, createApexError } from './services/error.service' import { userStatsRouter } from './routes/user-stats.route' import { publicResourceRouter, resourceRouter } from './routes/resource.route' import { publicResourceStatsRouter, resourceStatsRouter } from './routes/resource-stats.route' import { collectionsRouter, getCollections } from './routes/collections.route' import { userRouter } from './routes/user.route' import { uploaderRouter } from './routes/uploader.route' import { collectionsStatsRouter, getCollectionsStats } from './routes/collection-stats.route' import { publicSubjectsRouter, subjectsRouter } from './routes/subjects.route' import { submissionRouter } from './routes/submission.route' import { licenseRouter, publicLicenseRouter } from './routes/license.route' import { languageRouter, publicLanguageRouter } from './routes/language.route' import { educationalStageRouter, publicEducationalStageRouter } from './routes/educational-stage.route' import { objectTypeRouter, publicObjectTypeRouter } from './routes/object-type.route' import { roleRouter } from './routes/role.route' import { complaintsRouter } from './routes/complaints.route' import { publicResourceLanguageRouter, resourceLanguageRouter } from './routes/resource-language.route' import { userRoleRouter } from './routes/user-role.route' import { collectionLikesRoutes, publicCollectionLikesRoutes } from './routes/collection-likes.route' import { institutionRouter } from './routes/institution.route' import { collectionResourcesRoutes, publicCollectionResourcesRoutes } from './routes/collection-resources.route' import { publicResourceSubjectsRouter, resourceSubjectsRouter } from './routes/resource-subjects.route' import { userInstitutionRouter } from './routes/user-institution.route' import { publicResourceLikesRoutes, resourceLikesRoutes } from './routes/resource-likes.route' import { publicResourceEducationalStagesRouter, resourceEducationalStagesRouter } from './routes/resource-educational-stages.route' import { achievementRouter, publicAchievementRouter } from './routes/achievement.route' import { itemsRouter, publicItemsRouter } from './routes/items.route' import { publicUserAchievementsRoute, userAchievementsRouter } from './routes/user-achievements.route' import { actionRouter } from './routes/action.route' import { notificationRouter } from './routes/notification.route' import { userItemRouter } from './routes/user-item.route' import { swaggerUI } from '@hono/swagger-ui' import { OpenAPIHono } from "@hono/zod-openapi"; import { commentsRouter, publicCommentsRoute } from './routes/comments.route' import { publicCommentsReplyRoute, commentReplyRouter } from './routes/comment-reply.route' import { publicUserCollectionsRoutes, userCollectionsRoute } from './routes/user-collection.route' import { s3Routes } from './routes/s3.route' const app = new OpenAPIHono(); app.use('*', logger()) app.use('*', prettyJSON()) app.use('*', cors()) app.use( '/api/*', jwt({ secret: env.APP_SECRET, }) ) // The openapi.json will be available at /doc app.doc("/doc", { openapi: "3.0.0", info: { version: "1.0.0", title: "My API", }, }); // swagger ui doc will be available at {server url}/ui // fell free to change the url // swaggerUI url must have same path as openapi.json app.get("/ui", swaggerUI({ url: "/doc" })); app.use( '/api/upload', bodyLimit({ maxSize: 50 * 1024 * 1024, // 50mb onError(c) { return c.json( createApexError({ status: 'error', message: 'File is too big. Current limit is 50mb', code: HttpStatus.PAYLOAD_TOO_LARGE, path: c.req.routePath, suggestion: 'Reduce the size of your file and try again', }), 413 ) }, }) ) app.get('/', (c) => c.json({ message: 'sv running on /api' })) //rotas que não precisam de token app .basePath('/public') .route('/auth', authRouter) .route('/resource', publicResourceRouter) .route('/statsResource', publicResourceStatsRouter) .route('/subjects', publicSubjectsRouter) .route('/get-collections', getCollections) .route('/get-collection-stats', getCollectionsStats) .route('/license', publicLicenseRouter) .route('/language', publicLanguageRouter) .route('/educationalStage', publicEducationalStageRouter) .route('/objectType', publicObjectTypeRouter) .route('/resourceLanguage', publicResourceLanguageRouter) .route('/collectionLikes', publicCollectionLikesRoutes) .route('/collectionResources', publicCollectionResourcesRoutes) .route('/resourceSubjects', publicResourceSubjectsRouter) .route('/resourceEducationalStages', publicResourceEducationalStagesRouter) .route('/items', publicItemsRouter) .route('/resourceLikes', publicResourceLikesRoutes) .route('/achievements', publicAchievementRouter) .route('/userAchievements', publicUserAchievementsRoute) .route('/comments', publicCommentsRoute) .route('/replyComment', publicCommentsReplyRoute) .route('/userCollections', publicUserCollectionsRoutes) //rotas que precisam de token app .basePath('/api') .route('/user', userRouter) .route('/upload', uploaderRouter) .route('/user-stats', userStatsRouter) .route('/resource', resourceRouter) .route('/statsResource', resourceStatsRouter) .route('/subjects', subjectsRouter) .route('/collection', collectionsRouter) .route('/collection-stats', collectionsStatsRouter) .route('/submission', submissionRouter) .route('/license', licenseRouter) .route('/language', languageRouter) .route('/educationalStage', educationalStageRouter) .route('/objectType', objectTypeRouter) .route('/roles', roleRouter) .route('/user-roles', userRoleRouter) .route('/complaint', complaintsRouter) .route('/resourceLanguage', resourceLanguageRouter) .route('/collectionLikes', collectionLikesRoutes) .route('/institution', institutionRouter) .route('/collectionResources', collectionResourcesRoutes) .route('/resourceSubjects', resourceSubjectsRouter) .route('/user-institutions', userInstitutionRouter) .route('/resourceEducationalStages', resourceEducationalStagesRouter) .route('/items', itemsRouter) .route('/actions', actionRouter) .route('/achievements', achievementRouter) .route('/resourceLikes', resourceLikesRoutes) .route('/userAchievements', userAchievementsRouter) .route('/notifications', notificationRouter) .route('/user-item', userItemRouter) .route('/comments', commentsRouter) .route('/replyComment', commentReplyRouter) .route('/userCollections', userCollectionsRoute) .route('/s3', s3Routes) export default app export type AppType = typeof app export function honoWithJwt() { return new Hono<{ Variables: { jwtPayload: AuthPayload } }>() }