This repository has no description
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};