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