2026-06-18 16:10:40 +08:00

71 lines
2.5 KiB
JavaScript

const express = require("express");
const http = require("http");
const cors = require("cors");
const bodyParser = require("body-parser");
const { loadEnv, getConfig } = require("./src/core/config");
const { success, fail } = require("./src/core/result");
const { handleQuery, queryStandardResource } = require("./src/core/query-controller");
const { handleSync } = require("./src/sync/sync-controller");
const { connectMongo, ensureIndexes, isMongoAvailable, getMongoDisabledReason } = require("./src/mongo");
const { handleYktCustomerHisSync } = require("./src/ykt/customer-his-sync");
const { attachGateway, queryEdgeResource, listEdges } = require("./src/gateway/edge-registry");
const { startEdgeClient } = require("./src/edge/client");
loadEnv();
const app = express();
const config = getConfig();
const server = http.createServer(app);
app.set("trust proxy", true);
app.use(cors());
app.use(bodyParser.json({ limit: "8mb" }));
app.use(bodyParser.urlencoded({ extended: true, limit: "8mb" }));
app.use(bodyParser.text({ type: ["text/*", "application/xml", "*/xml", "application/soap+xml"], limit: "8mb" }));
app.get("/healthz", (req, res) => {
res.json(
success({
data: {
service: "hospital-adapter-service",
status: "ok",
role: config.role,
mongo: isMongoAvailable() ? "connected" : "disabled",
mongoMessage: isMongoAvailable() ? "" : getMongoDisabledReason(),
edges: config.role === "gateway" ? listEdges() : undefined,
},
})
);
});
app.post("/api/ykt/customerHisSync", async (req, res) => {
const queryResource =
config.role === "gateway"
? queryEdgeResource
: ({ hospitalCode, resource, query }) => queryStandardResource({ hospitalCode, resource, query, saveSnapshot: false }).then((result) => ({ status: "success", message: "查询成功", ...result }));
return handleYktCustomerHisSync(req, res, { queryResource });
});
app.post("/api/his/query", handleQuery);
app.post("/api/:hospitalCode/:resource/query", handleQuery);
app.post("/api/his/sync", handleSync);
app.use((req, res) => {
res.status(404).json(fail("接口不存在", "NOT_FOUND"));
});
async function start() {
await connectMongo();
await ensureIndexes();
if (config.role === "gateway") attachGateway(server);
server.listen(config.port, "0.0.0.0", () => {
console.log(`[hospital-adapter-service] ${config.role} listening on :${config.port}`);
if (config.role === "edge") startEdgeClient();
});
}
start().catch((err) => {
console.error("[hospital-adapter-service] start failed", err);
process.exit(1);
});