Придерживаясь архитектуре Controller -> Service -> Model, то куда лучше вынести функций с запросами на удаленную бд?

Я использую ORM sequelize для работы с моей локальной БД. В результате получается такая архитектура:

/controllers/user.controller.js // Работа с http
/services/user.service.js // Бизнес логика
/models/User.js // sequelize schema

Для работы с удаленной БД мне нужно выполнять http запросы на другой сервер такая логика подходит для Service или все таки выписать как Model?
Запрос выполняется через axios:

$api.get(`/user/${userId}`).then((res) => res.data);

Код:
controller:

exports.controller = async (req, res, next) {
  try {
  const {userId} = req.user;
  const data = await service.getInfo(userId);
  return res.status(200).json(data);
  } catch(e) {
     next(e);
  }
}

service:

exports.getInfo = async (userId) => {
  const candidate = await UserModel.findOne({where: {userId}});
  if (!candidate) throw ApiError.notFound('Пользователь не найден');

  // Этот код оставить здесь или вынести в model.js ?
  const userData = await $api.get(`/user/${userId}`).then((res) => res.data);
  // =====
  const {status, data, message} = userData;
  if (!status) throw ApiError.internal(message);

  return data;
}

model:

exports.User =  sequelize.define(
    'users', {...});

// Может стоит сюда вынести функцию?
exports.getUserInfo = (userId) =>
    $api.get(`/user/${userId}`).then((res) => res.data);

Я понимаю, что бизнес логика должная находится в Service, но что если удаленная Api сменит url или добавит параметры, заголовки, сменит метод запроса? Проще будет зайти в model.js и подправить функцию вместо того чтобы в service копаться? Как вы считаете?


Ответы (1 шт):

Автор решения: Roman Konoval

Правильно будет вынести эту логику в отдельный модуль. Он знает и куда делать запрос и как его преобразовать если нужно и т.д. А выставляет он интерфейс, с помощью которого можно получить уже объект в терминах нашей бизнес-логики (т.е. User):

api.js:

exports.getUserInfo = async (userId) => {
   res = await $api.get(`/user/${userId}`);
   return res.data;
}

service.js:

exports.getInfo = async (userId) => {
  ...
  const user = await api.getUserInfo(userId);
  ...
  
  return data;
}
→ Ссылка