diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c3ba659f..cc715bfb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -926,6 +926,7 @@ importers: react-admin: ^4.6.3 react-dom: ^18.2.0 react-router-dom: ^6.5.0 + tailchat-server-sdk: workspace:^0.0.14 ts-node: ^10.9.1 typescript: ^4.8.4 dependencies: @@ -951,6 +952,7 @@ importers: react-admin: 4.6.3_ib3m5ricvtkl2cll7qpr2f6lvq react-dom: 18.2.0_react@18.2.0 react-router-dom: 6.5.0_biqbaboplfbrettd7655fr4n2y + tailchat-server-sdk: link:../packages/sdk ts-node: 10.9.1_typescript@4.9.4 devDependencies: '@remix-run/dev': 1.9.0_biqbaboplfbrettd7655fr4n2y diff --git a/server/admin/app/ra/dashboard/CardWithIcon.tsx b/server/admin/app/ra/dashboard/CardWithIcon.tsx index 752f1e07..1d247259 100644 --- a/server/admin/app/ra/dashboard/CardWithIcon.tsx +++ b/server/admin/app/ra/dashboard/CardWithIcon.tsx @@ -56,7 +56,7 @@ const CardWithIcon = (props: Props) => { {title} - {subtitle || } + {subtitle ?? } diff --git a/server/admin/app/ra/resources/file.tsx b/server/admin/app/ra/resources/file.tsx index 3a2f143d..b414d9a8 100644 --- a/server/admin/app/ra/resources/file.tsx +++ b/server/admin/app/ra/resources/file.tsx @@ -3,7 +3,6 @@ import { Datagrid, DateField, List, - NumberField, ReferenceField, TextField, UrlField, diff --git a/server/admin/app/server/broker.ts b/server/admin/app/server/broker.ts new file mode 100644 index 00000000..82c2bc98 --- /dev/null +++ b/server/admin/app/server/broker.ts @@ -0,0 +1,14 @@ +import { TcBroker } from 'tailchat-server-sdk'; +import brokerConfig from '../../../moleculer.config'; + +const transporter = process.env.TRANSPORTER; +export const broker = new TcBroker({ + ...brokerConfig, + metrics: false, + logger: false, + transporter, +}); + +broker.start().then(() => { + console.log('已链接上Tailchat网络, TRANSPORTER: ', transporter); +}); diff --git a/server/admin/app/server/index.ts b/server/admin/app/server/index.ts index 631ff7a7..99446efd 100644 --- a/server/admin/app/server/index.ts +++ b/server/admin/app/server/index.ts @@ -5,7 +5,7 @@ import morgan from 'morgan'; import { createRequestHandler } from '@remix-run/express'; import mongoose from 'mongoose'; import bodyParser from 'body-parser'; -import { router } from './api'; +import { apiRouter } from './router/api'; // 链接数据库 mongoose.connect(process.env.MONGO_URL!, (error: any) => { @@ -37,7 +37,7 @@ app.use(express.static('public', { maxAge: '1h' })); app.use(morgan('tiny')); -app.use('/admin/api', router); +app.use('/admin/api', apiRouter); app.all( '/admin/*', @@ -56,7 +56,7 @@ app.all( }) ); -const port = process.env.PORT || 3000; +const port = process.env.ADMIN_PORT || 3000; app.listen(port, () => { console.log( diff --git a/server/admin/app/server/api.ts b/server/admin/app/server/router/api.ts similarity index 67% rename from server/admin/app/server/api.ts rename to server/admin/app/server/router/api.ts index 7b3ed00a..27aaf7d7 100644 --- a/server/admin/app/server/api.ts +++ b/server/admin/app/server/router/api.ts @@ -1,7 +1,8 @@ import { Router } from 'express'; import raExpressMongoose from 'express-mongoose-ra-json-server'; import jwt from 'jsonwebtoken'; -import { adminAuth, auth, authSecret } from './middleware'; +import { adminAuth, auth, authSecret } from '../middleware'; +import { networkRouter } from './network'; const router = Router(); @@ -20,7 +21,10 @@ router.post('/login', (req, res) => { username, platform: 'admin', }, - authSecret + authSecret, + { + expiresIn: '2h', + } ); res.json({ @@ -32,17 +36,19 @@ router.post('/login', (req, res) => { } }); +router.use('/network', networkRouter); + router.use( '/users', auth(), - raExpressMongoose(require('../../../models/user/user').default, { + raExpressMongoose(require('../../../../models/user/user').default, { q: ['nickname', 'email'], }) ); router.use( '/messages', auth(), - raExpressMongoose(require('../../../models/chat/message').default, { + raExpressMongoose(require('../../../../models/chat/message').default, { q: ['content'], allowedRegexFields: ['content'], }) @@ -50,16 +56,16 @@ router.use( router.use( '/groups', auth(), - raExpressMongoose(require('../../../models/group/group').default, { + raExpressMongoose(require('../../../../models/group/group').default, { q: ['name'], }) ); router.use( '/file', auth(), - raExpressMongoose(require('../../../models/file').default, { + raExpressMongoose(require('../../../../models/file').default, { q: ['objectName'], }) ); -export { router }; +export { router as apiRouter }; diff --git a/server/admin/app/server/router/network.ts b/server/admin/app/server/router/network.ts new file mode 100644 index 00000000..aac5ad40 --- /dev/null +++ b/server/admin/app/server/router/network.ts @@ -0,0 +1,37 @@ +/** + * Network 相关接口 + */ + +import { Router } from 'express'; +import { broker } from '../broker'; +import { auth } from '../middleware'; +import _ from 'lodash'; + +const router = Router(); + +router.get('/all', auth(), async (req, res) => { + res.json({ + nodes: Array.from(new Map(broker.registry.nodes.nodes).values()).map( + (item) => + _.pick(item, [ + 'id', + 'available', + 'local', + 'ipList', + 'hostname', + 'cpu', + 'client', + ]) + ), + events: broker.registry.events.events.map((item) => item.name), + services: broker.registry.services.services.map((item) => item.name), + actions: Array.from(new Map(broker.registry.actions.actions).keys()), + }); +}); + +router.get('/ping', auth(), async (req, res) => { + const pong = await broker.ping(); + res.json(pong); +}); + +export { router as networkRouter }; diff --git a/server/admin/package.json b/server/admin/package.json index 1830196d..35750546 100644 --- a/server/admin/package.json +++ b/server/admin/package.json @@ -33,6 +33,7 @@ "react-admin": "^4.6.3", "react-dom": "^18.2.0", "react-router-dom": "^6.5.0", + "tailchat-server-sdk": "workspace:^0.0.14", "ts-node": "^10.9.1" }, "devDependencies": {