This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

semble / src / shared / infrastructure / http / app.ts
6.3 kB 169 lines
1import express, { Express } from 'express'; 2import cors from 'cors'; 3import cookieParser from 'cookie-parser'; 4import { Router } from 'express'; 5import { createUserRoutes } from '../../../modules/user/infrastructure/http/routes/userRoutes'; 6import { createAtprotoRoutes } from '../../../modules/atproto/infrastructure/atprotoRoutes'; 7import { createCardsModuleRoutes } from '../../../modules/cards/infrastructure/http/routes'; 8import { createFeedRoutes } from '../../../modules/feeds/infrastructure/http/routes/feedRoutes'; 9import { createSearchRoutes } from '../../../modules/search/infrastructure/http/routes/searchRoutes'; 10import { createNotificationRoutes } from '../../../modules/notifications/infrastructure/http/routes/notificationRoutes'; 11import { createTestRoutes } from './routes/testRoutes'; 12import { 13 EnvironmentConfigService, 14 Environment, 15} from '../config/EnvironmentConfigService'; 16import { RepositoryFactory } from './factories/RepositoryFactory'; 17import { ServiceFactory } from './factories/ServiceFactory'; 18import { UseCaseFactory } from './factories/UseCaseFactory'; 19import { ControllerFactory } from './factories/ControllerFactory'; 20 21export const createExpressApp = ( 22 configService: EnvironmentConfigService, 23): Express => { 24 const app = express(); 25 26 // Determine allowed origins based on environment 27 const getAllowedOrigins = () => { 28 const environment = configService.get().environment; 29 const appUrl = configService.getAppConfig().appUrl; 30 31 switch (environment) { 32 case Environment.PROD: 33 return ['https://semble.so', 'https://api.semble.so']; 34 case Environment.DEV: 35 return ['https://dev.semble.so', 'https://api.dev.semble.so']; 36 case Environment.LOCAL: 37 default: 38 // Allow both localhost:4000 and configured appUrl for flexibility 39 return [ 40 'http://localhost:4000', 41 'http://127.0.0.1:4000', 42 appUrl, 43 'http://localhost:3000', 44 'http://127.0.0.1:3000', 45 ]; 46 } 47 }; 48 49 app.use( 50 cors({ 51 origin: getAllowedOrigins(), 52 methods: ['GET', 'POST', 'PUT', 'DELETE'], 53 credentials: true, // Required for cookies to work in cross-origin requests 54 }), 55 ); 56 57 // Middleware setup 58 app.use(cookieParser()); // Parse cookies from incoming requests 59 app.use(express.json()); 60 app.use(express.urlencoded({ extended: true })); 61 62 // Create all dependencies using factories 63 const repositories = RepositoryFactory.create(configService); 64 const services = ServiceFactory.createForWebApp(configService, repositories); 65 const useCases = UseCaseFactory.createForWebApp(repositories, services); 66 const controllers = ControllerFactory.create( 67 useCases, 68 services.cookieService, 69 ); 70 71 // Routes 72 const userRouter = Router(); 73 const atprotoRouter = Router(); 74 75 createUserRoutes( 76 userRouter, 77 services.authMiddleware, 78 controllers.initiateOAuthSignInController, 79 controllers.completeOAuthSignInController, 80 controllers.loginWithAppPasswordController, 81 controllers.logoutController, 82 controllers.getMyProfileController, 83 controllers.getUserProfileController, 84 controllers.refreshAccessTokenController, 85 controllers.generateExtensionTokensController, 86 controllers.followTargetController, 87 controllers.unfollowTargetController, 88 controllers.getFollowingUsersController, 89 controllers.getFollowersController, 90 controllers.getFollowingCollectionsController, 91 controllers.getFollowingCountController, 92 controllers.getFollowersCountController, 93 controllers.getFollowingCollectionsCountController, 94 ); 95 96 createAtprotoRoutes(atprotoRouter, services.nodeOauthClient); 97 98 const cardsRouter = createCardsModuleRoutes( 99 services.authMiddleware, 100 // Card controllers 101 controllers.addUrlToLibraryController, 102 controllers.addCardToLibraryController, 103 controllers.addCardToCollectionController, 104 controllers.updateNoteCardController, 105 controllers.updateUrlCardAssociationsController, 106 controllers.removeCardFromLibraryController, 107 controllers.removeCardFromCollectionController, 108 controllers.getUrlMetadataController, 109 controllers.getUrlCardViewController, 110 controllers.getLibrariesForCardController, 111 controllers.getMyUrlCardsController, 112 controllers.getUserUrlCardsController, 113 controllers.getUrlStatusForMyLibraryController, 114 controllers.getLibrariesForUrlController, 115 controllers.getNoteCardsForUrlController, 116 // Collection controllers 117 controllers.createCollectionController, 118 controllers.updateCollectionController, 119 controllers.deleteCollectionController, 120 controllers.getCollectionPageController, 121 controllers.getCollectionPageByAtUriController, 122 controllers.getMyCollectionsController, 123 controllers.getCollectionsController, 124 controllers.getCollectionsForUrlController, 125 controllers.searchCollectionsController, 126 controllers.getOpenCollectionsWithContributorController, 127 controllers.getCollectionFollowersController, 128 controllers.getCollectionFollowersCountController, 129 controllers.getCollectionContributorsController, 130 ); 131 132 const feedRouter = createFeedRoutes( 133 services.authMiddleware, 134 controllers.getGlobalFeedController, 135 controllers.getGemActivityFeedController, 136 controllers.getFollowingFeedController, 137 ); 138 139 const searchRouter = createSearchRoutes( 140 services.authMiddleware, 141 controllers.getSimilarUrlsForUrlController, 142 controllers.searchBskyPostsForUrlController, 143 controllers.semanticSearchUrlsController, 144 controllers.searchAtProtoAccountsController, 145 controllers.searchLeafletDocsForUrlController, 146 ); 147 148 const notificationRouter = createNotificationRoutes( 149 services.authMiddleware, 150 controllers.getMyNotificationsController, 151 controllers.getUnreadNotificationCountController, 152 controllers.markNotificationsAsReadController, 153 controllers.markAllNotificationsAsReadController, 154 ); 155 156 const testRouter = Router(); 157 createTestRoutes(testRouter); 158 159 // Register routes 160 app.use('/api/users', userRouter); 161 app.use('/atproto', atprotoRouter); 162 app.use('/api', cardsRouter); 163 app.use('/api/feeds', feedRouter); 164 app.use('/api/search', searchRouter); 165 app.use('/api/notifications', notificationRouter); 166 app.use('/api/test', testRouter); 167 168 return app; 169};