Loopback - как получить идентификатор пользователя и вставить в родственную модель? (имеет много) - PullRequest
0 голосов
/ 26 июня 2018

Что я пытаюсь выяснить, это как получить идентификатор текущего аутентифицированного пользователя и использовать его при создании записей в БД в качестве внешнего ключа другой модели?

Чтобы быть более точным, мне нужно получить идентификатор текущего аутентифицированного пользователя (модель: CommonUser) и использовать этот идентификатор в качестве FK при создании нового события.

Отношения:

Я создал модель на основе модели пользователя с именем CommonUser. Обычный пользователь имеет много событий. Событие принадлежит обычному пользователю.

Итак, у Event есть внешний ключ с именем commonUserId.

Как получить идентификатор пользователя и использовать его при вставке?

Я бы подумал, что это будет автоматически как часть процесса, если речь идет об установлении отношений? Это неправильно?

Также, чтобы усложнить ситуацию, у меня есть таблица поиска событий (я буду беспокоиться об этом дальше, поэтому не чувствую себя обязанным погружаться вглубь), потому что у события также есть AndBelongsToMany через Event Lookup.

Пользователь

{
  "name": "CommonUser",
  "base": "User",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {},
  "validations": [],
  "relations": {
    "events": {
      "type": "hasMany",
      "model": "Event",
      "foreignKey": "eventId",
      "through": "EventLookUp"
    },
    "friends": {
      "type": "hasMany",
      "model": "CommonUser",
      "through": "Friend",
      "foreignKey": "friendId"
    }
  },
  "acls": [],
  "methods": {}
}

User

Событие

{
  "name": "Event",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "name": {
      "type": "string"
    },
    "radius": {
      "type": "number",
      "default": 50
    },
    "status": {
      "type": "number"
    },
    "location": {
      "type": "geopoint",
      "required": true
    }
  },
  "validations": [],
  "relations": {
    "owner": {
      "type": "belongsTo",
      "model": "CommonUser",
      "foreignKey": "commonUserId"
    },
    "commonUsers": {
      "type": "hasAndBelongsToMany",
      "model": "CommonUser",
      "foreignKey": "ownerId",
      "through": "EventLookUp"
    },
    "galleries": {
      "type": "hasOne",
      "model": "Gallery",
      "foreignKey": ""
    },
    "photos": {
      "type": "hasMany",
      "model": "Photo",
      "foreignKey": "",
      "through": "Gallery"
    }
  },
  "acls": [],
  "methods": {}
}

Event

Поиск событий

{
  "name": "EventLookUp",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {},
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": {}
}

Event LookUp

Если бы меня указывали в правильном направлении, это было бы фантастически. Трудно найти ответ, прочитав документацию. Я думаю, что мне нужно использовать ловушку операции перед вставкой и установить свойства моделей событий? Каков наилучший метод обратной связи в этом отношении?

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

В loopback swagger, когда вы входите в систему как пользователь с использованием loopback по умолчанию users / login api, вы получаете объект токена доступа в качестве ответа. Вы можете скопировать идентификатор токена доступа и вставить в поле в правом верхнем углу в swagger и установить токен доступа. Таким образом, внутри вашего accesstoken установлен loopback, и для каждого вашего запроса от swagger loopback добавляет токен доступа вместе с запросом. Таким образом вы можете получить токен доступа из ctx (context) в удаленных методах.

Для создания findOrCreate сохраните событие obj:

Event.observe('before save', function updateUserId(ctx, next) {

  let userId = ctx.options.accessToken.userId;`

  if (ctx.instance) {
    ctx.instance.commonUserId = userId;
  }
  next();
});

Для updateAttributes для события obj:

Event.observe('before save', function updateUserId(ctx, next) { 

  let userId = ctx.options.accessToken.userId; 

  if (ctx.currentInstance) { 
    ctx.currentInstance.commonUserId = userId;
  } 
  next(); 
});
0 голосов
/ 26 июня 2018

Я нашел решение, но не уверен, что это лучшая практика или есть лучший способ справиться с этим.

В любом случае я создал Хук Операции внутри "/common/models/event.js", и, очевидно, вы можете получить доступ к контексту внутри этого хука.

Если есть лучший способ сделать это, я хотел бы знать.

'use strict';
module.exports = function (Event) {


    Event.observe('before save', function updateForeignKeyCommonUserId(ctx, next) {

        // console.log(ctx.options);
        /* WHAT Options Looks Like */
        // { accessToken:
        // { id: 'Z20R1RsnumWEdDzR3TyCCbmZ0DTp4tOh2cviU6JGsrlNIYCs3KchQ7mdAnhTc1VQ',
        //     ttl: 1209600,
        //     created: 2018-06-26T17:41:28.298Z,
        //     userId: 3 },
        // authorizedRoles: {} }
        // console.log("THE USER ID IS: ");
        // console.log(ctx.options.accessToken.userId); // Current User Id

        var userId = ctx.options.accessToken.userId;

        // So appearently "the context provides either an instance property or a pair of data and where properties"
       // @todo: find out why there can be a 'instance' or 'data'. 
        if (ctx.instance) {
            ctx.instance.commonUserId = userId; // instance
        } else {
            ctx.data.commonUserId = userId; // data
        }
        next();
    });

};

Если бы кто-то не возражал объяснить, откуда берется контекст и как он заполняется, это было бы здорово!

...