~jan0sch/smederee
Showing details for patch d46d959a113be4d42649c7f7907f5aa30b077452.
diff -rN -u old-smederee/modules/darcs/src/test/scala/de/smederee/darcs/DarcsCommandsTest.scala new-smederee/modules/darcs/src/test/scala/de/smederee/darcs/DarcsCommandsTest.scala --- old-smederee/modules/darcs/src/test/scala/de/smederee/darcs/DarcsCommandsTest.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/darcs/src/test/scala/de/smederee/darcs/DarcsCommandsTest.scala 2025-06-20 12:12:52.687922007 +0000 @@ -29,7 +29,7 @@ val expectedDirectory = workingDirectory.resolve(repo) val testPatch = Paths.get(getClass().getClassLoader().getResource("test-patch.dpatch").toURI()) val createRepository = cmd.initialize(workingDirectory)(repo)(Chain.empty) - val test = for { + val test = for { init <- createRepository patch <- cmd.applyPatch(workingDirectory)(repo)(testPatch)(Chain.empty) } yield (init, patch) @@ -48,7 +48,7 @@ val cmd = new DarcsCommands[IO](darcsBinary) val source = workingDirectory.resolve("source") val target = workingDirectory.resolve("target") - val test = + val test = for { init <- cmd.initialize(workingDirectory)("source")(Chain.empty) clone <- cmd.clone(source, target)(Chain.empty) @@ -66,7 +66,7 @@ val cmd = new DarcsCommands[IO](darcsBinary) val source = workingDirectory.resolve("source-should-not-exist") val target = workingDirectory.resolve("target-should-not-be-created") - val test = + val test = for { clone <- cmd.clone(source, target)(Chain.empty) } yield clone @@ -110,7 +110,7 @@ val repo = "test-repository-existing" val expectedDirectory = workingDirectory.resolve(repo) val _ = Files.createDirectories(expectedDirectory) - val test = for { + val test = for { _ <- cmd.initialize(workingDirectory)(repo)(Chain.empty) output <- cmd.initialize(workingDirectory)(repo)(Chain.empty) } yield output @@ -126,7 +126,7 @@ val expectedDirectory = workingDirectory.resolve(repo) val testPatch = Paths.get(getClass().getClassLoader().getResource("test-patch.dpatch").toURI()) val createRepository = cmd.initialize(workingDirectory)(repo)(Chain.empty) - val test = for { + val test = for { init <- createRepository patch <- cmd.applyPatch(workingDirectory)(repo)(testPatch)(Chain.empty) repair <- cmd.repair(workingDirectory)(repo)(Chain("--dry-run")) diff -rN -u old-smederee/modules/email/src/main/scala/de/smederee/email/EmailMiddleware.scala new-smederee/modules/email/src/main/scala/de/smederee/email/EmailMiddleware.scala --- old-smederee/modules/email/src/main/scala/de/smederee/email/EmailMiddleware.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/email/src/main/scala/de/smederee/email/EmailMiddleware.scala 2025-06-20 12:12:52.687922007 +0000 @@ -116,7 +116,7 @@ val belowMaxLength = Option(source).filter(_.length <= 128) // The last part of the email address (usually the top level domain) must at least be 2 characters long. val lastPartValid = Option(source) match { - case None => None + case None => None case Some(string) => val parts = string.split('.') if (parts.lastOption.map(_.length >= 2).getOrElse(false)) @@ -184,7 +184,7 @@ val belowMaxLength = Option(source).filter(_.length <= 128) // The last part of the email address (usually the top level domain) must at least be 2 characters long. val lastPartValid = Option(source) match { - case None => None + case None => None case Some(string) => val parts = string.split('.') if (parts.lastOption.map(_.length >= 2).getOrElse(false)) @@ -280,7 +280,7 @@ val belowMaxLength = Option(source).filter(_.length <= 128) // The last part of the email address (usually the top level domain) must at least be 2 characters long. val lastPartValid = Option(source) match { - case None => None + case None => None case Some(string) => val parts = string.split('.') if (parts.lastOption.map(_.length >= 2).getOrElse(false)) diff -rN -u old-smederee/modules/email/src/test/scala/de/smederee/email/EmailMiddlewareTest.scala new-smederee/modules/email/src/test/scala/de/smederee/email/EmailMiddlewareTest.scala --- old-smederee/modules/email/src/test/scala/de/smederee/email/EmailMiddlewareTest.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/email/src/test/scala/de/smederee/email/EmailMiddlewareTest.scala 2025-06-20 12:12:52.687922007 +0000 @@ -25,7 +25,7 @@ property("EmailServerPassword.from must create correct instances") { forAll { (randomString: String) => EmailServerPassword.from(randomString) match { - case None => fail("Could not create EmailServerPassword!") + case None => fail("Could not create EmailServerPassword!") case Some(password) => assert(java.util.Arrays.equals(password.toArray, randomString.getBytes(StandardCharsets.UTF_8))) } diff -rN -u old-smederee/modules/email/src/test/scala/de/smederee/email/Generators.scala new-smederee/modules/email/src/test/scala/de/smederee/email/Generators.scala --- old-smederee/modules/email/src/test/scala/de/smederee/email/Generators.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/email/src/test/scala/de/smederee/email/Generators.scala 2025-06-20 12:12:52.687922007 +0000 @@ -18,8 +18,8 @@ private val validDomainNameChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-".toList val genValidFromAddress: Gen[FromAddress] = for { - prefix <- Gen.nonEmptyListOf(Gen.oneOf(validEmailAddressPrefixChars)).map(_.take(64).mkString) - domain <- Gen.nonEmptyListOf(Gen.oneOf(validDomainNameChars)).map(_.take(32).mkString) + prefix <- Gen.nonEmptyListOf(Gen.oneOf(validEmailAddressPrefixChars)).map(_.take(64).mkString) + domain <- Gen.nonEmptyListOf(Gen.oneOf(validDomainNameChars)).map(_.take(32).mkString) topLevelDomain <- Gen .nonEmptyListOf(Gen.oneOf(validDomainNameChars)) .suchThat(_.length >= 2) @@ -39,8 +39,8 @@ given Arbitrary[TextBody] = Arbitrary(genValidTextBody) val genValidToAddress: Gen[ToAddress] = for { - prefix <- Gen.nonEmptyListOf(Gen.oneOf(validEmailAddressPrefixChars)).map(_.take(64).mkString) - domain <- Gen.nonEmptyListOf(Gen.oneOf(validDomainNameChars)).map(_.take(32).mkString) + prefix <- Gen.nonEmptyListOf(Gen.oneOf(validEmailAddressPrefixChars)).map(_.take(64).mkString) + domain <- Gen.nonEmptyListOf(Gen.oneOf(validDomainNameChars)).map(_.take(32).mkString) topLevelDomain <- Gen .nonEmptyListOf(Gen.oneOf(validDomainNameChars)) .suchThat(_.length >= 2) diff -rN -u old-smederee/modules/html-utils/src/main/scala/de/smederee/html/ContentRenderer.scala new-smederee/modules/html-utils/src/main/scala/de/smederee/html/ContentRenderer.scala --- old-smederee/modules/html-utils/src/main/scala/de/smederee/html/ContentRenderer.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/html-utils/src/main/scala/de/smederee/html/ContentRenderer.scala 2025-06-20 12:12:52.687922007 +0000 @@ -92,7 +92,7 @@ log.debug(s"Found possible to correct local URI: $absolute, $relative, $formats") val renderedLink = link.target.render(internalTargetsAbsolute = false) localUrlPathPrefix.match { - case None => link + case None => link case Some(pathPrefix) => if (renderedLink.startsWith(pathPrefix.toString)) link @@ -110,7 +110,7 @@ } .rendering { case (fmt, text: Text) => ToDoTextCssMapping.isToDoItem.findFirstMatchIn(text.content) match { - case None => text.content + case None => text.content case Some(matchedItem) => if (matchedItem.group(4) === null) { val prefix = matchedItem.group(1) diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/AccountManagementRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/AccountManagementRoutes.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/AccountManagementRoutes.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/AccountManagementRoutes.scala 2025-06-20 12:12:52.687922007 +0000 @@ -74,7 +74,7 @@ _ <- Sync[F].delay(log.debug(s"Request to delete user dir: $userDirectory")) reposDirPath <- Sync[F].delay(configuration.darcs.repositoriesDirectory.toPath) isSubDir <- Sync[F].delay(reposDirPath.equals(userDirectory.getParent())) - deleted <- + deleted <- Sync[F].delay { if (isSubDir) { Files.walkFileTree( @@ -129,7 +129,7 @@ addAction <- Sync[F].delay(configuration.external.createFullUri(uri"user/settings/ssh/add")) deleteAction <- Sync[F].delay(configuration.external.createFullUri(uri"user/settings/ssh/delete")) keys <- accountManagementRepo.listSshKeys(user.uid).compile.toList - resp <- form match { + resp <- form match { case Validated.Invalid(errors) => BadRequest( views.html.account @@ -146,8 +146,8 @@ ) case Validated.Valid(validSshKeyForm) => for { - id <- Sync[F].delay(UUID.randomUUID()) - createdAt <- Sync[F].delay(OffsetDateTime.now(ZoneOffset.UTC)) + id <- Sync[F].delay(UUID.randomUUID()) + createdAt <- Sync[F].delay(OffsetDateTime.now(ZoneOffset.UTC)) convertedKey <- Sync[F].delay( PublicSshKey.from(id)(user.uid)(createdAt)(validSshKeyForm.keyString) ) @@ -242,7 +242,7 @@ validateAction <- Sync[F].delay( configuration.external.createFullUri(uri"user/settings/email/validate") ) - passwordHash <- accountManagementRepo.findPasswordHash(user.uid) + passwordHash <- accountManagementRepo.findPasswordHash(user.uid) passwordCorrect <- Sync[F].delay( (passwordField, passwordHash) .mapN { case (enteredPassword, hashFromDatabase) => @@ -266,7 +266,7 @@ user.name.toString ) ) - _ <- deleteUserDirectory(userDir) + _ <- deleteUserDirectory(userDir) response <- ticketServiceApi.deleteUser(user.uid) *> accountManagementRepo .deleteAccount( user.uid @@ -295,7 +295,7 @@ case ar @ POST -> Root / "user" / "settings" / "ssh" / "delete" as user => ar.req.decodeStrict[F, UrlForm] { urlForm => for { - csrf <- Sync[F].delay(ar.req.getCsrfToken) + csrf <- Sync[F].delay(ar.req.getCsrfToken) formData <- Sync[F].delay { urlForm.values.map { t => val (key, values) = t @@ -307,7 +307,7 @@ } actionBaseUri <- Sync[F].delay(configuration.external.createFullUri(uri"user/settings")) userIsSure <- Sync[F].delay(formData.get("i-am-sure").exists(_ === "yes")) - sshKeyId <- Sync[F].delay { + sshKeyId <- Sync[F].delay { Try(formData.get("ssh-key-id").map(UUID.fromString)) match { case scala.util.Failure(error) => log.error("Error while parsing ssh key id upon key delete request.", error) @@ -336,11 +336,11 @@ to <- Sync[F].delay(NonEmptyList.of(user.email.toToAddress)) uri <- Sync[F].delay(configuration.external.createFullUri(uri"user/settings/email/validate")) subject <- Sync[F].delay(SubjectLine("Smederee - Please validate your email address.")) - body <- Sync[F].delay( + body <- Sync[F].delay( TextBody(views.txt.emails.validate(user, token, uri).toString) ) // TODO: extension method? - message <- Sync[F].delay(EmailMessage(from, to, List.empty, List.empty, subject, body)) - result <- emailMiddleware.send(message) + message <- Sync[F].delay(EmailMessage(from, to, List.empty, List.empty, subject, body)) + result <- emailMiddleware.send(message) response <- result match { case Left(error) => InternalServerError(s"An error occured: $error") case Right(_) => SeeOther(Location(configuration.external.createFullUri(uri"user/settings"))) @@ -352,7 +352,7 @@ case ar @ POST -> Root / "user" / "settings" / "language" as user => ar.req.decodeStrict[F, UrlForm] { urlForm => for { - csrf <- Sync[F].delay(ar.req.getCsrfToken) + csrf <- Sync[F].delay(ar.req.getCsrfToken) formData <- Sync[F].delay { urlForm.values.map { t => val (key, values) = t @@ -403,10 +403,10 @@ private val showAccountOrganisations: AuthedRoutes[Account, F] = AuthedRoutes.of { case ar @ GET -> Root / "user" / "settings" / "organisations" as user => for { - csrf <- Sync[F].delay(ar.req.getCsrfToken) - language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - actionBaseUri <- Sync[F].delay(configuration.external.createFullUri(uri"user/settings")) - orgs <- organisationsRepo.allByOwner(user.uid).compile.toList + csrf <- Sync[F].delay(ar.req.getCsrfToken) + language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) + actionBaseUri <- Sync[F].delay(configuration.external.createFullUri(uri"user/settings")) + orgs <- organisationsRepo.allByOwner(user.uid).compile.toList organisationActionBaseUri <- Sync[F].delay( configuration.external.createFullUri(uri"user/settings/organisations") ) @@ -430,7 +430,7 @@ addAction <- Sync[F].delay(configuration.external.createFullUri(uri"user/settings/ssh/add")) deleteAction <- Sync[F].delay(configuration.external.createFullUri(uri"user/settings/ssh/delete")) keys <- accountManagementRepo.listSshKeys(user.uid).compile.toList - resp <- Ok( + resp <- Ok( views.html.account .sshSettings(lang = language)(csrf, Option(s"Smederee/~${user.name} - SSH Settings"), user)( actionBaseUri, @@ -450,7 +450,7 @@ csrf <- Sync[F].delay(req.getCsrfToken) account <- accountManagementRepo.findByValidationToken(token) _ <- account.traverse(user => accountManagementRepo.markAsValidated(user.uid)) - _ <- account.traverse(user => + _ <- account.traverse(user => ticketServiceApi.createOrUpdateUser(TicketsUser(user.uid, user.name, user.email, user.language)) ) resp <- SeeOther(Location(configuration.external.createFullUri(uri"/"))) diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/AddPublicSshKeyForm.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/AddPublicSshKeyForm.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/AddPublicSshKeyForm.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/AddPublicSshKeyForm.scala 2025-06-20 12:12:52.687922007 +0000 @@ -27,7 +27,7 @@ override def validate(data: Map[String, Chain[String]]): ValidatedNec[FormErrors, AddPublicSshKeyForm] = { val name = data.get(fieldName).fold(None.validNec)(name => name.headOption.flatMap(KeyComment.from).validNec) - val key = data + val key = data .get(fieldKey) .fold(FormFieldError("No ssh public key given!").invalidNec)(string => string.headOption diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/AuthenticationRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/AuthenticationRoutes.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/AuthenticationRoutes.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/AuthenticationRoutes.scala 2025-06-20 12:12:52.691921998 +0000 @@ -101,7 +101,7 @@ ) } source <- Sync[F].delay(request.from.map(_.toString).getOrElse("UNKNOWN_ADDRESS")) - login <- check match { + login <- check match { case None => // No account was found! for { @@ -164,8 +164,8 @@ OffsetDateTime.now(ZoneOffset.UTC) ) ) - _ <- repo.createUserSession(session) - _ <- repo.resetFailedAttempts(account.uid) + _ <- repo.createUserSession(session) + _ <- repo.resetFailedAttempts(account.uid) token <- Sync[F].delay( signAndValidate.signToken(session.id.toString)(clock.millis.toString) ) @@ -201,7 +201,7 @@ private val showLoginForm: HttpRoutes[F] = HttpRoutes.of { case req @ GET -> Root / "login" => for { - csrf <- Sync[F].delay(req.getCsrfToken) + csrf <- Sync[F].delay(req.getCsrfToken) response <- Ok( views.html.login()(loginPath, csrf, resetPath, title = "Smederee - Login to your account".some)() ) diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/config/SmedereeHubConfig.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/config/SmedereeHubConfig.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/config/SmedereeHubConfig.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/config/SmedereeHubConfig.scala 2025-06-20 12:12:52.691921998 +0000 @@ -221,7 +221,7 @@ given ConfigReader[EmailServerUsername] = ConfigReader.fromStringOpt[EmailServerUsername](EmailServerUsername.from) given ConfigReader[EmailServerPassword] = ConfigReader.fromStringOpt[EmailServerPassword](EmailServerPassword.from) - given ConfigReader[SmtpTransport] = + given ConfigReader[SmtpTransport] = ConfigReader.fromStringOpt[SmtpTransport](string => Try(SmtpTransport.valueOf(string)).toOption) given ConfigReader[EmailMiddlewareConfiguration] = @@ -390,7 +390,7 @@ final case class TicketIntegrationConfiguration(baseUri: Uri, enabled: Boolean) object TicketIntegrationConfiguration { - given ConfigReader[Uri] = ConfigReader.fromStringOpt(s => Uri.fromString(s).toOption) + given ConfigReader[Uri] = ConfigReader.fromStringOpt(s => Uri.fromString(s).toOption) given ConfigReader[TicketIntegrationConfiguration] = ConfigReader.forProduct2("base-uri", "enabled")(TicketIntegrationConfiguration.apply) } diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieAuthenticationRepository.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieAuthenticationRepository.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieAuthenticationRepository.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieAuthenticationRepository.scala 2025-06-20 12:12:52.691921998 +0000 @@ -29,8 +29,8 @@ given Meta[UserId] = Meta[UUID].timap(UserId.apply)(_.toUUID) given Meta[Username] = Meta[String].timap(Username.apply)(_.toString) - private val lockedFilter = fr"""locked_at IS NOT NULL""" - private val notLockedFilter = fr"""locked_at IS NULL""" + private val lockedFilter = fr"""locked_at IS NOT NULL""" + private val notLockedFilter = fr"""locked_at IS NULL""" private val selectAccountColumns = fr"""SELECT uid, name, email, full_name, validated_email, language FROM hub.accounts""" @@ -70,14 +70,14 @@ override def findLockedAccount(name: Username)(token: Option[UnlockToken]): F[Option[Account]] = { val nameFilter = fr"""name = $name""" val tokenFilter = token.map(token => fr"""unlock_token = $token""") - val query = + val query = selectAccountColumns ++ whereAndOpt(lockedFilter.some, nameFilter.some, tokenFilter) ++ fr"""LIMIT 1""" query.query[Account].option.transact(tx) } override def findPasswordHashAndAttempts(uid: UserId): F[Option[(PasswordHash, Int)]] = { val uidFilter = fr"""uid = $uid""" - val query = fr"""SELECT password, failed_attempts FROM hub.accounts""" ++ whereAnd( + val query = fr"""SELECT password, failed_attempts FROM hub.accounts""" ++ whereAnd( notLockedFilter, uidFilter ) ++ fr"""LIMIT 1""" diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieOrganisationRepository.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieOrganisationRepository.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieOrganisationRepository.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieOrganisationRepository.scala 2025-06-20 12:12:52.691921998 +0000 @@ -110,7 +110,7 @@ val nameFilter = fr"""name = $name""" val notLockedFilter = fr"""locked_at IS NULL""" val validatedEmailFilter = fr"""validated_email IS TRUE""" - val query = + val query = fr"""SELECT uid, name, @@ -124,7 +124,7 @@ override def findOwner(organisationId: OrganisationId): F[Option[Account]] = { val organisationFilter = fr"""organisations.id = $organisationId""" - val sqlQuery = + val sqlQuery = fr"""SELECT accounts.uid, accounts.name, @@ -140,7 +140,7 @@ override def getAdministrators(organisationId: OrganisationId): Stream[F, Account] = { val organisationFilter = fr"""admins.organisation = $organisationId""" - val sqlQuery = + val sqlQuery = fr"""SELECT accounts.uid, accounts.name, @@ -156,7 +156,7 @@ override def getMembers(organisationId: OrganisationId): Stream[F, Account] = { val organisationFilter = fr"""members.organisation = $organisationId""" - val sqlQuery = + val sqlQuery = fr"""SELECT accounts.uid, accounts.name, diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieResetPasswordRepository.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieResetPasswordRepository.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieResetPasswordRepository.scala 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/DoobieResetPasswordRepository.scala 2025-06-20 12:12:52.691921998 +0000 @@ -33,13 +33,13 @@ private val resetTokenExpiryNotSetFilter = fr"""reset_expiry IS NULL""" private val resetTokenExpirySetFilter = fr"""reset_expiry IS NOT NULL""" private val resetTokenNotExpiredFilter = fr"""reset_expiry > NOW()""" - private val selectAccountColumns = + private val selectAccountColumns = fr"""SELECT uid, name, email, full_name, validated_email, language FROM hub.accounts""" override def findByNameAndResetPasswordToken(name: Username, token: ResetToken): F[Option[Account]] = { val nameFilter = fr"""name = $name""" val resetTokenFilter = fr"""reset_token = $token""" - val query = selectAccountColumns ++ whereAnd( + val query = selectAccountColumns ++ whereAnd( notLockedFilter, nameFilter, resetTokenExpiryNotSetFilter, @@ -50,7 +50,7 @@ override def findByResetPasswordToken(token: ResetToken): F[Option[Account]] = { val resetTokenFilter = fr"""reset_token = $token""" - val query = selectAccountColumns ++ whereAnd( + val query = selectAccountColumns ++ whereAnd( notLockedFilter, resetTokenExpirySetFilter, resetTokenNotExpiredFilter, diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/HubServer.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/HubServer.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/HubServer.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/HubServer.scala 2025-06-20 12:12:52.691921998 +0000 @@ -204,7 +204,7 @@ |""".stripMargin def run(args: List[String]): IO[ExitCode] = { - val _ = Locale.setDefault(Locale.ENGLISH) // TODO: Make this configurable. + val _ = Locale.setDefault(Locale.ENGLISH) // TODO: Make this configurable. val hubConfiguration = ConfigSource .fromConfig(ConfigFactory.load(getClass.getClassLoader)) .at(SmedereeHubConfig.location) @@ -236,7 +236,7 @@ val accountManagementRepo = new DoobieAccountManagementRepository[IO](hubTransactor) val dryRun = arguments.headOption.exists(_ === "--dry-run") - val name = + val name = if (dryRun) arguments.drop(1).headOption.flatMap(Username.from) else @@ -299,7 +299,7 @@ .as(ExitCode.Success) case HubSubcommand.lock => val dryRun = arguments.headOption.exists(_ === "--dry-run") - val name = + val name = if (dryRun) arguments.drop(1).headOption.flatMap(Username.from) else @@ -331,7 +331,7 @@ } yield result case HubSubcommand.unlock => val dryRun = arguments.headOption.exists(_ === "--dry-run") - val name = + val name = if (dryRun) arguments.drop(1).headOption.flatMap(Username.from) else @@ -428,7 +428,7 @@ ticketMilestonesRepo = new DoobieMilestoneRepository[IO](ticketsTransactor) ticketProjectsRepo = new DoobieProjectRepository[IO](ticketsTransactor) ticketsRepo = new DoobieTicketRepository[IO](ticketsTransactor) - ticketRoutes = new TicketRoutes[IO]( + ticketRoutes = new TicketRoutes[IO]( ticketsConfiguration, ticketLabelsRepo, ticketMilestonesRepo, @@ -465,7 +465,7 @@ .build signAndValidate = SignAndValidate(hubConfiguration.service.authentication.cookieSecret) assetsRoutes <- resourceServiceBuilder[IO](Constants.assetsPath.path.toAbsolute.toString).toRoutes - authenticationRepo = new DoobieAuthenticationRepository[IO](hubTransactor) + authenticationRepo = new DoobieAuthenticationRepository[IO](hubTransactor) authenticationWithFallThrough = AuthMiddleware.withFallThrough( authenticateUserWithFallThrough( authenticationRepo, @@ -473,10 +473,10 @@ hubConfiguration.service.authentication.timeouts ) ) - darcsWrapper = new DarcsCommands[IO](hubConfiguration.service.darcs.executable) - emailMiddleware = new SimpleJavaMailMiddleware(hubConfiguration.service.email) - orgRepo = new DoobieOrganisationRepository[IO](hubTransactor) - accountManagementRepo = new DoobieAccountManagementRepository[IO](hubTransactor) + darcsWrapper = new DarcsCommands[IO](hubConfiguration.service.darcs.executable) + emailMiddleware = new SimpleJavaMailMiddleware(hubConfiguration.service.email) + orgRepo = new DoobieOrganisationRepository[IO](hubTransactor) + accountManagementRepo = new DoobieAccountManagementRepository[IO](hubTransactor) accountManagementRoutes = new AccountManagementRoutes[IO]( accountManagementRepo, hubConfiguration.service, @@ -491,7 +491,7 @@ authenticationRepo, signAndValidate ) - resetPasswordRepo = new DoobieResetPasswordRepository[IO](hubTransactor) + resetPasswordRepo = new DoobieResetPasswordRepository[IO](hubTransactor) resetPasswordRoutes = new ResetPasswordRoutes[IO]( hubConfiguration.service.authentication, authenticationRepo, @@ -504,7 +504,7 @@ landingPages = new LandingPageRoutes[IO](hubConfiguration.service) orgRoutes = new OrganisationRoutes[IO](hubConfiguration.service, orgRepo) vcsMetadataRepo = new DoobieVcsMetadataRepository[IO](hubTransactor) - vcsRepoRoutes = new VcsRepositoryRoutes[IO]( + vcsRepoRoutes = new VcsRepositoryRoutes[IO]( hubConfiguration.service, darcsWrapper, vcsMetadataRepo, @@ -525,7 +525,7 @@ ) hubWebService = Router( Constants.assetsPath.path.toAbsolute.toString -> assetsRoutes, - "/" -> RequestId.httpRoutes( + "/" -> RequestId.httpRoutes( RequestLogger.httpRoutes( logHeaders = true, logBody = true, @@ -547,7 +547,7 @@ // Create our ssh server fiber (or an empty option if disabled). sshServerProvider = hubConfiguration.service.ssh.enabled match { case false => None - case true => + case true => Option( new SshServerProvider( hubConfiguration.service.darcs, diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/LandingPageRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/LandingPageRoutes.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/LandingPageRoutes.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/LandingPageRoutes.scala 2025-06-20 12:12:52.691921998 +0000 @@ -52,7 +52,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- Ok( + resp <- Ok( views.html.imprint(baseUri, lang = language)(csrf, "Smederee - Imprint / Impressum".some, user.some) ) } yield resp @@ -69,7 +69,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- Ok( + resp <- Ok( views.html .index(baseUri, lang = language)()(signupUri, csrf, "Welcome to the Smederee!".some, user.some) ) @@ -88,7 +88,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- Ok( + resp <- Ok( views.html .privacyPolicy(baseUri, lang = language)(csrf, "Smederee - Privacy Policy".some, user.some) ) @@ -107,7 +107,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- Ok( + resp <- Ok( views.html .publicAlpha(baseUri, lang = language)( csrf, @@ -130,7 +130,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- Ok( + resp <- Ok( views.html.termsOfUse(baseUri, lang = language)(csrf, "Smederee - Terms of Use".some, user.some) ) } yield resp diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/OrganisationForm.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/OrganisationForm.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/OrganisationForm.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/OrganisationForm.scala 2025-06-20 12:12:52.691921998 +0000 @@ -142,7 +142,7 @@ * A stringified map containing the data of the form. */ def toMap: Map[String, Chain[String]] = { - val name = Map(OrganisationForm.fieldName.toString -> Chain(form.name.toString)) + val name = Map(OrganisationForm.fieldName.toString -> Chain(form.name.toString)) val owner = form.owner.fold(Map.empty)(owner => Map(OrganisationForm.fieldOwner.toString -> Chain(owner.toString))) val fullName = form.fullName.fold(Map.empty)(fullName => diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/OrganisationRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/OrganisationRoutes.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/OrganisationRoutes.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/OrganisationRoutes.scala 2025-06-20 12:12:52.691921998 +0000 @@ -58,7 +58,7 @@ _ <- Sync[F].delay(log.debug(s"Request to delete organisation dir: $organisationDirectory")) reposDirPath <- Sync[F].delay(configuration.darcs.repositoriesDirectory.toPath) isSubDir <- Sync[F].delay(reposDirPath.equals(organisationDirectory.getParent())) - deleted <- + deleted <- Sync[F].delay { if (isSubDir) { Files.walkFileTree( @@ -123,7 +123,7 @@ } // TODO: Replace with whatever we implement as proper permission model. ;-) result = currentUser match { - case None => orgaAndAdmins.filter(_._1.isPrivate === false) + case None => orgaAndAdmins.filter(_._1.isPrivate === false) case Some(user) => orgaAndAdmins.filter(tuple => tuple._1.isPrivate === false || tuple._1.owner === user.uid || tuple._2.exists(_ === user) @@ -137,7 +137,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - _ <- Sync[F].raiseUnless(user.validatedEmail)( + _ <- Sync[F].raiseUnless(user.validatedEmail)( new Error( "An unvalidated account is not allowed to create an organisation!" ) // FIXME: Proper error handling! @@ -147,7 +147,7 @@ // TODO: Cleanup the checking into something like `form.andThen(...)` or so. orgExists <- form.traverse(validForm => orgRepo.findByName(validForm.name)) checkedForm = orgExists match { - case Validated.Invalid(_) => form + case Validated.Invalid(_) => form case Validated.Valid(possibleOrg) => possibleOrg.fold(form)(_ => Map( @@ -197,7 +197,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - _ <- Sync[F].raiseUnless(user.validatedEmail)( + _ <- Sync[F].raiseUnless(user.validatedEmail)( new Error( "An unvalidated account is not allowed to edit an organisation!" ) // FIXME: Proper error handling! @@ -205,10 +205,10 @@ orgAndAdmins <- loadOrganisation(user.some)(organisationName) orgaData = orgAndAdmins.filter(tuple => tuple._1.owner === user.uid || tuple._2.exists(_ === user)) response <- orgaData match { - case None => NotFound() + case None => NotFound() case Some((organisation, _, owner)) => for { - formData <- Sync[F].delay(urlForm.valuesWithoutEmptyStrings) + formData <- Sync[F].delay(urlForm.valuesWithoutEmptyStrings) userIsSure <- Sync[F].delay( formData.get("i-am-sure").exists(_.headOption.exists(_ === "yes")) ) @@ -227,8 +227,8 @@ organisation.name.toString ) ) - _ <- deleteOrganisationDirectory(organisationDir) - _ <- orgRepo.delete(organisation.oid) + _ <- deleteOrganisationDirectory(organisationDir) + _ <- orgRepo.delete(organisation.oid) response <- SeeOther( Location(linkConfig.createFullUri(Uri(path = Uri.Path.Root))) ) @@ -251,7 +251,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - _ <- Sync[F].raiseUnless(user.validatedEmail)( + _ <- Sync[F].raiseUnless(user.validatedEmail)( new Error( "An unvalidated account is not allowed to edit an organisation!" ) // FIXME: Proper error handling! @@ -259,12 +259,12 @@ orgAndAdmins <- loadOrganisation(user.some)(organisationName) orgaData = orgAndAdmins.filter(tuple => tuple._1.owner === user.uid || tuple._2.exists(_ === user)) resp <- orgaData match { - case None => NotFound() + case None => NotFound() case Some((organisation, admins, _)) => for { formData <- Sync[F].delay(urlForm.valuesWithoutEmptyStrings) form <- Sync[F].delay(OrganisationAdminsForm.validate(formData)) - resp <- form match { + resp <- form match { case Validated.Invalid(es) => val actionBaseUri = uri"user/settings/organisations".addSegment( @@ -326,7 +326,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - _ <- Sync[F].raiseUnless(user.validatedEmail)( + _ <- Sync[F].raiseUnless(user.validatedEmail)( new Error( "An unvalidated account is not allowed to edit an organisation!" ) // FIXME: Proper error handling! @@ -335,13 +335,13 @@ orgMembers <- orgAndAdmins.traverse(tuple => orgRepo.getMembers(tuple._1.oid).compile.toList) orgaData = orgAndAdmins.filter(tuple => tuple._1.owner === user.uid || tuple._2.exists(_ === user)) resp <- orgaData match { - case None => NotFound() + case None => NotFound() case Some((organisation, _, _)) => val members = orgMembers.getOrElse(Nil) for { formData <- Sync[F].delay(urlForm.valuesWithoutEmptyStrings) form <- Sync[F].delay(OrganisationMembersForm.validate(formData)) - resp <- form match { + resp <- form match { case Validated.Invalid(es) => val actionBaseUri = uri"user/settings/organisations".addSegment( @@ -401,7 +401,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - _ <- Sync[F].raiseUnless(user.validatedEmail)( + _ <- Sync[F].raiseUnless(user.validatedEmail)( new Error( "An unvalidated account is not allowed to edit an organisation!" ) // FIXME: Proper error handling! @@ -409,13 +409,13 @@ orgAndAdmins <- loadOrganisation(user.some)(organisationName) orgaData = orgAndAdmins.filter(tuple => tuple._1.owner === user.uid || tuple._2.exists(_ === user)) resp <- orgaData match { - case None => NotFound() + case None => NotFound() case Some((organisation, admins, owner)) => val possibleOwners = (List(owner, user) ::: admins).distinct for { formData <- Sync[F].delay(urlForm.valuesWithoutEmptyStrings) form <- Sync[F].delay(OrganisationForm.validate(formData)) - resp <- form match { + resp <- form match { case Validated.Invalid(es) => val actionBaseUri = uri"user/settings/organisations".addSegment( s"~${organisation.name.toString}" @@ -471,7 +471,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- user.validatedEmail match { + resp <- user.validatedEmail match { case false => Forbidden( views.html.errors @@ -506,7 +506,7 @@ orgAndAdmins <- loadOrganisation(user.some)(organisationName) orgaData = orgAndAdmins.filter(tuple => tuple._1.owner === user.uid || tuple._2.exists(_ === user)) resp <- orgaData match { - case None => NotFound("Organisation not found!") + case None => NotFound("Organisation not found!") case Some((organisation, admins, _)) => user.validatedEmail match { case false => @@ -549,7 +549,7 @@ orgMembers <- orgAndAdmins.traverse(tuple => orgRepo.getMembers(tuple._1.oid).compile.toList) orgaData = orgAndAdmins.filter(tuple => tuple._1.owner === user.uid || tuple._2.exists(_ === user)) resp <- orgaData match { - case None => NotFound("Organisation not found!") + case None => NotFound("Organisation not found!") case Some((organisation, _, _)) => val members = orgMembers.getOrElse(Nil) user.validatedEmail match { @@ -592,7 +592,7 @@ orgAndAdmins <- loadOrganisation(user.some)(organisationName) orgaData = orgAndAdmins.filter(tuple => tuple._1.owner === user.uid || tuple._2.exists(_ === user)) resp <- orgaData match { - case None => NotFound("Organisation not found!") + case None => NotFound("Organisation not found!") case Some((organisation, admins, owner)) => user.validatedEmail match { case false => diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/ResetPasswordRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/ResetPasswordRoutes.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/ResetPasswordRoutes.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/ResetPasswordRoutes.scala 2025-06-20 12:12:52.691921998 +0000 @@ -80,14 +80,14 @@ for { language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) token <- Sync[F].delay(ResetToken.generate) - _ <- resetPasswordRepo + _ <- resetPasswordRepo .setResetPasswordToken(user.uid)( token, OffsetDateTime.now(ZoneOffset.UTC).plusDays(3L) ) from <- Sync[F].delay(FromAddress("noreply@smeder.ee")) to <- Sync[F].delay(NonEmptyList.of(user.email.toToAddress)) - uri <- Sync[F].delay( + uri <- Sync[F].delay( external.createFullUri(resetChangePasswordPath.addSegment(token.toString)) ) subject <- Sync[F] @@ -113,7 +113,7 @@ private val requestPasswordReset: HttpRoutes[F] = HttpRoutes.of { case req @ GET -> Root / "forgot-password" => for { - csrf <- Sync[F].delay(req.getCsrfToken) + csrf <- Sync[F].delay(req.getCsrfToken) response <- Ok( views.html.reset()(resetRequestPath, csrf, title = "Smederee - Reset your account password".some)() ) @@ -139,7 +139,7 @@ for { csrf <- Sync[F].delay(req.getCsrfToken) formData <- Sync[F].delay(urlForm.values) - form <- Sync[F].delay( + form <- Sync[F].delay( ChangePasswordForm .validate(formData) .andThen(form => @@ -202,8 +202,8 @@ private val changePasswordForm: HttpRoutes[F] = HttpRoutes.of { case req @ GET -> Root / "forgot-password" / "change-password" / ResetTokenPathParameter(token) => for { - csrf <- Sync[F].delay(req.getCsrfToken) - user <- resetPasswordRepo.findByResetPasswordToken(token) + csrf <- Sync[F].delay(req.getCsrfToken) + user <- resetPasswordRepo.findByResetPasswordToken(token) response <- user match { case None => Sync[F].delay(log.debug(s"Requested password reset token $token was not found!")) *> NotFound() diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/SignupRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/SignupRoutes.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/SignupRoutes.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/SignupRoutes.scala 2025-06-20 12:12:52.691921998 +0000 @@ -89,7 +89,7 @@ ) case Validated.Valid(signupForm) => for { - uid <- Sync[F].delay(UserId.randomUserId) + uid <- Sync[F].delay(UserId.randomUserId) account <- Sync[F].delay( Account( uid = uid, diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryRoutes.scala 2025-06-20 12:12:52.691921998 +0000 @@ -89,9 +89,9 @@ currentUser: Option[Account] )(repositoryOwnerName: Username, repositoryName: VcsRepositoryName): F[Option[(VcsRepository, VcsRepositoryId)]] = for { - owner <- vcsMetadataRepo.findVcsRepositoryOwner(repositoryOwnerName) + owner <- vcsMetadataRepo.findVcsRepositoryOwner(repositoryOwnerName) loadedRepo <- owner match { - case None => Sync[F].pure(None) + case None => Sync[F].pure(None) case Some(owner) => ( vcsMetadataRepo.findVcsRepository(owner, repositoryName), @@ -103,7 +103,7 @@ } // TODO: Replace with whatever we implement as proper permission model. ;-) repoAndId = currentUser match { - case None => loadedRepo.filter(tuple => tuple._1.isPrivate === false) + case None => loadedRepo.filter(tuple => tuple._1.isPrivate === false) case Some(user) => loadedRepo.filter(tuple => tuple._1.isPrivate === false || tuple._1.owner === user.toVcsRepositoryOwner @@ -125,12 +125,12 @@ ownerName: Username )(repoDirectory: java.nio.file.Path): F[Boolean] = for { - _ <- Sync[F].delay(log.debug(s"Request to delete repository dir: $repoDirectory")) + _ <- Sync[F].delay(log.debug(s"Request to delete repository dir: $repoDirectory")) reposDirPath <- Sync[F].delay( configuration.darcs.repositoriesDirectory.toPath.resolve(ownerName.toString) ) isSubDir <- Sync[F].delay(reposDirPath.equals(repoDirectory.getParent())) - deleted <- + deleted <- Sync[F].delay { if (isSubDir) { Files.walkFileTree( @@ -207,7 +207,7 @@ ): F[(Int, Chain[String], Chain[String])] = { val targetFile = targetDirectory / s"${repositoryName}.tar.gz" for { - _ <- Sync[F].delay(Files.createDirectories(targetDirectory.toNIO)) + _ <- Sync[F].delay(Files.createDirectories(targetDirectory.toNIO)) tempTargetFile <- Sync[F].delay( Files.createTempFile(targetDirectory.toNIO, "download", s"${repositoryName}.tar.gz") ) @@ -268,12 +268,12 @@ private def doShowAllRepositories(csrf: Option[CsrfToken])(user: Option[Account]): F[Response[F]] = for { language <- Sync[F].delay(user.flatMap(_.language).getOrElse(LanguageCode("en"))) - repos <- vcsMetadataRepo + repos <- vcsMetadataRepo .listAllRepositories(user)(VcsMetadataRepositoriesOrdering.NameAscending) .compile .toList actionBaseUri <- Sync[F].delay(linkConfig.createFullUri(uri"projects")) - resp <- Ok( + resp <- Ok( views.html.showAllRepositories(lang = language)(actionBaseUri, csrf, s"Smederee - Projects".some, user)( repos ) @@ -391,7 +391,7 @@ } pageTitle = genPageTitleBase(repositoryOwnerName)(repositoryName.some) resp <- repo match { - case None => NotFound("Repository not found!") + case None => NotFound("Repository not found!") case Some(repo) => Ok( views.html.showRepositoryBranches(baseUri, lang = language)( @@ -439,7 +439,7 @@ ) sshUri <- sshConfig.enabled match { case false => Sync[F].pure(None) - case true => + case true => Sync[F].delay( s"SSH_PORT=${sshConfig.port.toString} darcs clone darcs@${sshConfig.host.toString}:${repositoryOwnerName.toString}/${repositoryName.toString}".some ) @@ -479,7 +479,7 @@ } ) readmeData <- repo.traverse(repo => doLoadReadme(repo)) - readme <- readmeData match { + readme <- readmeData match { case Some((lines, Some(_), Some(renderableContent))) => Sync[F].delay( ContentRenderer @@ -499,7 +499,7 @@ } pageTitle = genPageTitleBase(repositoryOwnerName)(repositoryName.some) resp <- repo match { - case None => NotFound("Repository not found!") + case None => NotFound("Repository not found!") case Some(repo) => Ok( views.html.showRepositoryOverview(baseUri, lang = language)( @@ -579,7 +579,7 @@ ) _ <- Sync[F].delay(log.debug(s"Requested to view file type: $fileType")) viewFile <- Sync[F].delay(fileType.exists(_.isText)) // Only display certain file types. - listing <- + listing <- requestedFilePath match { case None => Sync[F].delay(IndexedSeq.empty) case Some(_) if viewFile => Sync[F].delay(IndexedSeq.empty) @@ -587,11 +587,11 @@ } content <- requestedFilePath match { - case None => Sync[F].delay(IndexedSeq.empty) + case None => Sync[F].delay(IndexedSeq.empty) case Some(path) => if (viewFile) for { - size <- Sync[F].delay(os.size(path)) + size <- Sync[F].delay(os.size(path)) stream <- if (size <= MaximumFileSize) Sync[F].delay(os.read.lines.stream(path)) @@ -626,7 +626,7 @@ ) renderableContent = RenderableContent.fromUri(actionBaseUri) fileContent <- renderableContent match { - case None => Sync[F].delay(content.toList) + case None => Sync[F].delay(content.toList) case Some(contentType) => Sync[F].delay( ContentRenderer @@ -641,9 +641,9 @@ } titleBase = genPageTitleBase(repositoryOwnerName)(repositoryName.some) pageTitle <- Sync[F].delay(s"$titleBase: ${filePath.segments.map(_.decoded()).mkString("/")}") - resp <- + resp <- repo match { - case None => NotFound("Repository not found!") + case None => NotFound("Repository not found!") case Some(repo) => if ( filePath.segments.mkString @@ -723,7 +723,7 @@ latestPatch.getOrElse(healthCheck.createdAt).compareTo(healthCheck.createdAt) <= 1 ) match { case Some(healthCheck) => Sync[F].pure(healthCheck) - case None => + case None => darcs .repair(directory.toNIO)(repositoryName.toString)(options) .map(check => @@ -779,7 +779,7 @@ ) pageTitle = genPageTitleBase(repositoryOwnerName)(repositoryName.some) |+| ": Health" resp <- repo match { - case None => NotFound() + case None => NotFound() case Some(repo) => Ok( views.html.showRepositoryHealth(baseUri, lang = language)( @@ -834,7 +834,7 @@ numberOfChanges <- Sync[F].delay(countChanges.stdout.toList.mkString.trim.toInt) maxCount = 10 from = fromEntry.getOrElse(1) - to = + to = if ((from + maxCount > numberOfChanges) && (numberOfChanges > 0)) numberOfChanges else @@ -883,7 +883,7 @@ ) pageTitle = genPageTitleBase(repositoryOwnerName)(repositoryName.some) |+| ": Changes" resp <- repo match { - case None => NotFound() + case None => NotFound() case Some(repo) => Ok( views.html.showRepositoryHistory(baseUri, lang = language)( @@ -919,7 +919,7 @@ repoAndId <- loadRepo(user)(repositoryOwnerName, repositoryName) repo = repoAndId.map(_._1) response <- repo match { - case None => NotFound() + case None => NotFound() case Some(repo) => for { directory <- Sync[F].delay( @@ -934,7 +934,7 @@ numberOfChanges <- Sync[F].delay(countChanges.stdout.toList.mkString.trim.toInt) maxCount = 15 from = 1 - to = + to = if ((from + maxCount > numberOfChanges) && (numberOfChanges > 0)) numberOfChanges else @@ -943,7 +943,7 @@ vcsLog <- darcs.log(directory.toNIO)(repositoryName.toString)( Chain(s"--index=$from-$to", "--summary", "--xml-output") ) - xmlLog <- Sync[F].delay(scala.xml.XML.loadString(vcsLog.stdout.toList.mkString)) + xmlLog <- Sync[F].delay(scala.xml.XML.loadString(vcsLog.stdout.toList.mkString)) patches <- Sync[F].delay( (xmlLog \ "patch").flatMap(VcsRepositoryPatchMetadata.fromDarcsXmlLog).toList ) @@ -959,7 +959,7 @@ ) ) ) - items = patches.map(_.toRssItem(repositoryBaseUri.addSegment("patch"))) + items = patches.map(_.toRssItem(repositoryBaseUri.addSegment("patch"))) channel = RssChannel( title = s"Smederee: ~$repositoryOwnerName/$repositoryName", link = repositoryBaseUri.toString, @@ -1036,7 +1036,7 @@ ) titleBase = genPageTitleBase(repositoryOwnerName)(repositoryName.some) resp <- repo match { - case None => NotFound() + case None => NotFound() case Some(repo) => Ok( views.html.showRepositoryStatistics(baseUri, lang = language)( @@ -1083,7 +1083,7 @@ Chain(s"--hash=${hash.toString}", "--summary", "--xml-output") ) xmlLog <- Sync[F].delay(scala.xml.XML.loadString(vcsLog.stdout.toList.mkString)) - patch <- Sync[F].delay( + patch <- Sync[F].delay( (xmlLog \ "patch").flatMap(VcsRepositoryPatchMetadata.fromDarcsXmlLog).toList.headOption ) darcsDiff <- darcs.diff(directory.toNIO)(repositoryName.toString)(hash)(Chain("--no-pause-for-gui")) @@ -1113,7 +1113,7 @@ titleBase = genPageTitleBase(repositoryOwnerName)(repositoryName.some) pageTitle = patch.map(_.name).map(patchName => titleBase |+| ": " |+| patchName.toString) resp <- repo match { - case None => NotFound() + case None => NotFound() case Some(repo) => Ok( views.html @@ -1145,7 +1145,7 @@ private def doListFiles(directory: os.Path): F[IndexedSeq[(os.RelPath, os.StatInfo)]] = for { isDirectory <- Sync[F].delay(os.isDir(directory)) - listing <- + listing <- if (isDirectory) Sync[F].delay( os.walk @@ -1189,7 +1189,7 @@ readme = files.find(_.last.matches("(?iu)^readme(\\..+)?$")) _ <- Sync[F].delay(log.debug(s"Found README at $readme.")) renderableContent = readme.flatMap(path => RenderableContent.fromUri(Uri.unsafeFromString(path.toString))) - size <- readme.traverse(path => Sync[F].delay(os.size(path))) + size <- readme.traverse(path => Sync[F].delay(os.size(path))) stream <- readme.traverse { path => if (size.getOrElse(0L) <= MaximumFileSize) Sync[F].delay(os.read.lines.stream(path)) @@ -1204,8 +1204,8 @@ repositoryName ) /: filePath => for { - csrf <- Sync[F].delay(req.getCsrfToken) - owner <- vcsMetadataRepo.findVcsRepositoryOwner(repositoryOwnerName) + csrf <- Sync[F].delay(req.getCsrfToken) + owner <- vcsMetadataRepo.findVcsRepositoryOwner(repositoryOwnerName) loadedRepo <- owner match { case None => Sync[F].pure(None) case Some(owner) => vcsMetadataRepo.findVcsRepository(owner, repositoryName) @@ -1250,7 +1250,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) file <- doDownloadDistribution(user.some)(repositoryOwnerName, repositoryName) resp <- file match { - case None => NotFound() + case None => NotFound() case Some(filePath) => StaticFile .fromPath(filePath, ar.req.some) @@ -1275,7 +1275,7 @@ csrf <- Sync[F].delay(req.getCsrfToken) file <- doDownloadDistribution(None)(repositoryOwnerName, repositoryName) resp <- file match { - case None => NotFound() + case None => NotFound() case Some(filePath) => StaticFile .fromPath(filePath, req.some) @@ -1300,7 +1300,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- user.validatedEmail match { + resp <- user.validatedEmail match { case false => Forbidden( views.html.errors @@ -1350,7 +1350,7 @@ ) ) output <- targetRepository match { - case None => Sync[F].pure(0) + case None => Sync[F].pure(0) case Some(repoMetadata) => for { _ <- Sync[F].delay( @@ -1402,14 +1402,14 @@ val response = for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - _ <- Sync[F].raiseUnless(user.validatedEmail)( + _ <- Sync[F].raiseUnless(user.validatedEmail)( new Error( "An unvalidated account is not allowed to create a repository!" ) // FIXME: Proper error handling! ) formData <- Sync[F].delay(urlForm.values) form <- Sync[F].delay(NewVcsRepositoryForm.validate(formData)) - resp <- form match { + resp <- form match { case Validated.Invalid(es) => BadRequest( views.html @@ -1459,7 +1459,7 @@ if (output.exitValue === 0) for { written <- vcsMetadataRepo.createVcsRepository(newRepo) - _ <- Option(newRepo) + _ <- Option(newRepo) .filter(_.ticketsEnabled) .traverse(repo => ticketsProjectRepo.createProject(repo.convert) @@ -1504,7 +1504,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- InternalServerError( + resp <- InternalServerError( views.html.errors.internalServerError(lang = language)(csrf, user.some) ) } yield resp @@ -1519,12 +1519,12 @@ ar.req.decodeStrict[F, UrlForm] { urlForm => for { csrf <- Sync[F].delay(ar.req.getCsrfToken) - _ <- Sync[F].raiseUnless(user.validatedEmail)( + _ <- Sync[F].raiseUnless(user.validatedEmail)( new Error( "An unvalidated account is not allowed to edit a repository!" ) // FIXME: Proper error handling! ) - owner <- vcsMetadataRepo.findVcsRepositoryOwner(repositoryOwnerName) + owner <- vcsMetadataRepo.findVcsRepositoryOwner(repositoryOwnerName) loadedRepo <- owner match { case None => Sync[F].pure(None) case Some(owner) => vcsMetadataRepo.findVcsRepository(owner, repositoryName) @@ -1536,7 +1536,7 @@ ) // You can only delete repositories that you own! repo = loadedRepo.filter(_.owner === user.toVcsRepositoryOwner) - _ <- Sync[F].raiseUnless(repo.nonEmpty)(new Error("Repository not found!")) + _ <- Sync[F].raiseUnless(repo.nonEmpty)(new Error("Repository not found!")) repoDir <- Sync[F].delay( repo.map(repo => darcsConfig.repositoriesDirectory.toPath @@ -1561,7 +1561,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - _ <- Sync[F].raiseUnless(user.validatedEmail)( + _ <- Sync[F].raiseUnless(user.validatedEmail)( new Error( "An unvalidated account is not allowed to edit a repository!" ) // FIXME: Proper error handling! @@ -1573,7 +1573,7 @@ case _ => Sync[F].delay(List.empty) } resp <- repo match { - case None => NotFound() + case None => NotFound() case Some(repo) => for { editAction <- Sync[F].delay( @@ -1603,7 +1603,7 @@ ) formData <- Sync[F].delay(urlForm.values) form <- Sync[F].delay(EditVcsRepositoryForm.validate(formData)) - resp <- form match { + resp <- form match { case Validated.Invalid(errors) => BadRequest( views.html.editRepository(lang = language)( @@ -1677,7 +1677,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- user.validatedEmail match { + resp <- user.validatedEmail match { case false => Forbidden( views.html.errors @@ -1804,7 +1804,7 @@ ) ) formData <- Sync[F].delay(repo.map(EditVcsRepositoryForm.fromVcsRepository).map(_.toMap)) - resp <- (formData, repo) match { + resp <- (formData, repo) match { case (Some(formData), Some(repo)) => Ok( views.html.editRepository()( @@ -1876,7 +1876,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) repoAndId <- loadRepo(user.some)(repositoryOwnerName, repositoryName) - resp <- repoAndId.fold( + resp <- repoAndId.fold( NotFound( views.html.errors.repositoryNotFound(lang = language)( csrf = csrf, @@ -1898,7 +1898,7 @@ for { csrf <- Sync[F].delay(req.getCsrfToken) repoAndId <- loadRepo(None)(repositoryOwnerName, repositoryName) - resp <- repoAndId.fold( + resp <- repoAndId.fold( NotFound( views.html.errors.repositoryNotFound()( csrf = csrf, @@ -1921,7 +1921,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) repoAndId <- loadRepo(user.some)(repositoryOwnerName, repositoryName) - resp <- repoAndId.fold( + resp <- repoAndId.fold( NotFound( views.html.errors.repositoryNotFound(lang = language)( csrf = csrf, @@ -1943,7 +1943,7 @@ for { csrf <- Sync[F].delay(req.getCsrfToken) repoAndId <- loadRepo(None)(repositoryOwnerName, repositoryName) - resp <- repoAndId.fold( + resp <- repoAndId.fold( NotFound( views.html.errors.repositoryNotFound()( csrf = csrf, @@ -1966,7 +1966,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) repoAndId <- loadRepo(user.some)(repositoryOwnerName, repositoryName) - resp <- repoAndId.fold( + resp <- repoAndId.fold( NotFound( views.html.errors.repositoryNotFound(lang = language)( csrf = csrf, @@ -1989,7 +1989,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) repoAndId <- loadRepo(user.some)(repositoryOwnerName, repositoryName) - resp <- repoAndId.fold( + resp <- repoAndId.fold( NotFound( views.html.errors.repositoryNotFound(lang = language)( csrf = csrf, @@ -2011,7 +2011,7 @@ for { csrf <- Sync[F].delay(req.getCsrfToken) repoAndId <- loadRepo(None)(repositoryOwnerName, repositoryName) - resp <- repoAndId.fold( + resp <- repoAndId.fold( NotFound( views.html.errors.repositoryNotFound()( csrf = csrf, @@ -2044,7 +2044,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) repoAndId <- loadRepo(user.some)(repositoryOwnerName, repositoryName) - resp <- repoAndId.fold( + resp <- repoAndId.fold( NotFound( views.html.errors.repositoryNotFound(lang = language)( csrf = csrf, @@ -2064,7 +2064,7 @@ repositoryName ) / "patch" / DarcsHashPathParameter(hash) => for { - csrf <- Sync[F].delay(req.getCsrfToken) + csrf <- Sync[F].delay(req.getCsrfToken) repoAndId <- loadRepo(None)( repositoryOwnerName, repositoryName @@ -2092,7 +2092,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) repoAndId <- loadRepo(user.some)(repositoryOwnerName, repositoryName) - resp <- repoAndId.fold( + resp <- repoAndId.fold( NotFound( views.html.errors.repositoryNotFound(lang = language)( csrf = csrf, @@ -2112,7 +2112,7 @@ repositoryName ) / "stats" => for { - csrf <- Sync[F].delay(req.getCsrfToken) + csrf <- Sync[F].delay(req.getCsrfToken) repoAndId <- loadRepo(None)( repositoryOwnerName, repositoryName diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepository.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepository.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepository.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepository.scala 2025-06-20 12:12:52.691921998 +0000 @@ -133,7 +133,7 @@ def validate(s: String): ValidatedNec[String, VcsRepositoryName] = Option(s).map(_.trim.nonEmpty) match { case Some(true) => - val input = s.trim + val input = s.trim val miniumLength = if (input.length > 1) input.validNec @@ -412,7 +412,7 @@ def fromDarcsXmlLog(darcsLogEntry: scala.xml.Node): Option[VcsPatchSummary] = Try { val summary = (darcsLogEntry \ "summary").headOption - val added = summary + val added = summary .map(summary => (summary \ "add_file").flatMap(file => VcsPatchFilename.from(file.text)).toList) .getOrElse(List.empty) val modified = summary @@ -421,7 +421,7 @@ val filename = VcsPatchFilename.from(file.text) val added_lines = file \ "added_lines" \@ "num" val removed_lines = file \ "removed_lines" \@ "num" - val added = + val added = if (added_lines.nonEmpty && added_lines.forall(_.isDigit)) added_lines.toInt else @@ -492,13 +492,13 @@ */ def fromDarcsXmlLog(darcsLogEntry: scala.xml.Node): Option[VcsRepositoryPatchMetadata] = Try { - val author = VcsPatchAuthor.from(darcsLogEntry \@ "author") + val author = VcsPatchAuthor.from(darcsLogEntry \@ "author") val comment = (darcsLogEntry \ "comment").headOption .map(comment => DarcsCommentFilter.replaceFirstIn(comment.text, "").trim) .flatMap(VcsPatchComment.from) - val hash = VcsPatchHash.from(darcsLogEntry \@ "hash") - val name = (darcsLogEntry \ "name").headOption.map(_.text).flatMap(VcsPatchName.from) - val summary = VcsPatchSummary.fromDarcsXmlLog(darcsLogEntry) + val hash = VcsPatchHash.from(darcsLogEntry \@ "hash") + val name = (darcsLogEntry \ "name").headOption.map(_.text).flatMap(VcsPatchName.from) + val summary = VcsPatchSummary.fromDarcsXmlLog(darcsLogEntry) val timestamp = VcsPatchTimestamp.from( LocalDateTime.parse(darcsLogEntry \@ "date", DarcsDateFormat).atOffset(ZoneOffset.UTC) diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryStatistics.scala new-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryStatistics.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryStatistics.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/hub/VcsRepositoryStatistics.scala 2025-06-20 12:12:52.691921998 +0000 @@ -66,7 +66,7 @@ ): F[VcsRepositoryStatistics] = for { repositoryDirectory <- Sync[F].delay(ownerDirectory / repositoryName.toString) - languages <- Sync[F].delay( + languages <- Sync[F].delay( configuration.tokei.map(tokei => os.proc(tokei.toString).call(cwd = repositoryDirectory, check = false).out.text() ) diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/ssh/DarcsSftpFileSystemAccessor.scala new-smederee/modules/hub/src/main/scala/de/smederee/ssh/DarcsSftpFileSystemAccessor.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/ssh/DarcsSftpFileSystemAccessor.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/ssh/DarcsSftpFileSystemAccessor.scala 2025-06-20 12:12:52.691921998 +0000 @@ -70,7 +70,7 @@ @SuppressWarnings(Array("scalafix:DisableSyntax.throw")) override def resolveLocalFilePath(subsystem: SftpSubsystemProxy, rootDir: Path, remotePath: String): Path = { // FIXME: This works but is pretty clumsy/noisy. Find a way to kill the connection on the first illegal access. - val sshKeyOwnerId = subsystem.getServerSession().getAttribute(SshServerConfiguration.SshKeyOwnerIdAttribute) + val sshKeyOwnerId = subsystem.getServerSession().getAttribute(SshServerConfiguration.SshKeyOwnerIdAttribute) val accessIsPermitted = remotePath match { case DarcsSftpFileSystemAccessor.ExtractRepositoryOwnerAndName(owner, repository, path) => log.debug("SFTP permission check for {} on {}/{} ({})", sshKeyOwnerId, owner, repository, path) @@ -83,7 +83,7 @@ } accessIsPermitted.filter(_ === true) match { case Some(true) => super.resolveLocalFilePath(subsystem, rootDir, remotePath) - case _ => + case _ => throw new InvalidPathException(remotePath, "You are only allowed to access your own repositories!") } } diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/ssh/DarcsSshCommand.scala new-smederee/modules/hub/src/main/scala/de/smederee/ssh/DarcsSshCommand.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/ssh/DarcsSshCommand.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/ssh/DarcsSshCommand.scala 2025-06-20 12:12:52.691921998 +0000 @@ -140,7 +140,7 @@ List("apply", "--all", "--debug", "--repodir", repoDir.toString) else List("apply", "--all", "--repodir", repoDir.toString) - val cmd = os.proc(darcsConfiguration.executable.toString, options) + val cmd = os.proc(darcsConfiguration.executable.toString, options) val thread = new Thread { override def run(): Unit = { val result = commandLogic(cmd) @@ -188,7 +188,7 @@ override def start(channel: ChannelSession, env: Environment): Unit = { log.debug(s"DarcsTransferMode for $owner/$repository") val repoDir = Paths.get(owner.toString, repository.toString) - val cmd = os.proc( + val cmd = os.proc( darcsConfiguration.executable.toString, List("transfer-mode", "--repodir", repoDir.toString) ) diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/ssh/PublicSshKey.scala new-smederee/modules/hub/src/main/scala/de/smederee/ssh/PublicSshKey.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/ssh/PublicSshKey.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/ssh/PublicSshKey.scala 2025-06-20 12:12:52.691921998 +0000 @@ -238,7 +238,7 @@ * An option to the sucessfully created [[PublicSshKey]]. */ def from(id: UUID)(ownerId: UserId)(createdAt: OffsetDateTime)(sshKey: SshPublicKeyString): Option[PublicSshKey] = { - val keyType = SshKeyType.from(sshKey.toString) + val keyType = SshKeyType.from(sshKey.toString) val base64Key = EncodedKeyBytes.from( sshKey.toString.dropWhile(char => !char.isWhitespace).trim.takeWhile(char => !char.isWhitespace) ) diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/ssh/SshAuthenticator.scala new-smederee/modules/hub/src/main/scala/de/smederee/ssh/SshAuthenticator.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/ssh/SshAuthenticator.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/ssh/SshAuthenticator.scala 2025-06-20 12:12:52.691921998 +0000 @@ -54,7 +54,7 @@ ) convertedName <- IO.delay(SshUsername.from(providedUsername)) usernameIsValid <- IO.delay(convertedName.exists(_ === genericUser)) - keyIsValid <- + keyIsValid <- if (usernameIsValid) for { fingerprint <- IO.delay( @@ -68,7 +68,7 @@ ) ) providedKeyBytes <- IO.delay(providedPublicKey.getEncoded()) - possibleUserKey <- fingerprint match { + possibleUserKey <- fingerprint match { case None => IO.pure(None) case Some(fingerprint) => repository.findSshKey(fingerprint) } diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/Assignee.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/Assignee.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/Assignee.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/Assignee.scala 2025-06-20 12:12:52.691921998 +0000 @@ -105,7 +105,7 @@ def validate(s: String): ValidatedNec[String, AssigneeName] = Option(s).map(_.trim.nonEmpty) match { case Some(true) => - val input = s.trim + val input = s.trim val miniumLength = if (input.length >= 2) input.validNec diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/config/SmedereeTicketsConfiguration.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/config/SmedereeTicketsConfiguration.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/config/SmedereeTicketsConfiguration.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/config/SmedereeTicketsConfiguration.scala 2025-06-20 12:12:52.695921989 +0000 @@ -19,7 +19,7 @@ final case class HubIntegrationConfiguration(baseUri: Uri) object HubIntegrationConfiguration { - given ConfigReader[Uri] = ConfigReader.fromStringOpt(s => Uri.fromString(s).toOption) + given ConfigReader[Uri] = ConfigReader.fromStringOpt(s => Uri.fromString(s).toOption) given ConfigReader[HubIntegrationConfiguration] = ConfigReader.forProduct1("base-uri")(HubIntegrationConfiguration.apply) } diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieLabelRepository.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieLabelRepository.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieLabelRepository.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieLabelRepository.scala 2025-06-20 12:12:52.691921998 +0000 @@ -46,7 +46,7 @@ override def deleteLabel(label: Label): F[Int] = label.id match { - case None => Sync[F].pure(0) + case None => Sync[F].pure(0) case Some(id) => sql"""DELETE FROM tickets.labels WHERE id = $id""".update.run.transact(tx) } @@ -59,7 +59,7 @@ override def updateLabel(label: Label): F[Int] = label.id match { - case None => Sync[F].pure(0) + case None => Sync[F].pure(0) case Some(id) => sql"""UPDATE tickets.labels SET name = ${label.name}, diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieMilestoneRepository.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieMilestoneRepository.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieMilestoneRepository.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieMilestoneRepository.scala 2025-06-20 12:12:52.691921998 +0000 @@ -66,7 +66,7 @@ val milestoneFilter = fr""""tickets".id IN (SELECT ticket FROM "tickets".milestone_tickets AS "milestone_tickets" WHERE milestone = $milestoneId)""" val tickets = filter match { - case None => selectTicketColumns ++ whereAnd(milestoneFilter) + case None => selectTicketColumns ++ whereAnd(milestoneFilter) case Some(filter) => val numberFilter = filter.number.toNel.map(numbers => Fragments.in(fr""""tickets".number""", numbers)) val statusFilter = filter.status.toNel.map(status => Fragments.in(fr""""tickets".status""", status)) @@ -122,7 +122,7 @@ override def updateMilestone(milestone: Milestone): F[Int] = milestone.id match { - case None => Sync[F].pure(0) + case None => Sync[F].pure(0) case Some(id) => sql"""UPDATE "tickets"."milestones" SET title = ${milestone.title}, diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieTicketRepository.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieTicketRepository.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieTicketRepository.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/DoobieTicketRepository.scala 2025-06-20 12:12:52.691921998 +0000 @@ -106,7 +106,7 @@ override def addLabel(projectId: ProjectId)(ticketNumber: TicketNumber)(label: Label): F[Int] = label.id match { - case None => Sync[F].pure(0) + case None => Sync[F].pure(0) case Some(labelId) => sql"""INSERT INTO tickets.ticket_labels ( ticket, @@ -121,7 +121,7 @@ override def addMilestone(projectId: ProjectId)(ticketNumber: TicketNumber)(milestone: Milestone): F[Int] = milestone.id match { - case None => Sync[F].pure(0) + case None => Sync[F].pure(0) case Some(milestoneId) => sql"""INSERT INTO tickets.milestone_tickets ( ticket, @@ -136,11 +136,11 @@ override def allTickets(filter: Option[TicketFilter])(projectId: ProjectId): Stream[F, Ticket] = { val projectFilter = fr"""tickets.project = $projectId""" - val tickets = filter match { - case None => selectTicketColumns ++ whereAnd(projectFilter) + val tickets = filter match { + case None => selectTicketColumns ++ whereAnd(projectFilter) case Some(filter) => - val numberFilter = filter.number.toNel.map(numbers => Fragments.in(fr"""tickets.number""", numbers)) - val statusFilter = filter.status.toNel.map(status => Fragments.in(fr"""tickets.status""", status)) + val numberFilter = filter.number.toNel.map(numbers => Fragments.in(fr"""tickets.number""", numbers)) + val statusFilter = filter.status.toNel.map(status => Fragments.in(fr"""tickets.status""", status)) val resolutionFilter = filter.resolution.toNel.map(resolutions => Fragments.in(fr"""tickets.resolution""", resolutions)) val submitterFilter = @@ -264,7 +264,7 @@ override def removeLabel(projectId: ProjectId)(ticket: Ticket)(label: Label): F[Int] = label.id match { - case None => Sync[F].pure(0) + case None => Sync[F].pure(0) case Some(labelId) => val sqlQuery = withTicketId(projectId, ticket.number) ++ fr"""DELETE FROM tickets.ticket_labels AS labels @@ -275,7 +275,7 @@ override def removeMilestone(projectId: ProjectId)(ticket: Ticket)(milestone: Milestone): F[Int] = milestone.id match { - case None => Sync[F].pure(0) + case None => Sync[F].pure(0) case Some(milestoneId) => val sqlQuery = withTicketId(projectId, ticket.number) ++ fr"""DELETE FROM tickets.milestone_tickets AS milestone_tickets diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/LabelForm.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/LabelForm.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/LabelForm.scala 2025-06-20 12:12:52.675922034 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/LabelForm.scala 2025-06-20 12:12:52.691921998 +0000 @@ -102,8 +102,8 @@ */ def toMap: Map[String, Chain[String]] = Map( - LabelForm.fieldId.toString -> form.id.map(_.toString).fold(Chain.empty)(id => Chain(id)), - LabelForm.fieldName.toString -> Chain(form.name.toString), + LabelForm.fieldId.toString -> form.id.map(_.toString).fold(Chain.empty)(id => Chain(id)), + LabelForm.fieldName.toString -> Chain(form.name.toString), LabelForm.fieldDescription.toString -> form.description .map(_.toString) .fold(Chain.empty)(d => Chain(d)), diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/LabelRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/LabelRoutes.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/LabelRoutes.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/LabelRoutes.scala 2025-06-20 12:12:52.691921998 +0000 @@ -66,10 +66,10 @@ _ <- Sync[F].delay(log.debug(s"doShowLabels: $csrf, $user, $projectOwnerName, $projectName")) language <- Sync[F].delay(user.flatMap(_.language).getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some((project, projectId)) => for { - labels <- labelRepo.allLabels(projectId).compile.toList + labels <- labelRepo.allLabels(projectId).compile.toList projectBaseUri <- Sync[F].delay( linkConfig.createFullUri( Uri(path = @@ -117,9 +117,9 @@ currentUser: Option[Account] )(projectOwnerName: ProjectOwnerName, projectName: ProjectName): F[Option[(Project, ProjectId)]] = for { - owner <- projectRepo.findProjectOwner(projectOwnerName) + owner <- projectRepo.findProjectOwner(projectOwnerName) loadedRepo <- owner match { - case None => Sync[F].pure(None) + case None => Sync[F].pure(None) case Some(owner) => ( projectRepo.findProject(owner, projectName), @@ -131,7 +131,7 @@ } // TODO: Replace with whatever we implement as proper permission model. ;-) projectAndId = currentUser match { - case None => loadedRepo.filter(tuple => tuple._1.isPrivate === false) + case None => loadedRepo.filter(tuple => tuple._1.isPrivate === false) case Some(user) => loadedRepo.filter(tuple => tuple._1.isPrivate === false || tuple._1.owner.uid === ProjectOwnerId.fromUserId(user.uid) @@ -149,7 +149,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some(project, projectId) => for { _ <- Sync[F].raiseUnless(project.owner.uid === ProjectOwnerId.fromUserId(user.uid))( @@ -157,7 +157,7 @@ ) formData <- Sync[F].delay(urlForm.values) form <- Sync[F].delay(LabelForm.validate(formData)) - labels <- projectAndId.traverse(tuple => + labels <- projectAndId.traverse(tuple => labelRepo.allLabels(tuple._2).compile.toList ) projectBaseUri <- Sync[F].delay( @@ -194,7 +194,7 @@ Label(None, labelData.name, labelData.description, labelData.colour) for { checkDuplicate <- labelRepo.findLabel(projectId)(labelData.name) - resp <- checkDuplicate match { + resp <- checkDuplicate match { case None => labelRepo.createLabel(projectId)(label) *> SeeOther( Location(projectBaseUri.addSegment("labels")) @@ -233,7 +233,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- InternalServerError( + resp <- InternalServerError( views.html.errors.internalServerError(lang = language)(csrf, user.some) ) } yield resp @@ -249,17 +249,17 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some(project, projectId) => for { _ <- Sync[F].raiseUnless(project.owner.uid === ProjectOwnerId.fromUserId(user.uid))( new Error("Only maintainers may add labels!") ) label <- labelRepo.findLabel(projectId)(labelName) - resp <- label match { + resp <- label match { case Some(label) => for { - formData <- Sync[F].delay(urlForm.values) + formData <- Sync[F].delay(urlForm.values) projectBaseUri <- Sync[F].delay( linkConfig.createFullUri( Uri(path = @@ -296,7 +296,7 @@ ) resp <- (labelIdMatches && labelNameMatches && userIsSure) match { case false => BadRequest("Invalid form data!") - case true => + case true => labelRepo.deleteLabel(label) *> SeeOther( Location(projectBaseUri.addSegment("labels")) ) @@ -321,7 +321,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - label <- projectAndId match { + label <- projectAndId match { case Some((_, projectId)) => labelRepo.findLabel(projectId)(labelName) case _ => Sync[F].delay(None) } @@ -428,7 +428,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- InternalServerError( + resp <- InternalServerError( views.html.errors.internalServerError(lang = language)(csrf, user.some) ) } yield resp @@ -443,7 +443,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - label <- projectAndId match { + label <- projectAndId match { case Some((_, projectId)) => labelRepo.findLabel(projectId)(labelName) case _ => Sync[F].delay(None) } diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/MilestoneForm.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/MilestoneForm.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/MilestoneForm.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/MilestoneForm.scala 2025-06-20 12:12:52.691921998 +0000 @@ -113,8 +113,8 @@ */ def toMap: Map[String, Chain[String]] = Map( - MilestoneForm.fieldId.toString -> form.id.map(_.toString).fold(Chain.empty)(id => Chain(id)), - MilestoneForm.fieldTitle.toString -> Chain(form.title.toString), + MilestoneForm.fieldId.toString -> form.id.map(_.toString).fold(Chain.empty)(id => Chain(id)), + MilestoneForm.fieldTitle.toString -> Chain(form.title.toString), MilestoneForm.fieldDescription.toString -> form.description .map(_.toString) .fold(Chain.empty)(d => Chain(d)), diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/MilestoneRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/MilestoneRoutes.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/MilestoneRoutes.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/MilestoneRoutes.scala 2025-06-20 12:12:52.691921998 +0000 @@ -67,7 +67,7 @@ for { language <- Sync[F].delay(user.flatMap(_.language).getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user)(projectOwnerName, projectName) - milestone <- projectAndId match { + milestone <- projectAndId match { case Some((_, projectId)) => milestoneRepo.findMilestone(projectId)(milestoneTitle) case _ => Sync[F].delay(None) } @@ -140,10 +140,10 @@ for { language <- Sync[F].delay(user.flatMap(_.language).getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some((project, projectId)) => for { - milestones <- milestoneRepo.allMilestones(projectId).compile.toList + milestones <- milestoneRepo.allMilestones(projectId).compile.toList projectBaseUri <- Sync[F].delay( linkConfig.createFullUri( Uri(path = @@ -193,9 +193,9 @@ currentUser: Option[Account] )(projectOwnerName: Username, projectName: ProjectName): F[Option[(Project, ProjectId)]] = for { - owner <- projectRepo.findProjectOwner(projectOwnerName) + owner <- projectRepo.findProjectOwner(projectOwnerName) loadedRepo <- owner match { - case None => Sync[F].pure(None) + case None => Sync[F].pure(None) case Some(owner) => ( projectRepo.findProject(owner, projectName), @@ -207,7 +207,7 @@ } // TODO: Replace with whatever we implement as proper permission model. ;-) repoAndId = currentUser match { - case None => loadedRepo.filter(tuple => tuple._1.isPrivate === false) + case None => loadedRepo.filter(tuple => tuple._1.isPrivate === false) case Some(user) => loadedRepo.filter(tuple => tuple._1.isPrivate === false || tuple._1.owner.uid === ProjectOwnerId.fromUserId(user.uid) @@ -224,14 +224,14 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some(project, projectId) => for { _ <- Sync[F].raiseUnless(project.owner.uid === ProjectOwnerId.fromUserId(user.uid))( new Error("Only maintainers may add milestones!") ) - formData <- Sync[F].delay(urlForm.values) - form <- Sync[F].delay(MilestoneForm.validate(formData)) + formData <- Sync[F].delay(urlForm.values) + form <- Sync[F].delay(MilestoneForm.validate(formData)) milestones <- projectAndId.traverse(tuple => milestoneRepo.allMilestones(tuple._2).compile.toList ) @@ -322,14 +322,14 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some(project, projectId) => for { _ <- Sync[F].raiseUnless(project.owner.uid === ProjectOwnerId.fromUserId(user.uid))( new Error("Only maintainers may close milestones!") ) milestone <- milestoneRepo.findMilestone(projectId)(milestoneTitle) - resp <- milestone match { + resp <- milestone match { case Some(milestone) => for { formData <- Sync[F].delay { @@ -367,7 +367,7 @@ ) resp <- (milestoneIdMatches && milestoneTitleMatches) match { case false => BadRequest("Invalid form data!") - case true => + case true => milestone.id.traverse(milestoneRepo.closeMilestone) *> SeeOther( Location( projectBaseUri @@ -394,14 +394,14 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some(project, projectId) => for { _ <- Sync[F].raiseUnless(project.owner.uid === ProjectOwnerId.fromUserId(user.uid))( new Error("Only maintainers may add milestones!") ) milestone <- milestoneRepo.findMilestone(projectId)(milestoneTitle) - resp <- milestone match { + resp <- milestone match { case Some(milestone) => for { formData <- Sync[F].delay { @@ -440,7 +440,7 @@ ) resp <- (milestoneIdMatches && milestoneTitleMatches && userIsSure) match { case false => BadRequest("Invalid form data!") - case true => + case true => milestoneRepo.deleteMilestone(milestone) *> SeeOther( Location(projectBaseUri.addSegment("milestones")) ) @@ -464,7 +464,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - milestone <- projectAndId match { + milestone <- projectAndId match { case Some((_, projectId)) => milestoneRepo.findMilestone(projectId)(milestoneTitle) case _ => Sync[F].delay(None) } @@ -489,7 +489,7 @@ actionUri <- Sync[F].delay( projectBaseUri.addSegment("milestones").addSegment(milestone.title.toString) ) - formData <- Sync[F].delay(urlForm.values) + formData <- Sync[F].delay(urlForm.values) milestoneIdMatches <- Sync[F].delay( formData .get(MilestoneForm.fieldId) @@ -584,14 +584,14 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some(project, projectId) => for { _ <- Sync[F].raiseUnless(project.owner.uid === ProjectOwnerId.fromUserId(user.uid))( new Error("Only maintainers may open milestones!") ) milestone <- milestoneRepo.findMilestone(projectId)(milestoneTitle) - resp <- milestone match { + resp <- milestone match { case Some(milestone) => for { formData <- Sync[F].delay { @@ -629,7 +629,7 @@ ) resp <- (milestoneIdMatches && milestoneTitleMatches) match { case false => BadRequest("Invalid form data!") - case true => + case true => milestone.id.traverse(milestoneRepo.openMilestone) *> SeeOther( Location( projectBaseUri @@ -656,7 +656,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - milestone <- projectAndId match { + milestone <- projectAndId match { case Some((_, projectId)) => milestoneRepo.findMilestone(projectId)(milestoneTitle) case _ => Sync[F].delay(None) } diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/Project.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/Project.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/Project.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/Project.scala 2025-06-20 12:12:52.691921998 +0000 @@ -121,7 +121,7 @@ def validate(s: String): ValidatedNec[String, ProjectName] = Option(s).map(_.trim.nonEmpty) match { case Some(true) => - val input = s.trim + val input = s.trim val miniumLength = if (input.length > 1) input.validNec @@ -263,7 +263,7 @@ def validate(s: String): ValidatedNec[String, ProjectOwnerName] = Option(s).map(_.trim.nonEmpty) match { case Some(true) => - val input = s.trim + val input = s.trim val miniumLength = if (input.length >= 2) input.validNec diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/Submitter.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/Submitter.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/Submitter.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/Submitter.scala 2025-06-20 12:12:52.691921998 +0000 @@ -103,7 +103,7 @@ def validate(s: String): ValidatedNec[String, SubmitterName] = Option(s).map(_.trim.nonEmpty) match { case Some(true) => - val input = s.trim + val input = s.trim val miniumLength = if (input.length >= 2) input.validNec diff -rN -u old-smederee/modules/hub/src/main/scala/de/smederee/tickets/TicketRoutes.scala new-smederee/modules/hub/src/main/scala/de/smederee/tickets/TicketRoutes.scala --- old-smederee/modules/hub/src/main/scala/de/smederee/tickets/TicketRoutes.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/main/scala/de/smederee/tickets/TicketRoutes.scala 2025-06-20 12:12:52.695921989 +0000 @@ -72,9 +72,9 @@ currentUser: Option[Account] )(projectOwnerName: ProjectOwnerName, projectName: ProjectName): F[Option[(Project, ProjectId)]] = for { - owner <- projectRepo.findProjectOwner(projectOwnerName) + owner <- projectRepo.findProjectOwner(projectOwnerName) loadedRepo <- owner match { - case None => Sync[F].pure(None) + case None => Sync[F].pure(None) case Some(owner) => ( projectRepo.findProject(owner, projectName), @@ -86,7 +86,7 @@ } // TODO: Replace with whatever we implement as proper permission model. ;-) projectAndId = currentUser match { - case None => loadedRepo.filter(tuple => tuple._1.isPrivate === false) + case None => loadedRepo.filter(tuple => tuple._1.isPrivate === false) case Some(user) => loadedRepo.filter(tuple => tuple._1.isPrivate === false || tuple._1.owner.uid === ProjectOwnerId.fromUserId(user.uid) @@ -117,11 +117,11 @@ language <- Sync[F].delay(user.flatMap(_.language).getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user)(projectOwnerName, projectName) ticket <- projectAndId.traverse(tuple => ticketRepo.findTicket(tuple._2)(ticketNumber)) - resp <- (projectAndId, ticket.getOrElse(None)) match { + resp <- (projectAndId, ticket.getOrElse(None)) match { case (Some((project, projectId)), Some(ticket)) => for { - labels <- ticketRepo.loadLabels(projectId)(ticket.number).compile.toList - milestones <- ticketRepo.loadMilestones(projectId)(ticket.number).compile.toList + labels <- ticketRepo.loadLabels(projectId)(ticket.number).compile.toList + milestones <- ticketRepo.loadMilestones(projectId)(ticket.number).compile.toList projectBaseUri <- Sync[F].delay( linkConfig.createFullUri( Uri(path = @@ -186,10 +186,10 @@ _ <- Sync[F].delay(log.debug(s"doShowTickets: $csrf, $user, $projectOwnerName, $projectName, $filter")) language <- Sync[F].delay(user.flatMap(_.language).getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some((project, projectId)) => for { - tickets <- ticketRepo.allTickets(filter)(projectId).compile.toList + tickets <- ticketRepo.allTickets(filter)(projectId).compile.toList projectBaseUri <- Sync[F].delay( linkConfig.createFullUri( Uri(path = @@ -239,7 +239,7 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some((project, projectId)) => for { _ <- Sync[F].raiseUnless( @@ -247,10 +247,10 @@ )( new Error("Only maintainers may add tickets!") ) - labels <- labelRepo.allLabels(projectId).compile.toList - milestones <- milestoneRepo.allMilestones(projectId).compile.toList - formData <- Sync[F].delay(urlForm.values) - form <- Sync[F].delay(TicketForm.validate(formData)) + labels <- labelRepo.allLabels(projectId).compile.toList + milestones <- milestoneRepo.allMilestones(projectId).compile.toList + formData <- Sync[F].delay(urlForm.values) + form <- Sync[F].delay(TicketForm.validate(formData)) projectBaseUri <- Sync[F].delay( linkConfig.createFullUri( Uri(path = @@ -286,7 +286,7 @@ ) case Validated.Valid(ticketData) => for { - timestamp <- Sync[F].delay(OffsetDateTime.now(ZoneOffset.UTC)) + timestamp <- Sync[F].delay(OffsetDateTime.now(ZoneOffset.UTC)) ticketLabels <- ticketData.labels.traverse(name => labelRepo.findLabel(projectId)(name) ) @@ -328,7 +328,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- InternalServerError( + resp <- InternalServerError( views.html.errors.internalServerError(lang = language)(csrf, user.some) ) } yield resp @@ -348,7 +348,7 @@ language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) ticket <- projectAndId.traverse(tuple => ticketRepo.findTicket(tuple._2)(ticketNumber)) - resp <- (projectAndId, ticket.getOrElse(None)) match { + resp <- (projectAndId, ticket.getOrElse(None)) match { case (Some((project, projectId)), Some(ticket)) => for { _ <- Sync[F].raiseUnless( @@ -356,10 +356,10 @@ )( new Error("Only maintainers may edit tickets!") ) - labels <- labelRepo.allLabels(projectId).compile.toList - milestones <- milestoneRepo.allMilestones(projectId).compile.toList - formData <- Sync[F].delay(urlForm.values) - form <- Sync[F].delay(TicketForm.validate(formData)) + labels <- labelRepo.allLabels(projectId).compile.toList + milestones <- milestoneRepo.allMilestones(projectId).compile.toList + formData <- Sync[F].delay(urlForm.values) + form <- Sync[F].delay(TicketForm.validate(formData)) projectBaseUri <- Sync[F].delay( linkConfig.createFullUri( Uri(path = @@ -414,7 +414,7 @@ labelsToRemove = oldLabels.diff(ticketLabels.flatten) milestonesToCreate = ticketMilestones.flatten.diff(oldMilestones) milestonesToRemove = oldMilestones.diff(ticketMilestones.flatten) - updatedTicket = + updatedTicket = ticket.copy( title = ticketData.title, content = ticketData.content, @@ -448,7 +448,7 @@ for { csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) - resp <- InternalServerError( + resp <- InternalServerError( views.html.errors.internalServerError(lang = language)(csrf, user.some) ) } yield resp @@ -465,11 +465,11 @@ csrf <- Sync[F].delay(ar.req.getCsrfToken) language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) - resp <- projectAndId match { + resp <- projectAndId match { case Some((project, projectId)) => for { - labels <- labelRepo.allLabels(projectId).compile.toList - milestones <- milestoneRepo.allMilestones(projectId).compile.toList + labels <- labelRepo.allLabels(projectId).compile.toList + milestones <- milestoneRepo.allMilestones(projectId).compile.toList projectBaseUri <- Sync[F].delay( linkConfig.createFullUri( Uri(path = @@ -522,7 +522,7 @@ language <- Sync[F].delay(user.language.getOrElse(LanguageCode("en"))) projectAndId <- loadProject(user.some)(projectOwnerName, projectName) ticket <- projectAndId.traverse(tuple => ticketRepo.findTicket(tuple._2)(ticketNumber)) - resp <- (projectAndId, ticket.getOrElse(None)) match { + resp <- (projectAndId, ticket.getOrElse(None)) match { case (Some((project, projectId)), Some(ticket)) => for { ticketLabels <- ticketRepo @@ -538,7 +538,7 @@ form <- Sync[F].delay(TicketForm.fromTicket(ticketLabels)(ticketMilestones)(ticket)) formData <- Sync[F].delay(form.toMap) labels <- labelRepo.allLabels(projectId).compile.toList - milestones <- milestoneRepo.allMilestones(projectId).compile.toList + milestones <- milestoneRepo.allMilestones(projectId).compile.toList projectBaseUri <- Sync[F].delay( linkConfig.createFullUri( Uri(path = diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/AuthenticationMiddlewareTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/AuthenticationMiddlewareTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/AuthenticationMiddlewareTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/AuthenticationMiddlewareTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -26,8 +26,8 @@ test("extractSessionId must return the session id".tag(NeedsDatabase)) { PropF.forAllF { (signAndValidate: SignAndValidate, sessionId: SessionId) => - val clock = java.time.Clock.systemUTC - val token = signAndValidate.signToken(sessionId.toString)(clock.millis.toString) + val clock = java.time.Clock.systemUTC + val token = signAndValidate.signToken(sessionId.toString)(clock.millis.toString) val request = Request[IO](method = Method.GET) .addCookie(RequestCookie(Constants.authenticationCookieName.toString, token.toString)) val test = for { @@ -48,7 +48,7 @@ val session = s.copy(uid = account.uid, createdAt = createdAt) val timeouts = AuthenticationTimeouts(duration, duration, duration) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -77,7 +77,7 @@ val session = s.copy(uid = account.uid, createdAt = createdAt) val timeouts = AuthenticationTimeouts(duration, duration, duration) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -101,7 +101,7 @@ val session = s.copy(uid = account.uid) val timeouts = AuthenticationTimeouts(duration, duration, duration) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/AuthenticationRoutesTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/AuthenticationRoutesTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/AuthenticationRoutesTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/AuthenticationRoutesTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -116,7 +116,7 @@ test("POST /login must return 400 - Bad Request if the form data is invalid") { val expectedErrors = LoginForm.validate(Map.empty).leftMap(FormErrors.fromNec).swap.toOption.get - val expectedHtml = + val expectedHtml = views.html.login()(loginPath, None, resetPath, title = "Smederee - Login to your account".some)(formErrors = expectedErrors ) @@ -335,7 +335,7 @@ assertEquals(result.status, Status.SeeOther) assert(body.isEmpty, "Response body must be empty!") result.cookies.find(_.name === Constants.authenticationCookieName.toString).map(_.content) match { - case None => fail("Authentication cookie not set!") + case None => fail("Authentication cookie not set!") case Some(content) => assert(SignedToken.from(content).flatMap(signAndValidate.validate).nonEmpty) } diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/BaseSpec.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/BaseSpec.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/BaseSpec.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/BaseSpec.scala 2025-06-20 12:12:52.695921989 +0000 @@ -57,8 +57,8 @@ */ private def connect(dbConfig: DatabaseConfig): IO[java.sql.Connection] = for { - _ <- IO(Class.forName(dbConfig.driver)) - database <- IO(dbConfig.url.split("/").reverse.take(1).mkString) + _ <- IO(Class.forName(dbConfig.driver)) + database <- IO(dbConfig.url.split("/").reverse.take(1).mkString) connection <- IO( java.sql.DriverManager .getConnection(dbConfig.url.replace(database, "template1"), dbConfig.user, dbConfig.pass) @@ -74,7 +74,7 @@ db.use { connection => for { statement <- IO(connection.createStatement()) - exists <- IO( + exists <- IO( statement.executeQuery( s"""SELECT datname FROM pg_catalog.pg_database WHERE datname = '$database'""" ) @@ -186,9 +186,9 @@ _ <- IO.delay(statement.setInt(6, attempts.getOrElse(1))) _ <- IO.delay(statement.setBoolean(7, account.validatedEmail)) _ <- (unlockToken, validationToken) match { - case (None, None) => IO.unit - case (Some(ut), None) => IO.delay(statement.setString(8, ut.toString)) - case (None, Some(vt)) => IO.delay(statement.setString(8, vt.toString)) + case (None, None) => IO.unit + case (Some(ut), None) => IO.delay(statement.setString(8, ut.toString)) + case (None, Some(vt)) => IO.delay(statement.setString(8, vt.toString)) case (Some(ut), Some(vt)) => IO.delay { statement.setString(8, ut.toString) @@ -309,8 +309,8 @@ """SELECT uid, name, email, full_name, password, created_at, updated_at, validated_email, language FROM hub.accounts WHERE uid = ? LIMIT 1""" ) ) - _ <- IO.delay(statement.setObject(1, uid)) - result <- IO.delay(statement.executeQuery) + _ <- IO.delay(statement.setObject(1, uid)) + result <- IO.delay(statement.executeQuery) account <- IO.delay { if (result.next()) { val language = @@ -352,8 +352,8 @@ statement <- IO.delay( con.prepareStatement("""SELECT password FROM hub.accounts WHERE uid = ? LIMIT 1""") ) - _ <- IO.delay(statement.setObject(1, uid)) - result <- IO.delay(statement.executeQuery) + _ <- IO.delay(statement.setObject(1, uid)) + result <- IO.delay(statement.executeQuery) password <- IO.delay { if (result.next()) { Option(result.getString("password")).flatMap(PasswordHash.from) @@ -382,8 +382,8 @@ """SELECT reset_expiry, reset_token FROM hub.accounts WHERE uid = ? LIMIT 1""" ) ) - _ <- IO.delay(statement.setObject(1, uid)) - result <- IO.delay(statement.executeQuery) + _ <- IO.delay(statement.setObject(1, uid)) + result <- IO.delay(statement.executeQuery) columns <- IO.delay { if (result.next()) { val expiry = @@ -421,8 +421,8 @@ """SELECT validated_email, validation_token FROM hub.accounts WHERE uid = ? LIMIT 1""" ) ) - _ <- IO.delay(statement.setObject(1, uid)) - result <- IO.delay(statement.executeQuery) + _ <- IO.delay(statement.setObject(1, uid)) + result <- IO.delay(statement.executeQuery) columns <- IO.delay { if (result.next()) { Option( @@ -458,9 +458,9 @@ """SELECT id FROM hub.repositories WHERE owner = ? AND name = ? LIMIT 1""" ) ) - _ <- IO.delay(statement.setObject(1, owner)) - _ <- IO.delay(statement.setString(2, name.toString)) - result <- IO.delay(statement.executeQuery) + _ <- IO.delay(statement.setObject(1, owner)) + _ <- IO.delay(statement.setString(2, name.toString)) + result <- IO.delay(statement.executeQuery) account <- IO.delay { if (result.next()) { VcsRepositoryId.from(result.getLong("id")) diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/config/ServiceConfigTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/config/ServiceConfigTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/config/ServiceConfigTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/config/ServiceConfigTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -76,7 +76,7 @@ .at(s"${SmedereeHubConfig.location.toString}.service") .load[ServiceConfig] match { case Left(errors) => fail(errors.toList.mkString(", ")) - case Right(cfg) => + case Right(cfg) => val externalCfg = cfg.external assert(externalCfg.host === cfg.host) assert(externalCfg.port === Option(cfg.port)) diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/DatabaseMigratorTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/DatabaseMigratorTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/DatabaseMigratorTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/DatabaseMigratorTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -31,7 +31,7 @@ test("DatabaseMigrator must not update an up to date database".tag(NeedsDatabase)) { val dbConfig = configuration.database val migrator = new DatabaseMigrator[IO] - val test = for { + val test = for { _ <- migrator.migrate(dbConfig.url, dbConfig.user, dbConfig.pass) r <- migrator.migrate(dbConfig.url, dbConfig.user, dbConfig.pass) } yield r diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieAccountManagementRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieAccountManagementRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieAccountManagementRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieAccountManagementRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -60,7 +60,7 @@ PropF.forAllF { (account: Account) => val sshKey = sshKeyWithComment() val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -70,7 +70,7 @@ val repo = new DoobieAccountManagementRepository[IO](tx) val attempts = scala.util.Random.nextInt(128) val hash = PasswordHash("Yet another weak password!") - val test = for { + val test = for { _ <- createAccount(account, hash, None, Option(attempts)) w <- repo.addSshKey(sshKey.copy(ownerId = account.uid)) keys <- repo.listSshKeys(account.uid).compile.toList @@ -87,7 +87,7 @@ PropF.forAllF { (account: Account) => val sshKey = sshKeyWithoutComment() val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -97,7 +97,7 @@ val repo = new DoobieAccountManagementRepository[IO](tx) val attempts = scala.util.Random.nextInt(128) val hash = PasswordHash("Yet another weak password!") - val test = for { + val test = for { _ <- createAccount(account, hash, None, Option(attempts)) _ <- repo.addSshKey(sshKey.copy(ownerId = account.uid)) _ <- repo.addSshKey(sshKey.copy(ownerId = account.uid)) @@ -111,7 +111,7 @@ test("deleteAccount must remove the account from the database".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -121,7 +121,7 @@ val repo = new DoobieAccountManagementRepository[IO](tx) val attempts = scala.util.Random.nextInt(128) val hash = PasswordHash("Yet another weak password!") - val test = for { + val test = for { _ <- createAccount(account, hash, None, Option(attempts)) _ <- repo.deleteAccount(account.uid) o <- loadAccount(account.uid) @@ -137,7 +137,7 @@ val account = ac.copy(validatedEmail = true) val token = ValidationToken.generate val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -157,7 +157,7 @@ test("findPasswordHash must return correct hash".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -167,7 +167,7 @@ val repo = new DoobieAccountManagementRepository[IO](tx) val attempts = scala.util.Random.nextInt(128) val hash = PasswordHash("Yet another weak password!") - val test = for { + val test = for { _ <- createAccount(account, hash, None, Option(attempts)) o <- repo.findPasswordHash(account.uid) } yield o @@ -182,7 +182,7 @@ val sshKeyA = sshKeyWithComment() val sshKeyB = sshKeyWithoutComment() val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -192,7 +192,7 @@ val repo = new DoobieAccountManagementRepository[IO](tx) val attempts = scala.util.Random.nextInt(128) val hash = PasswordHash("Yet another weak password!") - val test = for { + val test = for { _ <- createAccount(account, hash, None, Option(attempts)) _ <- repo.addSshKey(sshKeyA.copy(ownerId = account.uid)) _ <- repo.addSshKey(sshKeyB.copy(ownerId = account.uid)) @@ -211,7 +211,7 @@ val account = ac.copy(validatedEmail = true) val token = ValidationToken.generate val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -234,7 +234,7 @@ test("setLanguage must set the language".tag(NeedsDatabase)) { PropF.forAllF { (account: Account, language: LanguageCode) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -257,7 +257,7 @@ test("setLanguage must delete the language".tag(NeedsDatabase)) { PropF.forAllF { (account: Account, language: LanguageCode) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -282,7 +282,7 @@ PropF.forAllF { (account: Account) => val token = ValidationToken.generate val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieAuthenticationRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieAuthenticationRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieAuthenticationRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieAuthenticationRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -21,7 +21,7 @@ override def scalaCheckTestParameters = super.scalaCheckTestParameters.withMinSuccessfulTests(1) override def beforeEach(context: BeforeEach): Unit = { - val dbConfig = configuration.database + val dbConfig = configuration.database val flyway: Flyway = DatabaseMigrator.configureFlyway(dbConfig.url, dbConfig.user, dbConfig.pass).cleanDisabled(false).load() val _ = flyway.migrate() @@ -30,7 +30,7 @@ } override def afterEach(context: AfterEach): Unit = { - val dbConfig = configuration.database + val dbConfig = configuration.database val flyway: Flyway = DatabaseMigrator.configureFlyway(dbConfig.url, dbConfig.user, dbConfig.pass).cleanDisabled(false).load() val _ = flyway.migrate() @@ -41,7 +41,7 @@ PropF.forAllF { (accounts: NonEmptyList[Account]) => val expected = accounts.toList.map(_.copy(language = None)) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -66,7 +66,7 @@ PropF.forAllF { (s: Session, account: Account) => val session = s.copy(uid = account.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -90,7 +90,7 @@ test("createUserSession must fail if the user does not exist".tag(NeedsDatabase)) { PropF.forAllF { (session: Session) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -110,7 +110,7 @@ PropF.forAllF { (generatedSessions: NonEmptyList[Session], account: Account) => val sessions = generatedSessions.toList.map(_.copy(uid = account.uid)) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -136,7 +136,7 @@ PropF.forAllF { (s: Session, account: Account) => val session = s.copy(uid = account.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -163,7 +163,7 @@ test("findAccount must return an existing account".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -184,7 +184,7 @@ test("findAccount must not return a locked account".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -210,7 +210,7 @@ test("findAccountByEmail must return an existing account".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -231,7 +231,7 @@ test("findAccountByEmail must not return a locked account".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -257,7 +257,7 @@ test("findAccountByName must return an existing account".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -278,7 +278,7 @@ test("findAccountByName must not return a locked account".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -304,7 +304,7 @@ test("findLockedAccount must return a locked account".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -313,7 +313,7 @@ ) val repo = new DoobieAuthenticationRepository[IO](tx) val token = UnlockToken.generate - val test = for { + val test = for { _ <- createAccount(account, PasswordHash("I am not a password hash!"), Option(token), None) o <- repo.findLockedAccount(account.name)(token.some) } yield o @@ -326,7 +326,7 @@ test("findLockedAccount must return a locked account if no token is given".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -335,7 +335,7 @@ ) val repo = new DoobieAuthenticationRepository[IO](tx) val token = UnlockToken.generate - val test = for { + val test = for { _ <- createAccount(account, PasswordHash("I am not a password hash!"), Option(token), None) o <- repo.findLockedAccount(account.name)(None) } yield o @@ -348,7 +348,7 @@ test("findPasswordHashAndAttempts must return correct values".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -358,7 +358,7 @@ val repo = new DoobieAuthenticationRepository[IO](tx) val attempts = scala.util.Random.nextInt(128) val hash = PasswordHash("Yet another weak password!") - val test = for { + val test = for { _ <- createAccount(account, hash, None, Option(attempts)) o <- repo.findPasswordHashAndAttempts(account.uid) } yield o @@ -376,7 +376,7 @@ test("findPasswordHashAndAttempts must not return values for locked accounts".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -386,7 +386,7 @@ val repo = new DoobieAuthenticationRepository[IO](tx) val attempts = scala.util.Random.nextInt(128) val hash = PasswordHash("Yet another weak password!") - val test = for { + val test = for { _ <- createAccount(account, hash, Option(UnlockToken.generate), Option(attempts)) o <- repo.findPasswordHashAndAttempts(account.uid) } yield o @@ -400,7 +400,7 @@ PropF.forAllF { (s: Session, account: Account) => val session = s.copy(uid = account.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -422,7 +422,7 @@ test("incrementFailedAttempts must increment failed attempts by 1".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -432,7 +432,7 @@ val repo = new DoobieAuthenticationRepository[IO](tx) val attempts = scala.util.Random.nextInt(128) val hash = PasswordHash("Yet another weak password!") - val test = for { + val test = for { _ <- createAccount(account, hash, None, Option(attempts)) before <- repo.findPasswordHashAndAttempts(account.uid) _ <- repo.incrementFailedAttempts(account.uid) @@ -451,7 +451,7 @@ test("lockAccount must lock an account".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -460,7 +460,7 @@ ) val repo = new DoobieAuthenticationRepository[IO](tx) val token = UnlockToken.generate - val test = for { + val test = for { _ <- createAccount(account, PasswordHash("I am not a password hash!"), None, None) before <- repo.findAccount(account.uid) _ <- repo.lockAccount(account.uid)(Option(token)) diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieOrganisationRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieOrganisationRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieOrganisationRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieOrganisationRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -25,7 +25,7 @@ val accounts = genAccounts.toList.drop(1) val organisation = org.copy(owner = owner.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -53,7 +53,7 @@ val accounts = genAccounts.toList.drop(1) val organisation = org.copy(owner = owner.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -79,7 +79,7 @@ PropF.forAllF { (account: Account, org: Organisation) => val organisation = org.copy(owner = account.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -101,7 +101,7 @@ PropF.forAllF { (owner: Account, member: Account, orgs: NonEmptyList[Organisation]) => val organisations = orgs.toList.map(_.copy(owner = owner.uid)) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -130,7 +130,7 @@ PropF.forAllF { (account: Account, orgs: NonEmptyList[Organisation]) => val organisations = orgs.toList.map(_.copy(owner = account.uid)) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -156,7 +156,7 @@ PropF.forAllF { (account: Account, org: Organisation) => val organisation = org.copy(owner = account.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -183,7 +183,7 @@ PropF.forAllF { (account: Account, org: Organisation) => val organisation = org.copy(owner = account.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -208,7 +208,7 @@ PropF.forAllF { (account: Account, org: Organisation) => val organisation = org.copy(owner = account.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -233,7 +233,7 @@ PropF.forAllF { (genAccount: Account) => val account = genAccount.copy(language = None, validatedEmail = true) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -256,7 +256,7 @@ val account = genAccount.copy(validatedEmail = true) val token = UnlockToken.generate val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -279,7 +279,7 @@ val account = genAccount.copy(validatedEmail = false) val token = ValidationToken.generate val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -301,7 +301,7 @@ PropF.forAllF { (account: Account, org: Organisation) => val organisation = org.copy(owner = account.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -326,7 +326,7 @@ PropF.forAllF { (as: NonEmptyList[Account], org: Organisation) => val owner = as.head val accounts = as.tail - val admins = accounts.zipWithLongIndex.foldLeft(List.empty[Account])((acc, tuple) => + val admins = accounts.zipWithLongIndex.foldLeft(List.empty[Account])((acc, tuple) => if (tuple._2 % 2 === 0) { tuple._1 :: acc } else { @@ -335,7 +335,7 @@ ) val organisation = org.copy(owner = owner.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -344,7 +344,7 @@ ) val repo = new DoobieOrganisationRepository[IO](tx) val addAdmin = repo.addAdministrator(organisation.oid) - val test = for { + val test = for { _ <- createAccount(owner, PasswordHash("I am not a password hash!"), None, None) _ <- accounts.traverse(a => createAccount(a, PasswordHash("I am not a password hash!"), None, None)) written <- repo.create(organisation) @@ -364,7 +364,7 @@ PropF.forAllF { (as: NonEmptyList[Account], org: Organisation) => val owner = as.head val accounts = as.tail - val members = accounts.zipWithLongIndex.foldLeft(List.empty[Account])((acc, tuple) => + val members = accounts.zipWithLongIndex.foldLeft(List.empty[Account])((acc, tuple) => if (tuple._2 % 2 === 0) { tuple._1 :: acc } else { @@ -373,7 +373,7 @@ ) val organisation = org.copy(owner = owner.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -382,7 +382,7 @@ ) val repo = new DoobieOrganisationRepository[IO](tx) val addMember = repo.addMember(organisation.oid) - val test = for { + val test = for { _ <- createAccount(owner, PasswordHash("I am not a password hash!"), None, None) _ <- accounts.traverse(a => createAccount(a, PasswordHash("I am not a password hash!"), None, None)) written <- repo.create(organisation) @@ -404,7 +404,7 @@ val accounts = as.tail val organisation = org.copy(owner = owner.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -433,7 +433,7 @@ val accounts = as.tail val organisation = org.copy(owner = owner.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -463,7 +463,7 @@ val organisation = org.copy(owner = account.uid) val updatedOrganisation = anotherOrg.copy(oid = organisation.oid, owner = organisation.owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieResetPasswordRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieResetPasswordRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieResetPasswordRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieResetPasswordRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -24,7 +24,7 @@ override def scalaCheckTestParameters = super.scalaCheckTestParameters.withMinSuccessfulTests(1) override def beforeEach(context: BeforeEach): Unit = { - val dbConfig = configuration.database + val dbConfig = configuration.database val flyway: Flyway = DatabaseMigrator.configureFlyway(dbConfig.url, dbConfig.user, dbConfig.pass).cleanDisabled(false).load() val _ = flyway.migrate() @@ -33,7 +33,7 @@ } override def afterEach(context: AfterEach): Unit = { - val dbConfig = configuration.database + val dbConfig = configuration.database val flyway: Flyway = DatabaseMigrator.configureFlyway(dbConfig.url, dbConfig.user, dbConfig.pass).cleanDisabled(false).load() val _ = flyway.migrate() @@ -46,7 +46,7 @@ val tokenExpiration = OffsetDateTime.now(ZoneOffset.UTC).plusDays(3L) val expected = user.copy(language = None) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -71,7 +71,7 @@ val token = ResetToken.generate val tokenExpiration = OffsetDateTime.now(ZoneOffset.UTC).plusDays(3L) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -96,7 +96,7 @@ val tokenExpiration = OffsetDateTime.now(ZoneOffset.UTC).plusDays(3L) val expected = user.copy(language = None) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -120,7 +120,7 @@ val token = ResetToken.generate val tokenExpiration = OffsetDateTime.now(ZoneOffset.UTC).minusDays(3L) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -144,7 +144,7 @@ val token = ResetToken.generate val tokenExpiration = OffsetDateTime.now(ZoneOffset.UTC).minusDays(3L) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -166,12 +166,12 @@ test("removeResetPasswordExpirationDate must remove the expiration date".tag(NeedsDatabase)) { PropF.forAllF { (user: Account) => - val token = ResetToken.generate + val token = ResetToken.generate val tokenExpiration = OffsetDateTime.now(ZoneOffset.UTC).plusDays(3L).withNano(0) // Nanos are troublesome! val expected = ((None, token.some)).some val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -193,12 +193,12 @@ test("removeResetPasswordToken must remove the token and the expiration date".tag(NeedsDatabase)) { PropF.forAllF { (user: Account) => - val token = ResetToken.generate + val token = ResetToken.generate val tokenExpiration = OffsetDateTime.now(ZoneOffset.UTC).plusDays(3L).withNano(0) // Nanos are troublesome! val expected = ((None, None)).some val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -223,7 +223,7 @@ val expected = Password("This is not the password you're looking for!".getBytes(StandardCharsets.UTF_8)).encode val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -244,12 +244,12 @@ test("setResetPasswordToken must set token and expiry date correctly".tag(NeedsDatabase)) { PropF.forAllF { (user: Account) => - val token = ResetToken.generate + val token = ResetToken.generate val tokenExpiration = OffsetDateTime.now(ZoneOffset.UTC).plusDays(3L).withNano(0) // Nanos are troublesome! val expected = ((tokenExpiration.some, token.some)).some val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieSignupRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieSignupRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieSignupRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieSignupRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -21,7 +21,7 @@ test("createAccount must create a new account".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -46,7 +46,7 @@ val existingAccount = a val newAccount = b.copy(email = a.email) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -74,7 +74,7 @@ val existingAccount = a val newAccount = b.copy(name = a.name) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -100,7 +100,7 @@ test("findEmail must return an existing email".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -123,7 +123,7 @@ test("findUsername must return an existing name".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieVcsMetadataRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieVcsMetadataRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieVcsMetadataRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/DoobieVcsMetadataRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -45,7 +45,7 @@ ) _ <- IO.delay(statement.setLong(1, originalRepoId.toLong)) result <- IO.delay(statement.executeQuery) - forks <- IO.delay { + forks <- IO.delay { var queue = Queue.empty[(VcsRepositoryId, VcsRepositoryId)] while (result.next()) queue = queue :+ ( @@ -73,7 +73,7 @@ vcsRepositories.tail.size / 2 } val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -87,7 +87,7 @@ ) written <- vcsRepositories.traverse(repo.createVcsRepository) original <- loadVcsRepositoryId(vcsRepositories.head.owner.uid, vcsRepositories.head.name) - toFork <- vcsRepositories.tail.take(numberOfForks).traverse { vcsRepository => + toFork <- vcsRepositories.tail.take(numberOfForks).traverse { vcsRepository => loadVcsRepositoryId(vcsRepository.owner.uid, vcsRepository.name) } forked <- (original, toFork) match { @@ -113,7 +113,7 @@ PropF.forAllF { (account: Account, repository: VcsRepository) => val vcsRepository = repository.copy(owner = account.toVcsRepositoryOwner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -134,7 +134,7 @@ test("createVcsRepository must fail if the user does not exist".tag(NeedsDatabase)) { PropF.forAllF { (repository: VcsRepository) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -153,7 +153,7 @@ PropF.forAllF { (account: Account, repository: VcsRepository) => val vcsRepository = repository.copy(owner = account.toVcsRepositoryOwner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -174,7 +174,7 @@ PropF.forAllF { (account: Account, repository: VcsRepository, health: VcsRepositoryHealth) => val vcsRepository = repository.copy(owner = account.toVcsRepositoryOwner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -204,7 +204,7 @@ PropF.forAllF { (account: Account, repository: VcsRepository) => val vcsRepository = repository.copy(owner = account.toVcsRepositoryOwner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -242,7 +242,7 @@ vcsRepositories.tail.size / 2 } val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -256,7 +256,7 @@ ) written <- vcsRepositories.traverse(repo.createVcsRepository) original <- loadVcsRepositoryId(vcsRepositories.head.owner.uid, vcsRepositories.head.name) - toFork <- vcsRepositories.tail.take(numberOfForks).traverse { vcsRepository => + toFork <- vcsRepositories.tail.take(numberOfForks).traverse { vcsRepository => loadVcsRepositoryId(vcsRepository.owner.uid, vcsRepository.name) } forked <- (original, toFork) match { @@ -287,7 +287,7 @@ PropF.forAllF { (account: Account, repository: VcsRepository) => val vcsRepository = repository.copy(owner = account.toVcsRepositoryOwner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -315,7 +315,7 @@ PropF.forAllF { (accounts: NonEmptyList[Account]) => val expectedOwner = accounts.toList(scala.util.Random.nextInt(accounts.size)).toVcsRepositoryOwner val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -357,7 +357,7 @@ vcsRepositories.tail.size / 2 } val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -371,7 +371,7 @@ ) written <- vcsRepositories.traverse(repo.createVcsRepository) original <- loadVcsRepositoryId(vcsRepositories.head.owner.uid, vcsRepositories.head.name) - toFork <- vcsRepositories.tail.take(numberOfForks).traverse { vcsRepository => + toFork <- vcsRepositories.tail.take(numberOfForks).traverse { vcsRepository => loadVcsRepositoryId(vcsRepository.owner.uid, vcsRepository.name) } forked <- (original, toFork) match { @@ -398,7 +398,7 @@ val organisation = org.copy(owner = account.uid) val vcsRepository = repository.copy(owner = account.toVcsRepositoryOwner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -428,7 +428,7 @@ val organisation = org.copy(owner = account.uid) val vcsRepository = repository.copy(owner = account.toVcsRepositoryOwner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -452,7 +452,7 @@ test("listAllRepositories must return only public repositories for guest users".tag(NeedsDatabase)) { PropF.forAllF { (account: Account, repositories: NonEmptyList[VcsRepository]) => val vcsRepositories = repositories.toList - val accounts = vcsRepositories.map(repo => + val accounts = vcsRepositories.map(repo => Account( repo.owner.uid, repo.owner.name, @@ -464,7 +464,7 @@ ) val expectedRepoList = vcsRepositories.filter(_.isPrivate === false) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -494,7 +494,7 @@ test("listAllRepositories must return only public repositories of others for any user".tag(NeedsDatabase)) { PropF.forAllF { (account: Account, repositories: NonEmptyList[VcsRepository]) => val vcsRepositories = repositories.toList - val accounts = vcsRepositories.map(repo => + val accounts = vcsRepositories.map(repo => Account( repo.owner.uid, repo.owner.name, @@ -506,7 +506,7 @@ ) val expectedRepoList = vcsRepositories.filter(_.isPrivate === false) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -539,7 +539,7 @@ repositories.toList.filter(_.isPrivate === true).map(_.copy(owner = account.toVcsRepositoryOwner)) val publicRepos = repositories.toList.filter(_.isPrivate === false) val vcsRepositories = privateRepos ::: publicRepos - val accounts = publicRepos.map(repo => + val accounts = publicRepos.map(repo => Account( repo.owner.uid, repo.owner.name, @@ -551,7 +551,7 @@ ) val expectedRepoList = vcsRepositories val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -583,7 +583,7 @@ val vcsRepositories = repositories.toList.map(_.copy(owner = account.toVcsRepositoryOwner)) val expectedRepoList = vcsRepositories.filter(_.isPrivate === false).sortBy(_.name) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -614,7 +614,7 @@ val vcsRepositories = repositories.toList.map(_.copy(owner = account.toVcsRepositoryOwner)) val expectedRepoList = vcsRepositories.sortBy(_.name) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -645,7 +645,7 @@ val vcsRepositories = repositories.toList.map(_.copy(owner = account.toVcsRepositoryOwner)) val expectedRepoList = vcsRepositories.filter(_.isPrivate === false).sortBy(_.name) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -675,7 +675,7 @@ PropF.forAllF { (account: Account, repository: VcsRepository, health: VcsRepositoryHealth) => val vcsRepository = repository.copy(owner = account.toVcsRepositoryOwner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -705,7 +705,7 @@ val organisation = org.copy(owner = account.uid) val vcsRepository = repository.copy(owner = account.toVcsRepositoryOwner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -741,7 +741,7 @@ val organisation = org.copy(owner = account.uid) val vcsRepository = repository.copy(owner = account.toVcsRepositoryOwner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -768,7 +768,7 @@ test("updateVcsRepository must update all columns correctly".tag(NeedsDatabase)) { PropF.forAllF { (account: Account, repositories: NonEmptyList[VcsRepository]) => - val repository = repositories.head + val repository = repositories.head val vcsRepositories = repository.copy(owner = account.toVcsRepositoryOwner) :: repositories.toList .drop(1) .map( @@ -782,7 +782,7 @@ website = Option(uri"https://updated.example.com") ) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/Generators.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/Generators.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/Generators.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/Generators.scala 2025-06-20 12:12:52.695921989 +0000 @@ -47,7 +47,7 @@ minute <- Gen.choose(0, 59) second <- Gen.choose(0, 59) nanosecond <- Gen.const(0) // Avoid issues with loosing information during saving and loading. - offset <- Gen.oneOf( + offset <- Gen.oneOf( ZoneId.getAvailableZoneIds.asScala.toList.map(ZoneId.of).map(ZonedDateTime.now).map(_.getOffset) ) } yield OffsetDateTime.of(year, month, day, hour, minute, second, nanosecond, offset) @@ -86,8 +86,8 @@ private val validDomainNameChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-".toList val genValidEmail: Gen[EmailAddress] = for { - prefix <- Gen.nonEmptyListOf(Gen.oneOf(validEmailAddressPrefixChars)).map(_.take(64).mkString) - domain <- Gen.nonEmptyListOf(Gen.oneOf(validDomainNameChars)).map(_.take(32).mkString) + prefix <- Gen.nonEmptyListOf(Gen.oneOf(validEmailAddressPrefixChars)).map(_.take(64).mkString) + domain <- Gen.nonEmptyListOf(Gen.oneOf(validDomainNameChars)).map(_.take(32).mkString) topLevelDomain <- Gen .nonEmptyListOf(Gen.oneOf(validDomainNameChars)) .suchThat(_.length >= 2) @@ -101,7 +101,7 @@ val genValidUsername: Gen[Username] = for { length <- Gen.choose(2, 30) prefix <- Gen.alphaChar - chars <- Gen + chars <- Gen .nonEmptyListOf(Gen.alphaNumChar) .map(_.take(length).mkString.toLowerCase(Locale.ROOT)) } yield Username(prefix.toString.toLowerCase(Locale.ROOT) + chars) diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/hub/ResetPasswordRoutesTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/hub/ResetPasswordRoutesTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/hub/ResetPasswordRoutesTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/hub/ResetPasswordRoutesTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -33,7 +33,7 @@ PropF.forAllF { (account: Account) => val token = ResetToken.generate val changePasswordUri = resetChangePasswordPath.addSegment(token.toString) - val expectedHtml = views.html + val expectedHtml = views.html .changePassword()(changePasswordUri, None, title = "Smederee - Change your password.".some, token)() val authenticationConfig = configuration.service.authentication diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/ssh/DoobieSshAuthenticationRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/ssh/DoobieSshAuthenticationRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/ssh/DoobieSshAuthenticationRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/ssh/DoobieSshAuthenticationRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -23,7 +23,7 @@ test("findVcsRepositoryOwner must return the correct owner".tag(NeedsDatabase)) { PropF.forAllF { (account: Account) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/ssh/SshServerProviderTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/ssh/SshServerProviderTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/ssh/SshServerProviderTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/ssh/SshServerProviderTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -36,11 +36,11 @@ freePort.test("run() must create and start a server with the given configuration") { port => port match { - case None => fail("Could not find a free port for testing!") + case None => fail("Could not find a free port for testing!") case Some(portNumber) => val keyfile = serverKeyFile() val darcsConfig = DarcsConfiguration(Paths.get("darcs"), DirectoryPath(repositoriesDirectory())) - val sshConfig = SshServerConfiguration( + val sshConfig = SshServerConfiguration( enabled = true, genericUser = SshUsername("darcs"), host = host"localhost", diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/tickets/BaseSpec.scala new-smederee/modules/hub/src/test/scala/de/smederee/tickets/BaseSpec.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/tickets/BaseSpec.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/tickets/BaseSpec.scala 2025-06-20 12:12:52.695921989 +0000 @@ -54,8 +54,8 @@ */ private def connect(dbConfig: DatabaseConfig): IO[java.sql.Connection] = for { - _ <- IO(Class.forName(dbConfig.driver)) - database <- IO(dbConfig.url.split("/").reverse.take(1).mkString) + _ <- IO(Class.forName(dbConfig.driver)) + database <- IO(dbConfig.url.split("/").reverse.take(1).mkString) connection <- IO( java.sql.DriverManager .getConnection(dbConfig.url.replace(database, "template1"), dbConfig.user, dbConfig.pass) @@ -71,7 +71,7 @@ db.use { connection => for { statement <- IO(connection.createStatement()) - exists <- IO( + exists <- IO( statement.executeQuery( s"""SELECT datname FROM pg_catalog.pg_database WHERE datname = '$database'""" ) @@ -279,9 +279,9 @@ """SELECT id FROM tickets.projects WHERE owner = ? AND name = ? LIMIT 1""" ) ) - _ <- IO.delay(statement.setObject(1, owner)) - _ <- IO.delay(statement.setString(2, name.toString)) - result <- IO.delay(statement.executeQuery) + _ <- IO.delay(statement.setObject(1, owner)) + _ <- IO.delay(statement.setString(2, name.toString)) + result <- IO.delay(statement.executeQuery) projectId <- IO.delay { if (result.next()) { ProjectId.from(result.getLong("id")) @@ -311,9 +311,9 @@ """SELECT id FROM tickets.tickets WHERE project = ? AND number = ? LIMIT 1""" ) ) - _ <- IO.delay(statement.setLong(1, project.toLong)) - _ <- IO.delay(statement.setInt(2, number.toInt)) - result <- IO.delay(statement.executeQuery) + _ <- IO.delay(statement.setLong(1, project.toLong)) + _ <- IO.delay(statement.setInt(2, number.toInt)) + result <- IO.delay(statement.executeQuery) ticketId <- IO.delay { if (result.next()) { TicketId.from(result.getLong("id")) @@ -341,7 +341,7 @@ ) _ <- IO.delay(statement.setObject(1, uid.toUUID)) result <- IO.delay(statement.executeQuery()) - user <- IO.delay { + user <- IO.delay { if (result.next()) { val language = LanguageCode.from(result.getString("language")) ( diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/tickets/config/DatabaseMigratorTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/tickets/config/DatabaseMigratorTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/tickets/config/DatabaseMigratorTest.scala 2025-06-20 12:12:52.683922016 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/tickets/config/DatabaseMigratorTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -14,7 +14,7 @@ final class DatabaseMigratorTest extends BaseSpec { override def beforeEach(context: BeforeEach): Unit = { - val dbConfig = configuration.database + val dbConfig = configuration.database val flyway: Flyway = DatabaseMigrator.configureFlyway(dbConfig.url, dbConfig.user, dbConfig.pass).cleanDisabled(false).load() val _ = flyway.migrate() @@ -22,7 +22,7 @@ } override def afterEach(context: AfterEach): Unit = { - val dbConfig = configuration.database + val dbConfig = configuration.database val flyway: Flyway = DatabaseMigrator.configureFlyway(dbConfig.url, dbConfig.user, dbConfig.pass).cleanDisabled(false).load() val _ = flyway.migrate() @@ -39,7 +39,7 @@ test("DatabaseMigrator must not update an up to date database".tag(NeedsDatabase)) { val dbConfig = configuration.database val migrator = new DatabaseMigrator[IO] - val test = for { + val test = for { _ <- migrator.migrate(dbConfig.url, dbConfig.user, dbConfig.pass) r <- migrator.migrate(dbConfig.url, dbConfig.user, dbConfig.pass) } yield r diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/tickets/config/SmedereeTicketsConfigurationTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/tickets/config/SmedereeTicketsConfigurationTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/tickets/config/SmedereeTicketsConfigurationTest.scala 2025-06-20 12:12:52.683922016 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/tickets/config/SmedereeTicketsConfigurationTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -37,7 +37,7 @@ .at(s"${SmedereeTicketsConfiguration.location.toString}") .load[SmedereeTicketsConfiguration] match { case Left(errors) => fail(errors.toList.mkString(", ")) - case Right(cfg) => + case Right(cfg) => val externalCfg = cfg.external assertEquals(externalCfg.host, host"localhost") assertEquals(externalCfg.port, Option(port"8080")) @@ -52,7 +52,7 @@ .at(s"${SmedereeTicketsConfiguration.location.toString}") .load[SmedereeTicketsConfiguration] match { case Left(errors) => fail(errors.toList.mkString(", ")) - case Right(cfg) => + case Right(cfg) => val expectedUri = uri"http://localhost:8080" assertEquals(cfg.hub.baseUri, expectedUri) } diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieLabelRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieLabelRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieLabelRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieLabelRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -44,10 +44,10 @@ |AND "labels".name = ?""".stripMargin ) ) - _ <- IO.delay(statement.setObject(1, owner)) - _ <- IO.delay(statement.setString(2, vcsRepoName.toString)) - _ <- IO.delay(statement.setString(3, labelName.toString)) - result <- IO.delay(statement.executeQuery) + _ <- IO.delay(statement.setObject(1, owner)) + _ <- IO.delay(statement.setString(2, vcsRepoName.toString)) + _ <- IO.delay(statement.setString(3, labelName.toString)) + result <- IO.delay(statement.executeQuery) account <- IO.delay { if (result.next()) { Option(result.getLong("id")) @@ -63,7 +63,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, labels: NonEmptyList[Label]) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -71,10 +71,10 @@ logHandler = None ) val labelRepo = new DoobieLabelRepository[IO](tx) - val test = for { - _ <- createProjectOwner(owner) - _ <- createTicketsProject(project) - projectId <- loadProjectId(owner.uid, project.name) + val test = for { + _ <- createProjectOwner(owner) + _ <- createTicketsProject(project) + projectId <- loadProjectId(owner.uid, project.name) createdLabels <- projectId match { case None => IO.pure(List.empty) case Some(projectId) => labels.toList.traverse(label => labelRepo.createLabel(projectId)(label)) @@ -99,7 +99,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, label: Label) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -107,7 +107,7 @@ logHandler = None ) val labelRepo = new DoobieLabelRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdProjects <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) @@ -120,7 +120,7 @@ assert(projectId.nonEmpty, "No project id found!") assert(createdLabels.exists(_ === 1), "Test label was not created!") foundLabel.getOrElse(None) match { - case None => fail("Created label not found!") + case None => fail("Created label not found!") case Some(foundLabel) => assert(foundLabel.id.nonEmpty, "Label ID must not be empty!") assertEquals(foundLabel.name, label.name) @@ -135,7 +135,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, label: Label) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -143,7 +143,7 @@ logHandler = None ) val labelRepo = new DoobieLabelRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdProjects <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) @@ -158,7 +158,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, label: Label) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -166,7 +166,7 @@ logHandler = None ) val labelRepo = new DoobieLabelRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdProjects <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) @@ -191,7 +191,7 @@ val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database val expectedLabel = labels.toList(scala.util.Random.nextInt(labels.size)) - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -199,11 +199,11 @@ logHandler = None ) val labelRepo = new DoobieLabelRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdProjects <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - createdLabels <- projectId match { + createdLabels <- projectId match { case None => IO.pure(List.empty) case Some(projectId) => labels.toList.traverse(label => labelRepo.createLabel(projectId)(label)) } @@ -224,7 +224,7 @@ ) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -232,7 +232,7 @@ logHandler = None ) val labelRepo = new DoobieLabelRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdProjects <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) @@ -265,7 +265,7 @@ ) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -273,7 +273,7 @@ logHandler = None ) val labelRepo = new DoobieLabelRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdProjects <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieMilestoneRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieMilestoneRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieMilestoneRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieMilestoneRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -48,7 +48,7 @@ _ <- IO.delay(statement.setString(2, projectName.toString)) _ <- IO.delay(statement.setString(3, title.toString)) result <- IO.delay(statement.executeQuery) - owner <- IO.delay { + owner <- IO.delay { if (result.next()) { Option(result.getLong("id")) } else { @@ -63,7 +63,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, milestones: NonEmptyList[Milestone]) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -71,12 +71,12 @@ logHandler = None ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) - val test = for { - _ <- createProjectOwner(owner) - createdRepos <- createTicketsProject(project) - repoId <- loadProjectId(owner.uid, project.name) + val test = for { + _ <- createProjectOwner(owner) + createdRepos <- createTicketsProject(project) + repoId <- loadProjectId(owner.uid, project.name) createdMilestones <- repoId match { - case None => IO.pure(List.empty) + case None => IO.pure(List.empty) case Some(repoId) => milestones.toList.traverse(milestone => milestoneRepo.createMilestone(repoId)(milestone)) } @@ -102,7 +102,7 @@ val project = generatedProject.copy(owner = owner) val tickets = rawTickets.toList.map(_.copy(submitter = None)) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -111,19 +111,19 @@ ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { - _ <- createProjectOwner(owner) - _ <- createTicketsProject(project) - repoId <- loadProjectId(owner.uid, project.name) + val test = for { + _ <- createProjectOwner(owner) + _ <- createTicketsProject(project) + repoId <- loadProjectId(owner.uid, project.name) foundTickets <- repoId match { - case None => IO.pure(List.empty) + case None => IO.pure(List.empty) case Some(projectId) => for { _ <- milestoneRepo.createMilestone(projectId)(milestone) _ <- tickets.traverse(ticket => ticketRepo.createTicket(projectId)(ticket)) createdMilestone <- milestoneRepo.findMilestone(projectId)(milestone.title) - _ <- createdMilestone match { - case None => IO.pure(List.empty) + _ <- createdMilestone match { + case None => IO.pure(List.empty) case Some(milestone) => tickets.traverse(ticket => ticketRepo.addMilestone(projectId)(ticket.number)(milestone) @@ -152,7 +152,7 @@ val milestone = generatedMilestone.copy(closed = false) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -160,12 +160,12 @@ logHandler = None ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdRepos <- createTicketsProject(project) repoId <- loadProjectId(owner.uid, project.name) - milestones <- repoId match { - case None => IO.pure((None, None)) + milestones <- repoId match { + case None => IO.pure((None, None)) case Some(projectId) => for { _ <- milestoneRepo.createMilestone(projectId)(milestone) @@ -188,7 +188,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, milestone: Milestone) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -196,7 +196,7 @@ logHandler = None ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdRepos <- createTicketsProject(project) repoId <- loadProjectId(owner.uid, project.name) @@ -209,7 +209,7 @@ assert(repoId.nonEmpty, "No vcs generatedProject id found!") assert(createdMilestones.exists(_ === 1), "Test milestone was not created!") foundMilestone.getOrElse(None) match { - case None => fail("Created milestone not found!") + case None => fail("Created milestone not found!") case Some(foundMilestone) => assertEquals(foundMilestone, milestone.copy(id = foundMilestone.id)) } @@ -221,7 +221,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, milestone: Milestone) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -229,7 +229,7 @@ logHandler = None ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdRepos <- createTicketsProject(project) repoId <- loadProjectId(owner.uid, project.name) @@ -244,7 +244,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, milestone: Milestone) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -252,7 +252,7 @@ logHandler = None ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdRepos <- createTicketsProject(project) repoId <- loadProjectId(owner.uid, project.name) @@ -279,7 +279,7 @@ val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database val expectedMilestone = milestones.toList(scala.util.Random.nextInt(milestones.size)) - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -287,12 +287,12 @@ logHandler = None ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) - val test = for { - _ <- createProjectOwner(owner) - createdRepos <- createTicketsProject(project) - repoId <- loadProjectId(owner.uid, project.name) + val test = for { + _ <- createProjectOwner(owner) + createdRepos <- createTicketsProject(project) + repoId <- loadProjectId(owner.uid, project.name) createdMilestones <- repoId match { - case None => IO.pure(List.empty) + case None => IO.pure(List.empty) case Some(repoId) => milestones.toList.traverse(milestone => milestoneRepo.createMilestone(repoId)(milestone)) } @@ -309,7 +309,7 @@ val milestone = generatedMilestone.copy(closed = true) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -317,12 +317,12 @@ logHandler = None ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdRepos <- createTicketsProject(project) repoId <- loadProjectId(owner.uid, project.name) - milestones <- repoId match { - case None => IO.pure((None, None)) + milestones <- repoId match { + case None => IO.pure((None, None)) case Some(projectId) => for { _ <- milestoneRepo.createMilestone(projectId)(milestone) @@ -350,7 +350,7 @@ ) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -358,7 +358,7 @@ logHandler = None ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdRepos <- createTicketsProject(project) repoId <- loadProjectId(owner.uid, project.name) @@ -393,7 +393,7 @@ ) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -401,7 +401,7 @@ logHandler = None ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) createdRepos <- createTicketsProject(project) repoId <- loadProjectId(owner.uid, project.name) diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieProjectRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieProjectRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieProjectRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieProjectRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -22,7 +22,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -30,7 +30,7 @@ logHandler = None ) val projectRepo = new DoobieProjectRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- projectRepo.createProject(project) foundProject <- projectRepo.findProject(owner, project.name) @@ -45,7 +45,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -53,7 +53,7 @@ logHandler = None ) val projectRepo = new DoobieProjectRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- createTicketsProject(project) deleted <- projectRepo.deleteProject(project) @@ -71,7 +71,7 @@ PropF.forAllF { (owner: ProjectOwner, projects: NonEmptyList[Project]) => val project = projects.head.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -79,7 +79,7 @@ logHandler = None ) val projectRepo = new DoobieProjectRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- createTicketsProject(project) _ <- projects @@ -97,7 +97,7 @@ PropF.forAllF { (owner: ProjectOwner, projects: NonEmptyList[Project]) => val project = projects.head.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -105,7 +105,7 @@ logHandler = None ) val projectRepo = new DoobieProjectRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- createTicketsProject(project) _ <- projects @@ -125,7 +125,7 @@ PropF.forAllF { (owners: NonEmptyList[ProjectOwner]) => val owner = owners.head val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -133,7 +133,7 @@ logHandler = None ) val projectRepo = new DoobieProjectRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- owners.filterNot(_.name === owner.name).traverse(createProjectOwner) foundOwner <- projectRepo.findProjectOwner(owner.name) @@ -148,7 +148,7 @@ PropF.forAllF { (owner: ProjectOwner, firstProject: Project) => val project = firstProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -156,12 +156,12 @@ logHandler = None ) val projectRepo = new DoobieProjectRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- projectRepo.createProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => fail("Project was not created!") + result <- projectId match { + case None => fail("Project was not created!") case Some(projectId) => for { before <- loadNextTicketNumber(projectId) @@ -180,11 +180,11 @@ test("updateProject must update a project".tag(NeedsDatabase)) { PropF.forAllF { (owner: ProjectOwner, firstProject: Project, secondProject: Project) => - val project = firstProject.copy(owner = owner) + val project = firstProject.copy(owner = owner) val updatedProject = project.copy(description = secondProject.description, isPrivate = secondProject.isPrivate) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -192,7 +192,7 @@ logHandler = None ) val projectRepo = new DoobieProjectRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- projectRepo.createProject(project) written <- projectRepo.updateProject(updatedProject) diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieTicketRepositoryTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieTicketRepositoryTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieTicketRepositoryTest.scala 2025-06-20 12:12:52.679922025 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieTicketRepositoryTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -44,9 +44,9 @@ """SELECT label FROM "tickets"."ticket_labels" AS "ticket_labels" JOIN "tickets"."tickets" ON "ticket_labels".ticket = "tickets".id WHERE "tickets".project = ? AND "tickets".number = ?""" ) ) - _ <- IO.delay(statement.setLong(1, projectId.toLong)) - _ <- IO.delay(statement.setInt(2, ticketNumber.toInt)) - result <- IO.delay(statement.executeQuery) + _ <- IO.delay(statement.setLong(1, projectId.toLong)) + _ <- IO.delay(statement.setInt(2, ticketNumber.toInt)) + result <- IO.delay(statement.executeQuery) labelIds <- IO.delay { var queue = Queue.empty[LabelId] while (result.next()) @@ -76,9 +76,9 @@ """SELECT milestone FROM "tickets"."milestone_tickets" AS "milestone_tickets" JOIN "tickets"."tickets" ON "milestone_tickets".ticket = "tickets".id WHERE "tickets".project = ? AND "tickets".number = ?""" ) ) - _ <- IO.delay(statement.setLong(1, projectId.toLong)) - _ <- IO.delay(statement.setInt(2, ticketNumber.toInt)) - result <- IO.delay(statement.executeQuery) + _ <- IO.delay(statement.setLong(1, projectId.toLong)) + _ <- IO.delay(statement.setInt(2, ticketNumber.toInt)) + result <- IO.delay(statement.executeQuery) milestoneIds <- IO.delay { var queue = Queue.empty[MilestoneId] while (result.next()) @@ -94,7 +94,7 @@ val assignee = Assignee(AssigneeId(user.uid.toUUID), AssigneeName(user.name.toString)) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -102,7 +102,7 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- createTicketsUser(user) _ <- createTicketsProject(project) @@ -131,7 +131,7 @@ ) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -139,7 +139,7 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- createTicketsUser(user) _ <- createTicketsProject(project) @@ -167,7 +167,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, ticket: Ticket, label: Label) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -176,12 +176,12 @@ ) val labelRepo = new DoobieLabelRepository[IO](tx) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => fail("Project ID not found in database!") + result <- projectId match { + case None => fail("Project ID not found in database!") case Some(projectId) => for { _ <- ticket.submitter.traverse(createTicketsSubmitter) @@ -208,7 +208,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, ticket: Ticket, milestone: Milestone) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -217,12 +217,12 @@ ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => fail("Project ID not found in database!") + result <- projectId match { + case None => fail("Project ID not found in database!") case Some(projectId) => for { _ <- ticket.submitter.traverse(createTicketsSubmitter) @@ -248,14 +248,14 @@ test("allTickets must return all tickets for the project".tag(NeedsDatabase)) { PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, generatedTickets: NonEmptyList[Ticket]) => val defaultTimestamp = OffsetDateTime.now() - val tickets = + val tickets = generatedTickets.toList .sortBy(_.number) .map(_.copy(createdAt = defaultTimestamp, updatedAt = defaultTimestamp)) val submitters = tickets.map(_.submitter).flatten val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -263,13 +263,13 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- submitters.traverse(createTicketsSubmitter) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => IO.pure((0, Nil)) + result <- projectId match { + case None => IO.pure((0, Nil)) case Some(projectId) => for { writtenTickets <- tickets.traverse(ticket => ticketRepo.createTicket(projectId)(ticket)) @@ -298,7 +298,7 @@ test("allTickets must respect given filters for numbers".tag(NeedsDatabase)) { PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, generatedTickets: NonEmptyList[Ticket]) => val defaultTimestamp = OffsetDateTime.now() - val tickets = + val tickets = generatedTickets.toList .sortBy(_.number) .map(_.copy(createdAt = defaultTimestamp, updatedAt = defaultTimestamp)) @@ -307,7 +307,7 @@ val submitters = tickets.map(_.submitter).flatten val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -315,13 +315,13 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- submitters.traverse(createTicketsSubmitter) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => IO.pure((0, Nil)) + result <- projectId match { + case None => IO.pure((0, Nil)) case Some(projectId) => for { writtenTickets <- tickets.traverse(ticket => ticketRepo.createTicket(projectId)(ticket)) @@ -345,7 +345,7 @@ test("allTickets must respect given filters for status".tag(NeedsDatabase)) { PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, generatedTickets: NonEmptyList[Ticket]) => val defaultTimestamp = OffsetDateTime.now() - val tickets = + val tickets = generatedTickets.toList .sortBy(_.number) .map(_.copy(createdAt = defaultTimestamp, updatedAt = defaultTimestamp)) @@ -355,7 +355,7 @@ val submitters = tickets.map(_.submitter).flatten val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -363,13 +363,13 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- submitters.traverse(createTicketsSubmitter) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => IO.pure((0, Nil)) + result <- projectId match { + case None => IO.pure((0, Nil)) case Some(projectId) => for { writtenTickets <- tickets.traverse(ticket => ticketRepo.createTicket(projectId)(ticket)) @@ -393,7 +393,7 @@ test("allTickets must respect given filters for resolution".tag(NeedsDatabase)) { PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, generatedTickets: NonEmptyList[Ticket]) => val defaultTimestamp = OffsetDateTime.now() - val tickets = + val tickets = generatedTickets.toList .sortBy(_.number) .map(_.copy(createdAt = defaultTimestamp, updatedAt = defaultTimestamp)) @@ -403,7 +403,7 @@ val submitters = tickets.map(_.submitter).flatten val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -411,13 +411,13 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- submitters.traverse(createTicketsSubmitter) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => IO.pure((0, Nil)) + result <- projectId match { + case None => IO.pure((0, Nil)) case Some(projectId) => for { writtenTickets <- tickets.traverse(ticket => ticketRepo.createTicket(projectId)(ticket)) @@ -441,7 +441,7 @@ test("allTickets must respect given filters for submitter".tag(NeedsDatabase)) { PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, generatedTickets: NonEmptyList[Ticket]) => val defaultTimestamp = OffsetDateTime.now() - val tickets = + val tickets = generatedTickets.toList .sortBy(_.number) .map(_.copy(createdAt = defaultTimestamp, updatedAt = defaultTimestamp)) @@ -451,7 +451,7 @@ val filter = TicketFilter(Nil, Nil, Nil, submitter = wantedSubmitters.map(_.name)) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -459,13 +459,13 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- submitters.traverse(createTicketsSubmitter) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => IO.pure((0, Nil)) + result <- projectId match { + case None => IO.pure((0, Nil)) case Some(projectId) => for { writtenTickets <- tickets.traverse(ticket => ticketRepo.createTicket(projectId)(ticket)) @@ -490,7 +490,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, ticket: Ticket) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -498,7 +498,7 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- ticket.submitter.traverse(createTicketsSubmitter) _ <- createTicketsProject(project) @@ -508,7 +508,7 @@ } yield foundTicket.getOrElse(None) test.start.flatMap(_.joinWithNever).map { foundTicket => foundTicket match { - case None => fail("Created ticket not found!") + case None => fail("Created ticket not found!") case Some(foundTicket) => assertEquals( foundTicket, @@ -523,7 +523,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, ticket: Ticket) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -531,7 +531,7 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- ticket.submitter.traverse(createTicketsSubmitter) _ <- createTicketsProject(project) @@ -552,7 +552,7 @@ val submitters = tickets.toList.map(_.submitter).flatten val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -560,13 +560,13 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- submitters.traverse(createTicketsSubmitter) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - _ <- projectId match { - case None => IO.pure(Nil) + _ <- projectId match { + case None => IO.pure(Nil) case Some(projectId) => tickets.toList.traverse(ticket => ticketRepo.createTicket(projectId)(ticket)) } @@ -574,7 +574,7 @@ } yield foundTicket.getOrElse(None) test.start.flatMap(_.joinWithNever).map { foundTicket => foundTicket match { - case None => fail("Ticket not found!") + case None => fail("Ticket not found!") case Some(foundTicket) => assertEquals( foundTicket, @@ -594,7 +594,7 @@ val submitters = tickets.toList.map(_.submitter).flatten val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -602,13 +602,13 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- submitters.traverse(createTicketsSubmitter) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => IO.pure((None, None)) + result <- projectId match { + case None => IO.pure((None, None)) case Some(projectId) => for { _ <- tickets.traverse(ticket => ticketRepo.createTicket(projectId)(ticket)) @@ -632,7 +632,7 @@ users.toList.map(user => Assignee(AssigneeId(user.uid.toUUID), AssigneeName(user.name.toString))) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -640,14 +640,14 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { - _ <- createProjectOwner(owner) - _ <- users.traverse(createTicketsUser) - _ <- createTicketsProject(project) - projectId <- loadProjectId(owner.uid, project.name) - _ <- ticket.submitter.traverse(createTicketsSubmitter) + val test = for { + _ <- createProjectOwner(owner) + _ <- users.traverse(createTicketsUser) + _ <- createTicketsProject(project) + projectId <- loadProjectId(owner.uid, project.name) + _ <- ticket.submitter.traverse(createTicketsSubmitter) foundAssignees <- projectId match { - case None => fail("Project ID not found in database!") + case None => fail("Project ID not found in database!") case Some(projectId) => for { _ <- ticketRepo.createTicket(projectId)(ticket) @@ -684,7 +684,7 @@ ) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -692,20 +692,20 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { - _ <- createProjectOwner(owner) - _ <- createTicketsUser(user) - _ <- createTicketsProject(project) - projectId <- loadProjectId(owner.uid, project.name) - _ <- ticket.submitter.traverse(createTicketsSubmitter) - _ <- projectId.traverse(projectId => ticketRepo.createTicket(projectId)(ticket)) + val test = for { + _ <- createProjectOwner(owner) + _ <- createTicketsUser(user) + _ <- createTicketsProject(project) + projectId <- loadProjectId(owner.uid, project.name) + _ <- ticket.submitter.traverse(createTicketsSubmitter) + _ <- projectId.traverse(projectId => ticketRepo.createTicket(projectId)(ticket)) foundComments <- projectId match { - case None => IO.pure(Nil) + case None => IO.pure(Nil) case Some(projectId) => for { submitters <- IO(comments.map(_.submitter).flatten) _ <- submitters.traverse(createTicketsSubmitter) - _ <- comments.traverse(comment => + _ <- comments.traverse(comment => ticketRepo.addComment(projectId)(ticket.number)(comment) ) foundComments <- ticketRepo.loadComments(projectId)(ticket.number).compile.toList @@ -722,7 +722,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, ticket: Ticket, labels: NonEmptyList[Label]) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -731,12 +731,12 @@ ) val labelRepo = new DoobieLabelRepository[IO](tx) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => fail("Project ID not found in database!") + result <- projectId match { + case None => fail("Project ID not found in database!") case Some(projectId) => for { _ <- ticket.submitter.traverse(createTicketsSubmitter) @@ -760,7 +760,7 @@ (owner: ProjectOwner, generatedProject: Project, ticket: Ticket, milestones: NonEmptyList[Milestone]) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -769,12 +769,12 @@ ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- createTicketsProject(project) projectId <- loadProjectId(owner.uid, project.name) - result <- projectId match { - case None => fail("Project ID not found in database!") + result <- projectId match { + case None => fail("Project ID not found in database!") case Some(projectId) => for { _ <- ticket.submitter.traverse(createTicketsSubmitter) @@ -783,7 +783,7 @@ milestoneRepo.createMilestone(projectId)(milestone) ) createdMilestones <- milestoneRepo.allMilestones(projectId).compile.toList - _ <- createdMilestones.traverse(cm => + _ <- createdMilestones.traverse(cm => ticketRepo.addMilestone(projectId)(ticket.number)(cm) ) foundMilestones <- ticketRepo.loadMilestones(projectId)(ticket.number).compile.toList @@ -802,7 +802,7 @@ val assignee = Assignee(AssigneeId(user.uid.toUUID), AssigneeName(user.name.toString)) val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -810,14 +810,14 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { - _ <- createProjectOwner(owner) - _ <- createTicketsUser(user) - _ <- createTicketsProject(project) - projectId <- loadProjectId(owner.uid, project.name) - _ <- ticket.submitter.traverse(createTicketsSubmitter) + val test = for { + _ <- createProjectOwner(owner) + _ <- createTicketsUser(user) + _ <- createTicketsProject(project) + projectId <- loadProjectId(owner.uid, project.name) + _ <- ticket.submitter.traverse(createTicketsSubmitter) foundAssignees <- projectId match { - case None => IO.pure(Nil) + case None => IO.pure(Nil) case Some(projectId) => for { _ <- ticketRepo.createTicket(projectId)(ticket) @@ -837,7 +837,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, ticket: Ticket, label: Label) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -846,12 +846,12 @@ ) val labelRepo = new DoobieLabelRepository[IO](tx) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { - _ <- createProjectOwner(owner) - _ <- createTicketsProject(project) - projectId <- loadProjectId(owner.uid, project.name) + val test = for { + _ <- createProjectOwner(owner) + _ <- createTicketsProject(project) + projectId <- loadProjectId(owner.uid, project.name) foundLabels <- projectId match { - case None => fail("Project ID not found in database!") + case None => fail("Project ID not found in database!") case Some(projectId) => for { _ <- ticket.submitter.traverse(createTicketsSubmitter) @@ -874,7 +874,7 @@ PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, ticket: Ticket, milestone: Milestone) => val project = generatedProject.copy(owner = owner) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -883,12 +883,12 @@ ) val milestoneRepo = new DoobieMilestoneRepository[IO](tx) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { - _ <- createProjectOwner(owner) - _ <- createTicketsProject(project) - projectId <- loadProjectId(owner.uid, project.name) + val test = for { + _ <- createProjectOwner(owner) + _ <- createTicketsProject(project) + projectId <- loadProjectId(owner.uid, project.name) foundMilestones <- projectId match { - case None => fail("Project ID not found in database!") + case None => fail("Project ID not found in database!") case Some(projectId) => for { _ <- ticket.submitter.traverse(createTicketsSubmitter) @@ -909,7 +909,7 @@ test("updateTicket must update the ticket in the database".tag(NeedsDatabase)) { PropF.forAllF { (owner: ProjectOwner, generatedProject: Project, ticket: Ticket, anotherTicket: Ticket) => - val project = generatedProject.copy(owner = owner) + val project = generatedProject.copy(owner = owner) val updatedTicket = ticket.copy( title = anotherTicket.title, @@ -917,7 +917,7 @@ submitter = anotherTicket.submitter ) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, @@ -925,7 +925,7 @@ logHandler = None ) val ticketRepo = new DoobieTicketRepository[IO](tx) - val test = for { + val test = for { _ <- createProjectOwner(owner) _ <- ticket.submitter.traverse(createTicketsSubmitter) _ <- updatedTicket.submitter.traverse(createTicketsSubmitter) @@ -937,7 +937,7 @@ } yield foundTicket.getOrElse(None) test.start.flatMap(_.joinWithNever).map { foundTicket => foundTicket match { - case None => fail("Created ticket not found!") + case None => fail("Created ticket not found!") case Some(foundTicket) => assertEquals( foundTicket, diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieTicketServiceApiTest.scala new-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieTicketServiceApiTest.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieTicketServiceApiTest.scala 2025-06-20 12:12:52.683922016 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/tickets/DoobieTicketServiceApiTest.scala 2025-06-20 12:12:52.695921989 +0000 @@ -19,14 +19,14 @@ test("createOrUpdateUser must create new users".tag(NeedsDatabase)) { PropF.forAllF { (user: TicketsUser) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, password = dbConfig.pass, logHandler = None ) - val api = new DoobieTicketServiceApi[IO](tx) + val api = new DoobieTicketServiceApi[IO](tx) val test = for { written <- api.createOrUpdateUser(user) foundUser <- loadTicketsUser(user.uid) @@ -43,14 +43,14 @@ PropF.forAllF { (user: TicketsUser, anotherUser: TicketsUser) => val updatedUser = anotherUser.copy(uid = user.uid) val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, password = dbConfig.pass, logHandler = None ) - val api = new DoobieTicketServiceApi[IO](tx) + val api = new DoobieTicketServiceApi[IO](tx) val test = for { created <- api.createOrUpdateUser(user) updated <- api.createOrUpdateUser(updatedUser) @@ -68,14 +68,14 @@ test("deleteUser must delete existing users".tag(NeedsDatabase)) { PropF.forAllF { (user: TicketsUser) => val dbConfig = configuration.database - val tx = Transactor.fromDriverManager[IO]( + val tx = Transactor.fromDriverManager[IO]( driver = dbConfig.driver, url = dbConfig.url, user = dbConfig.user, password = dbConfig.pass, logHandler = None ) - val api = new DoobieTicketServiceApi[IO](tx) + val api = new DoobieTicketServiceApi[IO](tx) val test = for { _ <- api.createOrUpdateUser(user) deleted <- api.deleteUser(user.uid) diff -rN -u old-smederee/modules/hub/src/test/scala/de/smederee/tickets/Generators.scala new-smederee/modules/hub/src/test/scala/de/smederee/tickets/Generators.scala --- old-smederee/modules/hub/src/test/scala/de/smederee/tickets/Generators.scala 2025-06-20 12:12:52.683922016 +0000 +++ new-smederee/modules/hub/src/test/scala/de/smederee/tickets/Generators.scala 2025-06-20 12:12:52.695921989 +0000 @@ -55,7 +55,7 @@ minute <- Gen.choose(0, 59) second <- Gen.choose(0, 59) nanosecond <- Gen.const(0) // Avoid issues with loosing information during saving and loading. - offset <- Gen.oneOf( + offset <- Gen.oneOf( ZoneId.getAvailableZoneIds.asScala.toList.map(ZoneId.of).map(ZonedDateTime.now).map(_.getOffset) ) } yield OffsetDateTime.of(year, month, day, hour, minute, second, nanosecond, offset) @@ -76,7 +76,7 @@ val genUsername: Gen[Username] = for { length <- Gen.choose(2, 30) prefix <- Gen.alphaChar - chars <- Gen + chars <- Gen .nonEmptyListOf(Gen.alphaNumChar) .map(_.take(length).mkString.toLowerCase(Locale.ROOT)) } yield Username(prefix.toString.toLowerCase(Locale.ROOT) + chars) @@ -159,7 +159,7 @@ val genProjectOwnerName: Gen[ProjectOwnerName] = for { length <- Gen.choose(2, 30) prefix <- Gen.alphaChar - chars <- Gen + chars <- Gen .nonEmptyListOf(Gen.alphaNumChar) .map(_.take(length).mkString.toLowerCase(Locale.ROOT)) } yield ProjectOwnerName(prefix.toString.toLowerCase(Locale.ROOT) + chars) diff -rN -u old-smederee/modules/security/src/main/scala/de/smederee/security/SignAndValidate.scala new-smederee/modules/security/src/main/scala/de/smederee/security/SignAndValidate.scala --- old-smederee/modules/security/src/main/scala/de/smederee/security/SignAndValidate.scala 2025-06-20 12:12:52.683922016 +0000 +++ new-smederee/modules/security/src/main/scala/de/smederee/security/SignAndValidate.scala 2025-06-20 12:12:52.695921989 +0000 @@ -112,10 +112,10 @@ * Option containing the pure token if the validation was successful. */ def validate(signedToken: SignedToken): Option[String] = { - val parts = signedToken.toString.split(SignedToken.Separator, 3) - val signature = parts.headOption - val nonce = parts.drop(1).headOption - val token = parts.drop(2).headOption + val parts = signedToken.toString.split(SignedToken.Separator, 3) + val signature = parts.headOption + val nonce = parts.drop(1).headOption + val token = parts.drop(2).headOption val comparison = (signature, nonce, token).mapN { case (signature, nonce, token) => val reSigned = sign(s"$nonce${SignedToken.Separator}$token") if (MessageDigest.isEqual(signature.toBytes, reSigned.toBytes)) diff -rN -u old-smederee/modules/security/src/main/scala/de/smederee/security/Username.scala new-smederee/modules/security/src/main/scala/de/smederee/security/Username.scala --- old-smederee/modules/security/src/main/scala/de/smederee/security/Username.scala 2025-06-20 12:12:52.683922016 +0000 +++ new-smederee/modules/security/src/main/scala/de/smederee/security/Username.scala 2025-06-20 12:12:52.695921989 +0000 @@ -54,7 +54,7 @@ def validate(s: String): ValidatedNec[String, Username] = Option(s).map(_.trim.nonEmpty) match { case Some(true) => - val input = s.trim + val input = s.trim val miniumLength = if (input.length >= MinimumLength) input.validNec diff -rN -u old-smederee/modules/security/src/test/scala/de/smederee/security/PasswordTest.scala new-smederee/modules/security/src/test/scala/de/smederee/security/PasswordTest.scala --- old-smederee/modules/security/src/test/scala/de/smederee/security/PasswordTest.scala 2025-06-20 12:12:52.683922016 +0000 +++ new-smederee/modules/security/src/test/scala/de/smederee/security/PasswordTest.scala 2025-06-20 12:12:52.699921980 +0000 @@ -24,7 +24,7 @@ forAll { (s: String) => val expected = s.getBytes(StandardCharsets.UTF_8) Password.from(s) match { - case None => fail("Must produce valid byte array from non null string!") + case None => fail("Must produce valid byte array from non null string!") case Some(p) => assert(p.toArray.sameElements(expected), "Generated byte array differs from expected one!") } diff -rN -u old-smederee/.scalafmt.conf new-smederee/.scalafmt.conf --- old-smederee/.scalafmt.conf 2025-06-20 12:12:52.671922044 +0000 +++ new-smederee/.scalafmt.conf 2025-06-20 12:12:52.687922007 +0000 @@ -1,4 +1,4 @@ -version = "3.9.6" +version = "3.9.7" runner.dialect = scala3 style = "defaultWithAlign" # Other options...