Skip to content
Merged
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 file_service/src/main/scala/dto/folder_creation_body.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ package dto

case class FolderCreationBody(
folder_name: String,
parent_folder_id: Option[Int],
parent_folder_id: Int,
user_id: Int
)
2 changes: 1 addition & 1 deletion file_service/src/main/scala/model/file_metadata.scala
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ def create_file_metadata(body: FileUpsertionBody): IO[Either[String, Long]] = {

val insertAction: ConnectionIO[Option[Long]] =
insertQuery.update
.withGeneratedKeys[Long]("id")
.withGeneratedKeys[FileId]("id")
.compile
.last

Expand Down
56 changes: 31 additions & 25 deletions file_service/src/main/scala/model/folder_metadata.scala
Original file line number Diff line number Diff line change
Expand Up @@ -39,35 +39,41 @@ def get_root_folder_by_user_id(
.transact(transactor)
.flatMap {
case Some(folder) => IO.pure(Right(folder))
case None => create_folder(FolderCreationBody("root", None, user_id))
case None => create_folder("root", None, user_id)
}

def create_folder(
body: FolderCreationBody
): IO[Either[String, FolderMetadata]] =
sql"""insert into folder_metadata(folder_name, parent_folder_id, user_id) values(${body.folder_name}, ${body.parent_folder_id}, ${body.user_id})""".update
.withUniqueGeneratedKeys[Int]("folder_id")
.transact(transactor)
.attempt
.flatMap {
case Right(folder_id) =>
sql"""select folder_id, parent_folder_id, folder_name,created_at, user_id from folder_metadata where folder_id=$folder_id"""
.query[FolderMetadata]
.unique
.transact(transactor)
.flatMap(folder => IO.pure(Right(folder)))
case Left(e: SQLException)
if e.getMessage.contains("UNIQUE constraint failed") =>
IO.pure(
Left(
"Folder with the same name already exists in the target directory."
)
)
folder_name: String,
parent_folder_id: Option[FolderId],
user_id: Int
): IO[Either[String, FolderId]] =
val valid: IO[Boolean] = parent_folder_id match {
case None => IO.pure(true)
case Some(folder) => folder_exists(folder, user_id)
}

case Left(e) =>
IO.println(s"Unexpected DB error: ${e.getMessage}") *>
IO.pure(Left("Unexpected database error"))
}
valid.flatMap {
case false => IO.pure(Left("Invalid parent_folder_id"))
case true =>
sql"""insert into folder_metadata(folder_name, parent_folder_id, user_id) values(${folder_name}, ${parent_folder_id}, ${user_id})""".update
.withUniqueGeneratedKeys[FolderId]("folder_id")
.transact(transactor)
.attempt
.flatMap {
case Right(folder_id) => Right(folder_id)
case Left(e: SQLException)
if e.getMessage.contains("UNIQUE constraint failed") =>
IO.pure(
Left(
"Folder with the same name already exists in the target directory."
)
)

case Left(e) =>
IO.println(s"Unexpected DB error: ${e.getMessage}") *>
IO.pure(Left("Unexpected database error"))
}
}

def folder_exists(folder_id: FolderId, user_id: Int): IO[Boolean] =
sql"""select 1 from folder_metadata where user_id = $user_id and folder_id = $folder_id"""
Expand Down
22 changes: 14 additions & 8 deletions file_service/src/main/scala/services/folder_service.scala
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,22 @@ object folder_service {
}

def create_folder_metadata(body: FolderCreationBody): IO[Response[IO]] =
model.create_folder(body).flatMap {
case Right(folder) =>
Ok(folder.asJson)
model
.create_folder(
body.folder_name,
Some(body.parent_folder_id),
body.user_id
)
.flatMap {
case Right(folder_id) =>
Ok(folder.asJson)

case Left(errMsg) if errMsg.contains("already exists") =>
Conflict(ErrorResponse(errMsg).asJson)
case Left(errMsg) if errMsg.contains("already exists") =>
Conflict(ErrorResponse(errMsg).asJson)

case Left(errMsg) =>
InternalServerError(ErrorResponse(errMsg).asJson)
}
case Left(errMsg) =>
InternalServerError(ErrorResponse(errMsg).asJson)
}

def get_user_root_folder(user_id: Int): IO[Response[IO]] =
model
Expand Down