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