2019-10-01 18:25:22 +08:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const { Router: router } = require('express');
|
|
|
|
|
2019-10-04 00:24:39 +08:00
|
|
|
const SqlRouter = require('./sql/sql-router');
|
2019-10-02 22:02:13 +08:00
|
|
|
|
2019-10-04 00:24:39 +08:00
|
|
|
const HealthCheckController = require('./health-check-controller');
|
|
|
|
const VersionController = require('./version-controller');
|
|
|
|
const JobsWipController = require('./jobs-wip-controller');
|
2019-11-12 17:11:05 +08:00
|
|
|
const error = require('./middlewares/error');
|
2020-02-27 00:19:07 +08:00
|
|
|
const pubSubMetrics = require('./middlewares/pubsub-metrics');
|
2019-10-01 18:25:22 +08:00
|
|
|
|
2019-10-04 00:24:39 +08:00
|
|
|
const JobPublisher = require('../batch/pubsub/job-publisher');
|
|
|
|
const JobQueue = require('../batch/job-queue');
|
|
|
|
const JobBackend = require('../batch/job-backend');
|
|
|
|
const JobCanceller = require('../batch/job-canceller');
|
|
|
|
const JobService = require('../batch/job-service');
|
2020-02-27 00:19:07 +08:00
|
|
|
const PubSubMetricsService = require('../services/pubsub-metrics');
|
2019-10-01 18:25:22 +08:00
|
|
|
|
|
|
|
module.exports = class ApiRouter {
|
2020-06-30 23:42:59 +08:00
|
|
|
constructor ({ redisPool, metadataBackend, statsClient, logger }) {
|
2019-10-01 18:25:22 +08:00
|
|
|
const jobPublisher = new JobPublisher(redisPool);
|
|
|
|
const jobQueue = new JobQueue(metadataBackend, jobPublisher, logger);
|
|
|
|
const jobBackend = new JobBackend(metadataBackend, jobQueue, logger);
|
|
|
|
const jobCanceller = new JobCanceller();
|
|
|
|
const jobService = new JobService(jobBackend, jobCanceller, logger);
|
|
|
|
|
2019-10-02 22:02:13 +08:00
|
|
|
this.healthCheckController = new HealthCheckController();
|
|
|
|
this.versionController = new VersionController();
|
|
|
|
this.jobsWipController = new JobsWipController({ jobService });
|
2020-02-27 00:19:07 +08:00
|
|
|
this.pubSubMetricsService = PubSubMetricsService.build();
|
2019-10-02 22:02:13 +08:00
|
|
|
|
|
|
|
this.sqlRouter = new SqlRouter({
|
2019-10-01 18:25:22 +08:00
|
|
|
metadataBackend,
|
|
|
|
statsClient,
|
2020-06-30 23:42:59 +08:00
|
|
|
logger,
|
2019-10-02 22:02:13 +08:00
|
|
|
jobService
|
|
|
|
});
|
2019-10-01 18:25:22 +08:00
|
|
|
}
|
|
|
|
|
2019-10-02 22:02:13 +08:00
|
|
|
route (app, routes) {
|
|
|
|
routes.forEach(route => {
|
2019-10-02 18:10:25 +08:00
|
|
|
const apiRouter = router({ mergeParams: true });
|
2019-10-01 23:27:46 +08:00
|
|
|
|
2019-10-02 18:10:25 +08:00
|
|
|
const paths = route.paths;
|
|
|
|
const middlewares = route.middlewares || [];
|
2019-10-01 18:25:22 +08:00
|
|
|
|
2019-10-02 18:10:25 +08:00
|
|
|
middlewares.forEach(middleware => apiRouter.use(middleware()));
|
2019-10-01 18:57:03 +08:00
|
|
|
|
2020-02-27 00:19:07 +08:00
|
|
|
// FIXME: version controller should be attached to the main entry point: "/"
|
2019-10-02 22:02:13 +08:00
|
|
|
// instead of "/api/:version" or "/user/:user/api/:version"
|
|
|
|
this.healthCheckController.route(apiRouter);
|
|
|
|
|
2020-02-27 00:19:07 +08:00
|
|
|
// FIXME: version controller should be attached to the main entry point: "/"
|
2019-10-02 22:02:13 +08:00
|
|
|
// instead of "/api/:version" or "/user/:user/api/:version"
|
|
|
|
this.versionController.route(apiRouter);
|
|
|
|
|
|
|
|
this.jobsWipController.route(apiRouter);
|
2019-10-01 18:25:22 +08:00
|
|
|
|
2019-10-02 22:02:13 +08:00
|
|
|
this.sqlRouter.route(apiRouter, route.sql);
|
2019-10-02 18:10:25 +08:00
|
|
|
|
|
|
|
paths.forEach(path => app.use(path, apiRouter));
|
2019-11-12 17:11:05 +08:00
|
|
|
|
|
|
|
apiRouter.use(error());
|
2020-02-27 00:19:07 +08:00
|
|
|
apiRouter.use(pubSubMetrics(this.pubSubMetricsService));
|
2019-10-02 18:10:25 +08:00
|
|
|
});
|
2019-10-01 18:25:22 +08:00
|
|
|
}
|
|
|
|
};
|