diff --git a/src/mooc/main/tv/codely/mooc/video/application/search/VideosSearcher.scala b/src/mooc/main/tv/codely/mooc/video/application/search/VideosSearcher.scala index 3b65881..a4d5070 100644 --- a/src/mooc/main/tv/codely/mooc/video/application/search/VideosSearcher.scala +++ b/src/mooc/main/tv/codely/mooc/video/application/search/VideosSearcher.scala @@ -1,9 +1,13 @@ package tv.codely.mooc.video.application.search -import tv.codely.mooc.video.domain.{Video, VideoRepository} +import tv.codely.mooc.video.domain.{Video, VideoId,VideoRepository} import scala.concurrent.Future final class VideosSearcher(repository: VideoRepository) { def all(): Future[Seq[Video]] = repository.all() + + def find(videoId: VideoId): Future[Option[Video]] = { + repository.find(videoId) + } } diff --git a/src/mooc/main/tv/codely/mooc/video/domain/VideoRepository.scala b/src/mooc/main/tv/codely/mooc/video/domain/VideoRepository.scala index d770462..8c15776 100644 --- a/src/mooc/main/tv/codely/mooc/video/domain/VideoRepository.scala +++ b/src/mooc/main/tv/codely/mooc/video/domain/VideoRepository.scala @@ -6,4 +6,6 @@ trait VideoRepository { def all(): Future[Seq[Video]] def save(video: Video): Future[Unit] + + def find(videoId: VideoId): Future[Option[Video]] } diff --git a/src/mooc/main/tv/codely/mooc/video/infrastructure/repository/DoobieMySqlVideoRepository.scala b/src/mooc/main/tv/codely/mooc/video/infrastructure/repository/DoobieMySqlVideoRepository.scala index 0f2dfdd..94b70e5 100644 --- a/src/mooc/main/tv/codely/mooc/video/infrastructure/repository/DoobieMySqlVideoRepository.scala +++ b/src/mooc/main/tv/codely/mooc/video/infrastructure/repository/DoobieMySqlVideoRepository.scala @@ -1,7 +1,7 @@ package tv.codely.mooc.video.infrastructure.repository import doobie.implicits._ -import tv.codely.mooc.video.domain.{Video, VideoRepository} +import tv.codely.mooc.video.domain.{Video, VideoId, VideoRepository} import tv.codely.mooc.shared.infrastructure.doobie.TypesConversions._ import tv.codely.shared.infrastructure.doobie.DoobieDbConnection @@ -17,4 +17,9 @@ final class DoobieMySqlVideoRepository(db: DoobieDbConnection)(implicit executio .transact(db.transactor) .unsafeToFuture() .map(_ => ()) + + override def find(videoId: VideoId): Future[Option[Video]] = + db.read(sql"SELECT video_id, title, duration_in_seconds, category, creator_id FROM videos WHERE video_id=${videoId.value}" + .query[Video] + .option) } diff --git a/src/mooc/test/tv/codely/mooc/video/application/search/VideosSearcherShould.scala b/src/mooc/test/tv/codely/mooc/video/application/search/VideosSearcherShould.scala index 32897ce..e0ea1c4 100644 --- a/src/mooc/test/tv/codely/mooc/video/application/search/VideosSearcherShould.scala +++ b/src/mooc/test/tv/codely/mooc/video/application/search/VideosSearcherShould.scala @@ -16,4 +16,10 @@ final class VideosSearcherShould extends UnitTestCase with VideoRepositoryMock { searcher.all().futureValue shouldBe existingVideos } + + "find an existing video" in { + val video = VideoMother.random + repositoryShouldFind(video) + repository.find(video.id).futureValue.get shouldBe video + } } diff --git a/src/mooc/test/tv/codely/mooc/video/infrastructure/repository/VideoRepositoryMock.scala b/src/mooc/test/tv/codely/mooc/video/infrastructure/repository/VideoRepositoryMock.scala index 6433762..bc44892 100644 --- a/src/mooc/test/tv/codely/mooc/video/infrastructure/repository/VideoRepositoryMock.scala +++ b/src/mooc/test/tv/codely/mooc/video/infrastructure/repository/VideoRepositoryMock.scala @@ -20,4 +20,9 @@ protected[video] trait VideoRepositoryMock extends MockFactory { (repository.all _) .expects() .returning(Future.successful(videos)) + + protected def repositoryShouldFind(video: Video): Unit = + (repository.find _) + .expects(video.id) + .returning(Future.successful(Some(video))) }