Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .scalafmt.conf
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ binPack.parentConstructors = true
maxColumn = 120
includeCurlyBraceInSelectChains = false
align.preset = most
version = "3.0.7"
version = "3.0.8"
trailingCommas = preserve
newlines.penalizeSingleSelectMultiArgList = false
newlines.alwaysBeforeMultilineDef = false
9 changes: 4 additions & 5 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.4.3")
addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.4.3")
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.8.1")
addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.31")
addSbtPlugin("org.scalameta" % "sbt-munit" % "0.4.5")

addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.31")
addSbtPlugin("org.scalameta" % "sbt-munit" % "0.4.5")
9 changes: 5 additions & 4 deletions src/main/scala/Main.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ object Main extends IOApp {

implicit val ec: ExecutionContext =
scala.concurrent.ExecutionContext.Implicits.global
//dirty
// dirty

def app(locator: Locator): IO[Unit] =
for {
Expand Down Expand Up @@ -63,11 +63,12 @@ object Main extends IOApp {
External.Module[F]
}

def CommonModule[F[_]: TagK: Delay: Sync: ConcurrentEffect: ContextShift: MonadError[*[_], Throwable]: Fire]: ModuleDef = new ModuleDef {
def CommonModule[F[_]: TagK: Delay: Sync: ConcurrentEffect: ContextShift: MonadError[*[_], Throwable]: Fire]
: ModuleDef = new ModuleDef {
make[GenUUID[F]].from(GenUUID.syncGenUUID[F])
make[Blocker].fromResource(Blocker[F])
make[SttpBackend[F, Any]].fromResource{ blocker: Blocker =>
Http4sBackend.usingDefaultBlazeClientBuilder[F](blocker)
make[SttpBackend[F, Any]].fromResource { blocker: Blocker =>
Http4sBackend.usingDefaultBlazeClientBuilder[F](blocker)
}
make[Raise[F, Throwable]].from(implicitly[Raise[F, Throwable]])
make[Fire[F]].from(implicitly[Fire[F]])
Expand Down
6 changes: 3 additions & 3 deletions src/main/scala/common/Config.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@ case class Normalization(
port: Int,
path: String,
threshold: Int
)
)

case class Colorization(
host: String,
port: Int,
path: String
)
)

case class DB(
connectionString: String,
user: String,
pass: String
)
)

case class Config(
db: DB,
Expand Down
11 changes: 6 additions & 5 deletions src/main/scala/db/PhotoInit.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,14 @@ final class PhotoInit[F[_]: Sync: ContextShift: PhotoStorage: Colorization: Fire

def paths: F[List[String]] = fs2.io.file
.directoryStream[F](blocker, Path.of(config.photoFolder))
.map(_.getFileName)
.map(_.toString)
.filter(_ != "colorised")
.filter(_ != "upscaled")
.map(_.getFileName)
.map(_.toString)
.filter(_ != "colorised")
.filter(_ != "upscaled")
.compile
.toList

def init: F[Unit] = paths.flatTap(x => x.traverse(Colorization[F].colorize(_)).fireAndForget).flatMap(PhotoStorage[F].insertMany)
def init: F[Unit] =
paths.flatTap(x => x.traverse(Colorization[F].colorize(_)).fireAndForget).flatMap(PhotoStorage[F].insertMany)

}
2 changes: 1 addition & 1 deletion src/main/scala/db/models/Submission.scala
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ case class Submission(position: Option[Position] = None, name: Option[String] =

object Submission {
def fromNormalized(normalizationResult: NormalizationResult): Submission =
Submission(position = Some(normalizationResult.mean))
Submission(position = Some(normalizationResult.mean))
}

@derive(loggable, encoder, decoder, schema)
Expand Down
15 changes: 6 additions & 9 deletions src/main/scala/db/repository/SubmissionStorage.scala
Original file line number Diff line number Diff line change
Expand Up @@ -99,19 +99,16 @@ object SubmissionStorage extends LoggingCompanion[SubmissionStorage] {

def findAllPositions: ConnectionIO[List[Position]] =
lsql"""SELECT latitude, longitude FROM submission"""
.query[Position]
.to[List]

.query[Position]
.to[List]

def countAllForPhoto(photoId: Int): ConnectionIO[Option[Int]] =
lsql"""SELECT COUNT(*)
lsql"""SELECT COUNT(*)
|FROM submission
|WHERE photo_id = $photoId
|"""
.stripMargin
.query[Int]
.option

|""".stripMargin
.query[Int]
.option

def findAllForUser(userId: UUID): ConnectionIO[List[PhotoSubmission]] =
lsql"""SELECT photo_id, latitude, longitude, name, photo_year
Expand Down
11 changes: 5 additions & 6 deletions src/main/scala/db/repository/UserStorage.scala
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,12 @@ object UserStorage extends LoggingCompanion[UserStorage] {
lsql"""INSERT INTO users (username, password) VALUES (
| ${credentials.username},
| crypt(${credentials.password}, gen_salt('bf'))
|)""".stripMargin
.update
|)""".stripMargin.update
.withUniqueGeneratedKeys[UUID]("id")
.attemptSomeSqlState {
case sqlstate.class23.UNIQUE_VIOLATION => ()
}.map(_.toOption)

.attemptSomeSqlState { case sqlstate.class23.UNIQUE_VIOLATION =>
()
}
.map(_.toOption)

def findId(credentials: Credentials): ConnectionIO[Option[UUID]] =
lsql"""SELECT id
Expand Down
6 changes: 3 additions & 3 deletions src/main/scala/endpoints/AuthEndpoints.scala
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ final class AuthEndpoints[F[_]: Monad: UserStorage: SessionStorage](
WWWAuthenticate.basic(WWWAuthenticate.DefaultRealm)
)
)
//workaround - frontend bug
.out(jsonBody[SetCookie])
// workaround - frontend bug
.out(jsonBody[SetCookie])
.out(setCookie(BaseEndpoints.authCookie))
.errorOut(statusCode)
.serverLogic { credentials =>
Expand Down Expand Up @@ -73,7 +73,7 @@ final class AuthEndpoints[F[_]: Monad: UserStorage: SessionStorage](
UserStorage[F]
.create(credentials)
.toRightIn(StatusCode.Conflict)
.mapIn(_ => ())
.mapIn(_ => ())
}

override def all: List[
Expand Down
40 changes: 20 additions & 20 deletions src/main/scala/endpoints/PhotoEndpoints.scala
Original file line number Diff line number Diff line change
Expand Up @@ -192,27 +192,27 @@ final class PhotoEndpoints[F[
}
}

val getPhotoUpscaled =
endpoint.get
.in("photo")
.in(path[Int])
.in("upscaled")
.out(header[Long](HeaderNames.ContentLength))
.out(header(HeaderNames.ContentType, MediaType.ImageJpeg.toString))
.out(streamBinaryBody(Fs2Streams[F]))
.errorOut(statusCode)
.serverLogic { photoId =>
PhotoStorage[F]
.find(photoId)
.map(_.toRight(StatusCode.NotFound))
.doubleFlatMap { pathStr =>
val path = Path.of(upscaledPrefix ++ pathStr)
fs2.io.file.size(blocker, path).map { size =>
val stream = fs2.io.file.readAll(path, blocker, 10 * 1024 * 1024)
(size, stream).asRight[StatusCode]
}
}
val getPhotoUpscaled =
endpoint.get
.in("photo")
.in(path[Int])
.in("upscaled")
.out(header[Long](HeaderNames.ContentLength))
.out(header(HeaderNames.ContentType, MediaType.ImageJpeg.toString))
.out(streamBinaryBody(Fs2Streams[F]))
.errorOut(statusCode)
.serverLogic { photoId =>
PhotoStorage[F]
.find(photoId)
.map(_.toRight(StatusCode.NotFound))
.doubleFlatMap { pathStr =>
val path = Path.of(upscaledPrefix ++ pathStr)
fs2.io.file.size(blocker, path).map { size =>
val stream = fs2.io.file.readAll(path, blocker, 10 * 1024 * 1024)
(size, stream).asRight[StatusCode]
}
}
}

val uploadPhoto: ServerEndpoint[
(Option[String], fs2.Stream[F, Byte]),
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/endpoints/models/SetCookie.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import derevo.derive
import sttp.tapir.derevo.schema

@derive(encoder, decoder, schema)
case class SetCookie (
case class SetCookie(
key: String,
value: String
)
)
18 changes: 10 additions & 8 deletions src/main/scala/external/Colorization.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ import tofu.logging.Logging
import tofu.{Fire, Raise}
import tofu.syntax.monadic._

final class Colorization[F[_]: Monad: MetadataStorage: SubmissionStorage: Raise[*[_], Throwable]: Fire: Logging.Make: Sync](
final class Colorization[
F[_]: Monad: MetadataStorage: SubmissionStorage: Raise[*[_], Throwable]: Fire: Logging.Make: Sync
](
sttpBackend: SttpBackend[F, Any],
config: Config
) {
Expand All @@ -29,13 +31,13 @@ final class Colorization[F[_]: Monad: MetadataStorage: SubmissionStorage: Raise[

def colorize(file: String): F[Unit] =
basicRequest
.post(baseUri.addPath(config.colorization.path))
.body(ColorizeRequest(file))
.send(sttpBackend)
.flatMap{ x =>
Sync[F].delay(println(x))
}
.void
.post(baseUri.addPath(config.colorization.path))
.body(ColorizeRequest(file))
.send(sttpBackend)
.flatMap { x =>
Sync[F].delay(println(x))
}
.void

}

Expand Down
6 changes: 3 additions & 3 deletions src/main/scala/external/Normalization.scala
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ final class Normalization[F[_]: Monad: MetadataStorage: SubmissionStorage: Raise
.response(asJson[NormalizationResult])
.send(sttpBackend)
.map(_.body)
.leftMapF{ err =>
error"${err.getMessage}".map(_ => err)
}
.leftMapF { err =>
error"${err.getMessage}".map(_ => err)
}
.reRaise

def normalizeAndSave(photoId: Int): F[Unit] =
Expand Down