server.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import 'reflect-metadata';
  2. import express from 'express';
  3. import { ApolloServerPluginLandingPageGraphQLPlayground as Playground } from 'apollo-server-core';
  4. import { ApolloServer } from 'apollo-server-express';
  5. import { createSchema } from './schema';
  6. import { ApolloLogs } from './config/logger/apollo.logger';
  7. import { createServer } from 'http';
  8. import logger from './config/logger/logger';
  9. import getSessionMiddleware from './core/middlewares/sessionMiddleware';
  10. import { MyContext } from './types';
  11. import { __prod__ } from './config/constants/constants';
  12. import cors from 'cors';
  13. import datasource from './config/datasource';
  14. import appsService from './modules/apps/apps.service';
  15. import { runUpdates } from './core/updates/run';
  16. import recover from './core/updates/recover-migrations';
  17. import { cloneRepo, updateRepo } from './helpers/repo-helpers';
  18. import startJobs from './core/jobs/jobs';
  19. import { getConfig } from './core/config/TipiConfig';
  20. const { clientUrls, rootFolder, appsRepoId, appsRepoUrl } = getConfig();
  21. let corsOptions = {
  22. credentials: true,
  23. origin: function (origin: any, callback: any) {
  24. if (!__prod__) {
  25. return callback(null, true);
  26. }
  27. // disallow requests with no origin
  28. if (!origin) return callback(new Error('Not allowed by CORS'), false);
  29. if (clientUrls.includes(origin)) {
  30. return callback(null, true);
  31. }
  32. const message = "The CORS policy for this origin doesn't allow access from the particular origin.";
  33. return callback(new Error(message), false);
  34. },
  35. };
  36. const main = async () => {
  37. try {
  38. const app = express();
  39. const port = 3001;
  40. app.use(express.static(`${rootFolder}/repos/${appsRepoId}`));
  41. app.use(cors(corsOptions));
  42. app.use(getSessionMiddleware());
  43. await datasource.initialize();
  44. const schema = await createSchema();
  45. const httpServer = createServer(app);
  46. const plugins = [ApolloLogs];
  47. if (!__prod__) {
  48. plugins.push(Playground({ settings: { 'request.credentials': 'include' } }));
  49. }
  50. const apolloServer = new ApolloServer({
  51. schema,
  52. context: ({ req, res }): MyContext => ({ req, res }),
  53. plugins,
  54. });
  55. await apolloServer.start();
  56. apolloServer.applyMiddleware({ app, cors: corsOptions });
  57. try {
  58. await datasource.runMigrations();
  59. } catch (e) {
  60. logger.error(e);
  61. await recover();
  62. }
  63. // Run migrations
  64. await runUpdates();
  65. httpServer.listen(port, async () => {
  66. await cloneRepo(appsRepoUrl);
  67. await updateRepo(appsRepoId);
  68. startJobs();
  69. // Start apps
  70. appsService.startAllApps();
  71. console.info(`Server running on port ${port} 🚀 Production => ${__prod__}`);
  72. });
  73. } catch (error) {
  74. console.log(error);
  75. logger.error(error);
  76. }
  77. };
  78. main();