Доступ к услуге с работы в 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"])