Как внедрить / настроить пользовательскую модель для установки отношений в компоненте loopback 4? - PullRequest
0 голосов
/ 01 мая 2020

Согласно 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. К сожалению, текущие примеры в основном отражают приложения, а не компоненты.

1 Ответ

0 голосов
/ 01 мая 2020

Вы пробовали новый компонент аутентификации? https://loopback.io/doc/en/lb4/Loopback-component-authentication.html

Имеет привязку, которая спасает аутентифицированного пользователя конечной точки. Просто введите пользователя в конструктор контроллера (я не уверен, работает ли его внедрение в конечной точке) вверху):

import {inject} from '@loopback/context';
import {AuthenticationBindings, authenticate} from '@loopback/authentication';
import {SecurityBindings, securityId, UserProfile} from '@loopback/security';
import {get} from '@loopback/rest';

export class WhoAmIController {
  constructor(
    // `AuthenticationBindings.CURRENT_USER` is now an alias of
    // `SecurityBindings.USER` in @loopback/security
    @inject(SecurityBindings.USER)
    private userProfile: UserProfile,
  ) {}

  @authenticate('basic')
  @get('/whoami')
  whoAmI(): string {
    // `securityId` is Symbol to represent the security id of the user,
    // typically the user id. You can find more information of `securityId` in
    // https://loopback.io/doc/en/lb4/Security
    return this.userProfile[securityId];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...