Доступ к услуге с работы в Vapor 3

Я очень новичок в 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 ответа

Решение

Я тоже боролся с Ферно.

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

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

Теперь ваш клиент готов к действиям с базой данных, например, публикация действий. Их можно повторять каждый раз, используя ваши собственные задания.

    let inputData = try! client.ferno.overwrite(req: request, appendedPath: ["users/john"], body: yourOwnContentModel)

Для выполнения запланированных задач лучше использовать 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"])
Другие вопросы по тегам