Open Kirill5k opened 1 year ago
import cs.dispatch.config
import cs.dispatch.config.{AppConfig, ConfigError}
import zio.http.Response
import zio.{IO, URLayer, ZIO, ZLayer}
enum CallType:
case CreditCards, Cards
trait UpstreamImitatorService {
def cardImitator(callType: CallType): IO[ConfigError, String]
}
final private case class UpstreamImitatorServiceImpl(
appConfig: AppConfig
) extends UpstreamImitatorService {
def cardImitator(callType: CallType): IO[ConfigError, String] = {
appConfig.upstreamResponse.callTypes.find(_.callType.equals(callType.toString.toLowerCase())) match {
case Some(config) => ZIO.succeed(config.response.stripMargin)
case _ =>
ZIO.logError("Service failed due missing config") *>
ZIO.fail(new ConfigError("Config for this call type not exists"))
}
}
}
object UpstreamImitatorService {
lazy val live: URLayer[AppConfig, UpstreamImitatorService] =
ZLayer.fromZIO {
ZIO.service[AppConfig].map(UpstreamImitatorServiceImpl.apply)
}
}
Тут метод не должен требовать никаких енвайронментс:
https://github.com/rcerka01/cs23/blob/17b25627ead159fa5b0a312249098477f25ad2d2/src/main/scala/cs/dispatch/services/UpstreamImitatorService.scala#L11-L13
В целом, у тебя проблема с лейерами. Ты когде лейер декларируешь для того, чтобы создать компонент, то тебе надо там сразу же все необходимые компоненты доставать
Ты этот конфиг должен достать еще в самом лейере тут: https://github.com/rcerka01/cs23/blob/17b25627ead159fa5b0a312249098477f25ad2d2/src/main/scala/cs/dispatch/services/UpstreamImitatorService.scala#L28-L31
кстати, сам лейер может сделать как вал.
Я бы создал отдельный класс (апстреам серсив клиент), который бы отвечал за остылку запросов к этому сервису и обработке ответов. RecommendationService не должен таким занимаьтся: https://github.com/rcerka01/cs23/blob/17b25627ead159fa5b0a312249098477f25ad2d2/src/main/scala/cs/dispatch/services/RecommendationService.scala#L26-L32
вообще, если у тебя много времени и тебе нечего делать, то раздели этот проэкт на 2 модуля: рекоммендатионс и апстрим