tachybase_todo/packages/app/src/api/index.ts

151 lines
4.5 KiB
TypeScript
Raw Normal View History

import Api from '../../../server/src';
import dotenv from 'dotenv';
import path from 'path';
import actions from '../../../actions/src';
import associated from '../../../actions/src/middlewares/associated';
2020-12-12 16:36:02 +08:00
import { Op } from 'sequelize';
const sync = {
force: false,
alter: {
drop: false,
},
};
2020-12-15 09:58:42 +08:00
console.log('process.env.NOCOBASE_ENV', process.env.NOCOBASE_ENV);
dotenv.config();
const api = Api.create({
database: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: process.env.DB_DIALECT,
dialectOptions: {
charset: 'utf8mb4',
collate: 'utf8mb4_unicode_ci',
},
logging: false,
define: {},
sync,
},
resourcer: {
prefix: '/api',
},
});
2020-12-25 16:15:58 +08:00
api.resourcer.use(associated);
api.resourcer.registerActionHandlers({...actions.common, ...actions.associate});
2020-12-18 15:33:34 +08:00
api.resourcer.use(async (ctx: actions.Context, next) => {
const token = ctx.get('Authorization').replace(/^Bearer\s+/gi, '');
// console.log('user check', ctx.action.params.actionName);
// const { actionName } = ctx.action.params;
if (!token) {
return next();
}
const User = ctx.db.getModel('users');
const user = await User.findOne({
where: {
token,
},
});
if (!user) {
return next();
}
ctx.state.currentUser = user;
// console.log('ctx.state.currentUser', ctx.state.currentUser);
await next();
});
2020-12-15 09:58:42 +08:00
api.resourcer.use(async (ctx: actions.Context, next) => {
const { actionName, resourceField, resourceName, fields = {} } = ctx.action.params;
2020-12-25 16:15:58 +08:00
const table = ctx.db.getTable(resourceField ? resourceField.options.target : resourceName);
2020-12-12 16:36:02 +08:00
// ctx.state.developerMode = {[Op.not]: null};
2020-12-08 14:33:28 +08:00
ctx.state.developerMode = false;
2020-12-12 16:36:02 +08:00
if (table && table.hasField('developerMode') && ctx.state.developerMode === false) {
2020-12-08 14:33:28 +08:00
ctx.action.setParam('filter.developerMode', ctx.state.developerMode);
2020-12-08 10:02:41 +08:00
}
if (table && ['get', 'list'].includes(actionName)) {
const except = fields.except || [];
2021-01-07 09:31:26 +08:00
// const appends = fields.appends || [];
2020-12-15 09:58:42 +08:00
for (const [name, field] of table.getFields()) {
if (field.options.hidden) {
except.push(field.options.name);
}
2021-01-07 09:31:26 +08:00
// if (field.options.appends) {
// appends.push(field.options.name);
// }
2020-12-15 09:58:42 +08:00
}
if (except.length) {
ctx.action.setParam('fields.except', except);
}
2021-01-07 09:31:26 +08:00
// if (appends.length) {
// ctx.action.setParam('fields.appends', appends);
// }
2021-01-04 20:53:30 +08:00
// console.log('ctx.action.params.fields', ctx.action.params.fields, except, appends);
2020-12-15 09:58:42 +08:00
}
2020-12-08 10:02:41 +08:00
await next();
});
2020-12-15 14:32:56 +08:00
2020-12-31 21:04:03 +08:00
// api.resourcer.use(async (ctx: actions.Context, next) => {
// const { resourceField, resourceName, viewName, filter } = ctx.action.params;
// // TODO: 需要补充默认视图的情况
// let view: any;
// if (viewName) {
// view = await ctx.db.getModel('views').findOne({
// where: {
// collection_name: resourceField ? resourceField.options.target : resourceName,
// name: viewName,
// }
// });
// const viewFilter = view.get('filter');
// if (viewFilter) {
// const args = [viewFilter, filter].filter(Boolean);
// ctx.action.setParam('filter', {and: args});
// console.log(ctx.action.params.filter);
// }
// }
// await next();
// });
2020-12-18 19:54:53 +08:00
api.registerPlugin('plugin-collections', [path.resolve(__dirname, '../../../plugin-collections'), {}]);
api.registerPlugin('plugin-pages', [path.resolve(__dirname, '../../../plugin-pages'), {}]);
api.registerPlugin('plugin-users', [path.resolve(__dirname, '../../../plugin-users'), {}]);
api.registerPlugin('plugin-file-manager', [path.resolve(__dirname, '../../../plugin-file-manager'), {}]);
2020-12-08 10:02:41 +08:00
2020-12-18 19:54:53 +08:00
(async () => {
await api.loadPlugins();
2021-01-07 09:31:26 +08:00
api.database.getModel('users').addHook('beforeUpdate', function (model) {
console.log('users.beforeUpdate', model.get(), model.changed('password' as any));
});
api.resourcer.use(async (ctx, next) => {
if (process.env.NOCOBASE_ENV !== 'demo') {
return next();
}
const currentUser = ctx.state.currentUser;
if (currentUser && currentUser.username === 'admin') {
return next();
}
const { actionName } = ctx.action.params;
if (['create', 'update', 'destroy'].includes(actionName)) {
ctx.body = {
data: {},
meta: {},
};
return;
}
await next();
});
2020-12-31 21:04:03 +08:00
await api.database.getModel('collections').load({skipExisting: true});
api.listen(process.env.HTTP_PORT, () => {
console.log(`http://localhost:${process.env.HTTP_PORT}/`);
});
})();