Доступ к услуге с работы в Vapor 3 - PullRequest
0 голосов
/ 19 февраля 2019

Я очень новичок в Vapor и на стороне сервера swift, с опытом работы в iOS-разработке (6 лет разработки приложений).Я пытаюсь создать простой API для управления устройствами, который, помимо прочего, включает в себя «задание» (таймер, как вы хотите его называть), которое проверяет каждый час или около того последний раз, когда устройство «регистрируется».

Для этого я настроил пакет Jobs, однако я изо всех сил пытаюсь выяснить, как получить доступ к службе ( Ferno ), чтобы попасть в мою базу данных Firebase Realtime, чтобы получить информацию о том, когда устройства в последний разВы вошли в систему. Похоже, что в соответствии с документами вам нужен реализатор Container для создания / доступа к Service, но, похоже, не существует какого-либо глобального контейнера, который я мог бы использовать.

СледуетЯ пытаюсь создать свой собственный Request только для доступа к услуге Ferno?Или есть способ, которым я могу получить доступ к глобальному app?

Ниже приведено то, что я имею до сих пор, но то, что я делаю, кажется ужасно неправильным!Наверняка должен быть способ достичь этого?

Jobs.add(interval: (60*30).seconds) { [weak devicesController] in
    devicesController?.checkForNotSeenDevices()
}
func checkForNotSeenDevices() throws {

    let client = try app(.detect()).make(FernoClient.self)
    client.ferno.retrieve(req: ???, queryItems: [], appendedPath: ["devices"])
}

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Для выполнения запланированных задач лучше использовать scheduleRepeatedTask на EventLoop.Например, вы можете назвать это внутри вашего boot.swift:

app.eventLoop.scheduleRepeatedTask(initialDelay: .seconds(0), delay: .minutes(30)) { _ in
    let client = try app.make(FernoClient.self)
    let request = Request(using: app)
    client.ferno.retrieve(req: request, queryItems: [], appendedPath: ["devices"])
}

На самом деле FernoClient().client.retrieve на самом деле не нужно Request, но Worker.К сожалению, библиотека явно указывает Request, поэтому вам нужно обойти это.Вы можете сделать пиар на Ferno и заменить Request на Worker, если я здесь ничего не пропустил.Тогда вы можете просто назвать это так:

client.ferno.retrieve(worker: app, queryItems: [], appendedPath: ["devices"])
0 голосов
/ 20 февраля 2019

Я тоже боролся с Ferno.

Внутри boot.swift используйте глобальное приложение в качестве контейнера для клиента ferno и запроса.

    let client = try! app.make(FernoClient.self)
    let request = Request(using: app)

Теперь ваш клиент готов к действиям с базой данныхПример действий

...