Skip to content

Commit

Permalink
Show user info (#40)
Browse files Browse the repository at this point in the history
  • Loading branch information
mmvpm committed May 9, 2024
1 parent 2eeee7c commit 6d99ee7
Show file tree
Hide file tree
Showing 8 changed files with 74 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import cats.data.EitherT
import com.github.mmvpm.bot.client.ofs.error.OfsClientError
import com.github.mmvpm.bot.client.ofs.response._
import com.github.mmvpm.bot.model.{OfferPatch, TgPhoto}
import com.github.mmvpm.model.{OfferDescription, OfferID, Session}
import com.github.mmvpm.model.{OfferDescription, OfferID, Session, UserID}

trait OfsClient[F[_]] {

Expand All @@ -21,4 +21,6 @@ trait OfsClient[F[_]] {
def deleteOffer(session: Session, offerId: OfferID): EitherT[F, OfsClientError, OkResponse]
def addPhotos(session: Session, offerId: OfferID, photos: Seq[TgPhoto]): EitherT[F, OfsClientError, OfferResponse]
def deleteAllPhotos(session: Session, offerId: OfferID): EitherT[F, OfsClientError, OkResponse]

def getUser(userId: UserID): EitherT[F, OfsClientError, UserResponse]
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import com.github.mmvpm.bot.client.ofs.request._
import com.github.mmvpm.bot.client.ofs.response._
import com.github.mmvpm.bot.client.ofs.util.CirceInstances._
import com.github.mmvpm.bot.model.{OfferPatch, TgPhoto}
import com.github.mmvpm.model.{OfferDescription, OfferID, Session}
import com.github.mmvpm.model.{OfferDescription, OfferID, Session, UserID}
import io.circe.Error
import io.circe.generic.auto._
import sttp.client3._
Expand Down Expand Up @@ -207,6 +207,20 @@ class OfsClientSttp[F[_]: MonadThrow](ofsConfig: OfsConfig, sttpBackend: SttpBac
EitherT(response)
}

def getUser(userId: UserID): EitherT[F, OfsClientError, UserResponse] = {
val requestUri = uri"${ofsConfig.baseUrl}/api/v1/user/$userId"

val response = basicRequest
.get(requestUri)
.response(asJsonEither[OfsApiClientError, UserResponse])
.readTimeout(ofsConfig.requestTimeout)
.send(sttpBackend)
.map(_.body.leftMap(parseFailure))
.recover(error => Left(OfsUnknownClientError(error.getMessage)))

EitherT(response)
}

// internal

private def parseFailure: ResponseException[OfsApiClientError, Error] => OfsClientError = {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.github.mmvpm.bot.client.ofs.response

import com.github.mmvpm.model.User

case class UserResponse(user: User)
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ import com.bot4s.telegram.models.Message
import com.github.mmvpm.bot.client.ofs.response.OfsOffer
import com.github.mmvpm.bot.manager.ofs.error.OfsError
import com.github.mmvpm.bot.manager.ofs.response.LoginOrRegisterResponse
import com.github.mmvpm.bot.model.{OfferPatch, TgPhoto}
import com.github.mmvpm.model.{Offer, OfferDescription, OfferID}
import com.github.mmvpm.bot.model.{FullOffer, OfferPatch, TgPhoto}
import com.github.mmvpm.model.{Offer, OfferDescription, OfferID, User, UserID}

trait OfsManager[F[_]] {
def login(implicit message: Message): EitherT[F, OfsError, LoginOrRegisterResponse.LoggedIn]
def loginOrRegister(implicit message: Message): EitherT[F, OfsError, LoginOrRegisterResponse]

def search(query: String): EitherT[F, OfsError, List[Offer]]
def search(query: String): EitherT[F, OfsError, List[FullOffer]]
def getOffer(offerId: OfferID): EitherT[F, OfsError, Option[Offer]]
def getOffers(offerIds: Seq[OfferID]): EitherT[F, OfsError, List[Offer]]
def getMyOffers(implicit message: Message): EitherT[F, OfsError, List[Offer]]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ import com.github.mmvpm.bot.manager.ofs.error.OfsError
import com.github.mmvpm.bot.manager.ofs.error.OfsError._
import com.github.mmvpm.bot.manager.ofs.response.LoginOrRegisterResponse
import com.github.mmvpm.bot.manager.ofs.response.LoginOrRegisterResponse._
import com.github.mmvpm.bot.model.{OfferPatch, TgPhoto}
import com.github.mmvpm.bot.model.{FullOffer, OfferPatch, TgPhoto}
import com.github.mmvpm.bot.state.Storage
import com.github.mmvpm.model._
import sttp.model.StatusCode

import java.util.UUID

class OfsManagerImpl[F[_]: Monad](ofsClient: OfsClient[F], sessionStorage: Storage[Option[Session]], random: Random[F])
extends OfsManager[F] {

Expand All @@ -36,11 +38,18 @@ class OfsManagerImpl[F[_]: Monad](ofsClient: OfsClient[F], sessionStorage: Stora
case Some(session) => checkSession(session).as(LoggedIn(getName))
}

def search(query: String): EitherT[F, OfsError, List[Offer]] =
def search(query: String): EitherT[F, OfsError, List[FullOffer]] =
(for {
offerIds <- ofsClient.search(query).map(_.offerIds)
offers <- ofsClient.getOffers(offerIds).map(_.offers)
} yield offers).handleDefaultErrors
fullOffers <- offers.traverse { offer =>
if (offer.source.isEmpty) {
ofsClient.getUser(offer.userId).map(u => FullOffer(offer, u.user))
} else {
EitherT.pure[F, OfsClientError](FullOffer(offer, ParsedUser))
}
}
} yield fullOffers).handleDefaultErrors

def getOffer(offerId: OfferID): EitherT[F, OfsError, Option[Offer]] =
ofsClient
Expand Down Expand Up @@ -168,6 +177,13 @@ object OfsManagerImpl {

private val PasswordLength = 10

private val ParsedUser = User(
id = UUID.fromString("3fa85f64-5717-4562-b3fc-2c963f66afa6"),
name = "Parsed from youla.ru",
login = "@parsed",
status = UserStatus.Active
)

implicit class RichClientResponse[F[_]: Functor, R](response: EitherT[F, OfsClientError, R]) {
def handleDefaultErrors: EitherT[F, OfsError, R] =
response.leftMap {
Expand Down
5 changes: 5 additions & 0 deletions bot/src/main/scala/com/github/mmvpm/bot/model/FullOffer.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.github.mmvpm.bot.model

import com.github.mmvpm.model.{Offer, User}

case class FullOffer(offer: Offer, user: User)
37 changes: 23 additions & 14 deletions bot/src/main/scala/com/github/mmvpm/bot/state/State.scala
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.github.mmvpm.bot.state

import com.github.mmvpm.bot.model.{Button, Draft, Tag, TgPhoto}
import com.github.mmvpm.bot.model.{Button, Draft, FullOffer, Tag, TgPhoto}
import com.github.mmvpm.bot.util.PriceUtils.priceText
import com.github.mmvpm.model.{Offer, OfferID, OfferStatus}
import com.github.mmvpm.model.{Offer, OfferID, OfferStatus, User}

import scala.util.matching.Regex

Expand Down Expand Up @@ -144,7 +144,10 @@ object State {
val text: String = "Введите поисковый запрос"
}

case class Listing(previous: State, offers: Seq[Offer], from: Int) extends State with WithPrevious with WithPhotos {
case class Listing(previous: State, offers: Seq[FullOffer], from: Int)
extends State
with WithPrevious
with WithPhotos {

import Listing._

Expand All @@ -170,9 +173,9 @@ object State {
val photos: Seq[TgPhoto] =
offers
.slice(from, from + StepSizeCropped)
.map(offer => TgPhoto.first(offer.photos))
.map(offer => TgPhoto.first(offer.offer.photos))

def get(idx: Int): Offer =
def get(idx: Int): FullOffer =
offers.drop(from + idx).head

private lazy val nextPageTag =
Expand All @@ -189,7 +192,7 @@ object State {
.slice(from, from + StepSizeCropped)
.zipWithIndex
.map { case (offer, idx) =>
s"${idx + 1}. ${offer.description.name} (${priceText(offer.description.price)})"
s"${idx + 1}. ${offer.offer.description.name} (${priceText(offer.offer.description.price)})"
}
.mkString("\n\n")
}
Expand All @@ -200,27 +203,33 @@ object State {

val chooseOne: Regex = s"$ListingTag-(\\d*)".r

def start(previous: State, offers: Seq[Offer]): Listing =
Listing(previous: State, offers: Seq[Offer], from = 0)
def start(previous: State, offers: Seq[FullOffer]): Listing =
Listing(previous, offers, from = 0)
}

case class OneOffer(previous: State, offer: Offer) extends State with WithPrevious with WithPhotos {
case class OneOffer(previous: State, offer: FullOffer) extends State with WithPrevious with WithPhotos {
val tag: Tag = OneOfferTag
val next: Seq[Seq[Tag]] = Seq(Seq(BackTag))

val text: String =
s"""
|${offer.description.name}
|${offer.offer.description.name}
|
|Цена: ${priceText(offer.description.price)}
|Цена: ${priceText(offer.offer.description.price)}
|
|${offer.description.text}
|${offer.offer.description.text}
|
|Источник: ${offer.source.getOrElse("Размещено через telegram-bot")}
|$source
|""".stripMargin

val photos: Seq[TgPhoto] =
offer.photos.take(5).map(TgPhoto.from)
offer.offer.photos.take(5).map(TgPhoto.from)

private lazy val source =
offer.offer.source match {
case Some(source) => s"Источник: $source"
case None => s"Продавец: ${offer.user.name} (@${offer.user.login})"
}
}

// create offer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class StateManagerImpl[F[_]: MonadCancelThrow](ofsManager: OfsManager[F]) extend
case Listing(_, offers, _) => Some(offers)
case _ => None
}
offer <- offers.find(_.id.toString == offerId)
offer <- offers.find(_.offer.id.toString == offerId)
} yield OneOffer(current, offer)

newState.getOrElse(Error(current, "К сожалению, такого id не существует! Попробуйте ещё раз")).pure
Expand Down

0 comments on commit 6d99ee7

Please sign in to comment.