diff --git a/src/main/scala/com/softwaremill/realworld/profiles/ProfilesRepository.scala b/src/main/scala/com/softwaremill/realworld/profiles/ProfilesRepository.scala index 415053184c..a73993cb1e 100644 --- a/src/main/scala/com/softwaremill/realworld/profiles/ProfilesRepository.scala +++ b/src/main/scala/com/softwaremill/realworld/profiles/ProfilesRepository.scala @@ -1,28 +1,37 @@ package com.softwaremill.realworld.profiles import io.getquill.* +import io.getquill.context.sql.idiom.SqlIdiom import io.getquill.jdbczio.* -import zio.ZLayer +import zio.{Tag, ZIO, ZLayer} +import java.sql.SQLException import javax.sql.DataSource -class ProfilesRepository(quill: Quill.Sqlite[SnakeCase]) { - import quill.* +trait ProfilesRepository { + def follow(followedId: Int, followerId: Int): ZIO[Any, SQLException, Long] + def unfollow(followedId: Int, followerId: Int): ZIO[Any, SQLException, Long] + def isFollowing(followedId: Int, followerId: Int): ZIO[Any, SQLException, Boolean] +} - def follow(followedId: Int, followerId: Int) = run { - query[Followers].insert(_.userId -> lift(followedId), _.followerId -> lift(followerId)).onConflictIgnore - } +object ProfilesRepository { + def live[I <: SqlIdiom: Tag, N <: NamingStrategy: Tag]: ZLayer[Quill[I, N], Nothing, ProfilesRepository] = + ZLayer.fromFunction(ProfilesRepositoryLive[I, N](_)) - def unfollow(followedId: Int, followerId: Int) = run { - query[Followers].filter(f => (f.userId == lift(followedId)) && (f.followerId == lift(followerId))).delete - } + private class ProfilesRepositoryLive[I <: SqlIdiom, N <: NamingStrategy](quill: Quill[I, N]) extends ProfilesRepository { - def isFollowing(followedId: Int, followerId: Int) = run { - query[Followers].filter(_.userId == lift(followedId)).filter(_.followerId == lift(followerId)).map(_ => 1).nonEmpty - } + import quill.* -} + def follow(followedId: Int, followerId: Int): ZIO[Any, SQLException, Long] = run { + query[Followers].insert(_.userId -> lift(followedId), _.followerId -> lift(followerId)).onConflictIgnore + } + + def unfollow(followedId: Int, followerId: Int): ZIO[Any, SQLException, Long] = run { + query[Followers].filter(f => (f.userId == lift(followedId)) && (f.followerId == lift(followerId))).delete + } -object ProfilesRepository: - val live: ZLayer[Quill.Sqlite[SnakeCase], Nothing, ProfilesRepository] = - ZLayer.fromFunction(new ProfilesRepository(_)) + def isFollowing(followedId: Int, followerId: Int): ZIO[Any, SQLException, Boolean] = run { + query[Followers].filter(_.userId == lift(followedId)).filter(_.followerId == lift(followerId)).map(_ => 1).nonEmpty + } + } +}