Согласно DRY, я бы хотел добавить свой бизнес-лог c в расширение (петлевой компонент). Тем не менее, при определении моделей я хотел бы указать отношение ownTo к свойству.
В LB3 я бы сделал то же самое, определив следующий модуль и переопределив его через конфигурацию:
module.exports = (blogModels, options) => {
const debug = require('debug')('component:blog:postlike:model');
const {userModel} = options;
const postLikeModel = blogModels.PostLike;
const postModel = blogModels.Post;
// update relationships
postModel.belongsTo(userModel,
{as: 'userCreated', foreignKey: 'createdBy'});
postModel.belongsTo(userModel,
{as: 'userDeleted', foreignKey: 'deletedBy'});
postModel.belongsTo(postModel,
{as: 'post', foreignKey: 'postId'});
let postLike = {};
return postLike;
};
Кроме того, я хотел бы знать, как я могу позволить разработчику указать модель в случае, если он хочет указать пользовательскую.
В LB3 это будет сделано следующим образом this. https://github.com/pbalan/component-blog/blob/master/lib/models/index.js#L51 -L63
const debug = require('debug')('component:blog');
const accessLogger = require('../middleware/access-logger');
const userContext = require('../middleware/user-context');
const logger = require('../middleware/logging');
const reqLogger = require('../middleware/request-logging');
module.exports = function componentBlog(app, options) {
debug('initializing component');
const {loopback} = app;
options = options || {};
let dataSource = options.dataSource;
/* istanbul ignore if */
if (typeof dataSource === 'string') {
dataSource = app.dataSource[dataSource];
}
const blogModels = require('./component-blog-models')(dataSource);
const userModel = loopback.findModel(options.userModel) ||
loopback.getModelByType(loopback.User);
debug('User model: %s', userModel.modelName);
const venueModel = loopback.findModel(options.venueModel);
// debug('Venue model: %s', venueModel.modelName);
// Initialize middleware
app.middleware('initial:before', logger());
app.middleware('initial:before', reqLogger());
app.middleware('auth:after', userContext());
app.middleware('routes:before', accessLogger());
let users = {};
let venue = {};
let internalConfig = {
userModel: userModel,
venueModel: venueModel,
};
// specific to app
const post = require('./Post')(blogModels, internalConfig);
const postLike = require('./PostLike')(blogModels, internalConfig);
const postMention = require('./PostMention')(blogModels, internalConfig);
const postShare = require('./PostShare')(blogModels, internalConfig);
const postComment = require('./PostComment')(blogModels, internalConfig);
const commentComment =
require('./CommentComment')(blogModels, internalConfig);
const postMedia = require('./PostMedia')(blogModels, internalConfig);
const blogReported = require('./BlogReported')(blogModels, internalConfig);
let customModels = options.models || {};
let models = {
user: customModels.users || users,
venue: customModels.venue || venue,
blogReported: customModels.blogReported || blogReported,
post: customModels.post || post,
postLike: customModels.postLike || postLike,
postMention: customModels.postMention || postMention,
postShare: customModels.postShare || postShare,
postComment: customModels.postComment || postComment,
commentComment: customModels.commentComment || commentComment,
postMedia: customModels.postMedia || postMedia,
};
return models;
};
Затем в загрузочном скрипте мы можем предоставить необходимые переопределения.
https://github.com/pbalan/component-blog/blob/master/test/fixtures/simple-app/server/boot/003-component-blog.js#L7
module.exports = function blog(app) {
var blog = require('../../../../../lib');
var options = {
// custom user model
userModel: 'user', // specify your custom user model
uploadMediaUrl: '/api/containers/blog-media/upload',
baseUrl: 'http://0.0.0.0:3000',
// Data source for metadata persistence
dataSource: app.dataSources.db,
};
app.set('component-blog', options);
blog(app, options);
};
Я ищу аналогичный пример для LB4. К сожалению, текущие примеры в основном отражают приложения, а не компоненты.