Skip to content

Commit

Permalink
GH-458 Add missing test cases to statistics domain and initialize acc…
Browse files Browse the repository at this point in the history
…ess token domain tests
  • Loading branch information
dzikoysk committed Jul 20, 2021
1 parent 62e5e5f commit 73bcce1
Show file tree
Hide file tree
Showing 13 changed files with 205 additions and 148 deletions.
1 change: 1 addition & 0 deletions reposilite-backend/reposilite-backend.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ dependencies {
/* Utilities */

implementation("net.dzikoysk:cdn:1.9.0")
implementation("org.panda-lang:expressible:1.0.2")
implementation("info.picocli:picocli:4.6.1")
implementation("com.google.guava:guava:30.1.1-jre")
implementation("org.apache.commons:commons-collections4:4.4")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,4 @@ class FrontendFacade internal constructor(index: Supplier<String>, app: Supplier
return StringUtils.replace(index.get(), "{{REPOSILITE.MESSAGE}}", message)
}

fun getApp(): String {
return app.get()
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import org.panda_lang.reposilite.failure.api.errorResponse
import org.panda_lang.reposilite.maven.api.FileDetails
import org.panda_lang.reposilite.maven.api.Repository
import org.panda_lang.reposilite.shared.FilesUtils
import org.panda_lang.reposilite.web.projectToError
import panda.std.Lazy
import panda.std.Pair
import panda.std.Result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ data class Record(
)

enum class RecordType {
REQUEST
REQUEST,
UNKNOWN
}

data class RecordIdentifier(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ internal class InMemoryStatisticsRepository : StatisticsRepository {
override fun findRecordsByPhrase(type: RecordType, phrase: String): List<Record> =
records.values
.filter { it.type == type }
.filter { it.identifier == phrase }
.filter { it.identifier.contains(phrase) }

override fun countRecords(): Long =
records
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package org.panda_lang.reposilite.storage.infrastructure
import io.javalin.http.HttpCode.INSUFFICIENT_STORAGE
import net.dzikoysk.dynamiclogger.Journalist
import org.panda_lang.reposilite.failure.api.ErrorResponse
import org.panda_lang.reposilite.web.filter
import panda.std.Result
import java.io.IOException
import java.nio.file.Files
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,18 +82,10 @@ fun OutputStream.isProbablyOpen(): Boolean =
fun String.toPath(): Path =
Paths.get(this)

/**
* Project non-existing value of errored [Result] to simplify error handling by convenient way to match expected signatures.
* This method throws [IllegalArgumentException] if the given [Result] does not contain error.
*/
fun <ANY_VALUE, REQUIRED_VALUE, ERROR> Result<ANY_VALUE, ERROR>.projectToError(): Result<REQUIRED_VALUE, ERROR> =
if (this.isErr) this.map { null } else throw IllegalArgumentException("")

fun <VALUE, ERROR> Result<VALUE, ERROR>.filter(predicate: (VALUE) -> Boolean, error: () -> ERROR): Result<VALUE, ERROR> =
if (this.isOk && predicate(get())) this else Result.error(error())

fun <VALUE> Result<VALUE, *>.orNull(): VALUE? =
this.orElseGet { null }
fun <ANY> ANY.alsoIf(condition: Boolean, block: (ANY) -> Unit): ANY {
if (condition) block(this)
return this;
}

fun <VALUE, ERROR> VALUE.asResult(): Result<VALUE, ERROR> =
Result.ok(this)
Original file line number Diff line number Diff line change
@@ -1,29 +1,11 @@
package org.panda_lang.reposilite.web.infrastructure

import com.dzikoysk.openapi.ktor.OpenApiConfiguration
import com.dzikoysk.openapi.ktor.OpenApiPlugin
import com.dzikoysk.openapi.ktor.swagger.SwaggerConfiguration
import com.dzikoysk.openapi.ktor.swagger.SwaggerPlugin
import com.fasterxml.jackson.annotation.JsonInclude.Include
import com.fasterxml.jackson.databind.ObjectMapper
import io.javalin.Javalin
import io.javalin.core.JavalinConfig
import io.javalin.plugin.json.JavalinJackson
import org.eclipse.jetty.server.Server
import org.eclipse.jetty.server.ServerConnector
import org.eclipse.jetty.util.ssl.SslContextFactory
import org.panda_lang.reposilite.Reposilite
import org.panda_lang.reposilite.ReposiliteWebConfiguration
import org.panda_lang.reposilite.VERSION
import org.panda_lang.reposilite.config.Configuration
import org.panda_lang.reposilite.web.WebServer
import org.panda_lang.reposilite.web.api.RouteMethod.AFTER
import org.panda_lang.reposilite.web.api.RouteMethod.BEFORE
import org.panda_lang.reposilite.web.api.RouteMethod.DELETE
import org.panda_lang.reposilite.web.api.RouteMethod.GET
import org.panda_lang.reposilite.web.api.RouteMethod.HEAD
import org.panda_lang.reposilite.web.api.RouteMethod.POST
import org.panda_lang.reposilite.web.api.RouteMethod.PUT
import org.panda_lang.reposilite.web.alsoIf

internal class JavalinWebServer : WebServer {

Expand All @@ -33,118 +15,25 @@ internal class JavalinWebServer : WebServer {
override fun start(reposilite: Reposilite) {
val configuration = reposilite.configuration

val javalin = create(reposilite, configuration)
this.javalin = createJavalin(reposilite, configuration)
.events { listener ->
listener.serverStopping { reposilite.logger.info("Server stopping...") }
listener.serverStopped { reposilite.logger.info("Bye! Uptime: " + reposilite.getPrettyUptime()) }
}

ReposiliteWebConfiguration.javalin(reposilite, javalin)

reposilite.logger.debug("--- Routes")
ReposiliteWebConfiguration.routing(reposilite)
.flatMap { it.routes }
.sorted()
.map { Pair(it, it.createHandler(reposilite.contextFactory)) }
.forEach { (route, handler) ->
reposilite.logger.debug("- ${route.path}")

route.methods.forEach { method ->
when (method) {
HEAD -> javalin.head(route.path, handler)
GET -> javalin.get(route.path, handler)
PUT -> javalin.put(route.path, handler)
POST -> javalin.post(route.path, handler)
DELETE -> javalin.delete(route.path, handler)
AFTER -> javalin.after(route.path, handler)
BEFORE -> javalin.before(route.path, handler)
}
}
.also {
ReposiliteWebConfiguration.javalin(reposilite, it)
JavalinWebServerConfiguration.routing(reposilite, it)
}

if (!servlet) {
javalin?.start(configuration.hostname, configuration.port)
}
}

private fun create(reposilite: Reposilite, configuration: Configuration): Javalin =
if (servlet) {
Javalin.createStandalone { configure(reposilite, configuration, it) }
} else {
Javalin.create { configure(reposilite, configuration, it) }
}

private fun configure(reposilite: Reposilite, configuration: Configuration, config: JavalinConfig) {
val server = Server()

configureJavalin(config)
configureJsonSerialization(config)
configureSSL(reposilite, configuration, config, server)
configureCors(config)
configureOpenApi(configuration, config)
configureDebug(reposilite, configuration, config)

config.server { server }
}

private fun configureJavalin(config: JavalinConfig) {
config.showJavalinBanner = false
}

private fun configureJsonSerialization(config: JavalinConfig) {
val objectMapper = ObjectMapper()
objectMapper.setSerializationInclusion(Include.NON_NULL)
JavalinJackson.configure(objectMapper)
}

private fun configureSSL(reposilite: Reposilite, configuration: Configuration, config: JavalinConfig, server: Server) {
if (configuration.sslEnabled) {
reposilite.logger.info("Enabling SSL connector at ::" + configuration.sslPort)

val sslContextFactory: SslContextFactory = SslContextFactory.Server()
sslContextFactory.keyStorePath = configuration.keyStorePath.replace("\${WORKING_DIRECTORY}", reposilite.workingDirectory.toAbsolutePath().toString())
sslContextFactory.setKeyStorePassword(configuration.keyStorePassword)

val sslConnector = ServerConnector(server, sslContextFactory)
sslConnector.port = configuration.sslPort
server.addConnector(sslConnector)

if (!configuration.enforceSsl) {
val standardConnector = ServerConnector(server)
standardConnector.port = configuration.port
server.addConnector(standardConnector)
.alsoIf(!servlet) {
it.start(configuration.hostname, configuration.port)
}
}

config.enforceSsl = configuration.enforceSsl
}

private fun configureCors(config: JavalinConfig) {
config.enableCorsForAllOrigins()
}

private fun configureOpenApi(configuration: Configuration, config: JavalinConfig) {
if (configuration.swagger) {
val openApiConfiguration = OpenApiConfiguration()
openApiConfiguration.title = configuration.title
openApiConfiguration.description = configuration.description
openApiConfiguration.version = VERSION
config.registerPlugin(OpenApiPlugin(openApiConfiguration))

val swaggerConfiguration = SwaggerConfiguration()
swaggerConfiguration.title = openApiConfiguration.title
config.registerPlugin(SwaggerPlugin(swaggerConfiguration))
}
}

private fun configureDebug(reposilite: Reposilite, configuration: Configuration, config: JavalinConfig) {
if (configuration.debugEnabled) {
// config.requestCacheSize = FilesUtils.displaySizeToBytesCount(System.getProperty("reposilite.requestCacheSize", "8MB"));
// Reposilite.getLogger().debug("requestCacheSize set to " + config.requestCacheSize + " bytes");
reposilite.logger.info("Debug enabled")
config.enableDevLogging()
}
}
private fun createJavalin(reposilite: Reposilite, configuration: Configuration): Javalin =
if (servlet)
Javalin.createStandalone { JavalinWebServerConfiguration.configure(reposilite, configuration, it) }
else
Javalin.create { JavalinWebServerConfiguration.configure(reposilite, configuration, it) }

override fun stop() {
javalin?.stop()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package org.panda_lang.reposilite.web.infrastructure

import com.dzikoysk.openapi.ktor.OpenApiConfiguration
import com.dzikoysk.openapi.ktor.OpenApiPlugin
import com.dzikoysk.openapi.ktor.swagger.SwaggerConfiguration
import com.dzikoysk.openapi.ktor.swagger.SwaggerPlugin
import com.fasterxml.jackson.annotation.JsonInclude.Include
import com.fasterxml.jackson.databind.ObjectMapper
import io.javalin.Javalin
import io.javalin.core.JavalinConfig
import io.javalin.plugin.json.JavalinJackson
import org.eclipse.jetty.server.Server
import org.eclipse.jetty.server.ServerConnector
import org.eclipse.jetty.util.ssl.SslContextFactory
import org.panda_lang.reposilite.Reposilite
import org.panda_lang.reposilite.ReposiliteWebConfiguration
import org.panda_lang.reposilite.VERSION
import org.panda_lang.reposilite.config.Configuration
import org.panda_lang.reposilite.web.api.RouteMethod.AFTER
import org.panda_lang.reposilite.web.api.RouteMethod.BEFORE
import org.panda_lang.reposilite.web.api.RouteMethod.DELETE
import org.panda_lang.reposilite.web.api.RouteMethod.GET
import org.panda_lang.reposilite.web.api.RouteMethod.HEAD
import org.panda_lang.reposilite.web.api.RouteMethod.POST
import org.panda_lang.reposilite.web.api.RouteMethod.PUT

internal object JavalinWebServerConfiguration {

internal fun configure(reposilite: Reposilite, configuration: Configuration, config: JavalinConfig) {
val server = Server()

configureJavalin(config)
configureJsonSerialization(config)
configureSSL(reposilite, configuration, config, server)
configureCors(config)
configureOpenApi(configuration, config)
configureDebug(reposilite, configuration, config)

config.server { server }
}

private fun configureJavalin(config: JavalinConfig) {
config.showJavalinBanner = false
}

private fun configureJsonSerialization(config: JavalinConfig) {
val objectMapper = ObjectMapper()
objectMapper.setSerializationInclusion(Include.NON_NULL)
JavalinJackson.configure(objectMapper)
}

private fun configureSSL(reposilite: Reposilite, configuration: Configuration, config: JavalinConfig, server: Server) {
if (configuration.sslEnabled) {
reposilite.logger.info("Enabling SSL connector at ::" + configuration.sslPort)

val sslContextFactory: SslContextFactory = SslContextFactory.Server()
sslContextFactory.keyStorePath = configuration.keyStorePath.replace("\${WORKING_DIRECTORY}", reposilite.workingDirectory.toAbsolutePath().toString())
sslContextFactory.setKeyStorePassword(configuration.keyStorePassword)

val sslConnector = ServerConnector(server, sslContextFactory)
sslConnector.port = configuration.sslPort
server.addConnector(sslConnector)

if (!configuration.enforceSsl) {
val standardConnector = ServerConnector(server)
standardConnector.port = configuration.port
server.addConnector(standardConnector)
}
}

config.enforceSsl = configuration.enforceSsl
}

private fun configureCors(config: JavalinConfig) {
config.enableCorsForAllOrigins()
}

private fun configureOpenApi(configuration: Configuration, config: JavalinConfig) {
if (configuration.swagger) {
val openApiConfiguration = OpenApiConfiguration()
openApiConfiguration.title = configuration.title
openApiConfiguration.description = configuration.description
openApiConfiguration.version = VERSION
config.registerPlugin(OpenApiPlugin(openApiConfiguration))

val swaggerConfiguration = SwaggerConfiguration()
swaggerConfiguration.title = openApiConfiguration.title
config.registerPlugin(SwaggerPlugin(swaggerConfiguration))
}
}

private fun configureDebug(reposilite: Reposilite, configuration: Configuration, config: JavalinConfig) {
if (configuration.debugEnabled) {
// config.requestCacheSize = FilesUtils.displaySizeToBytesCount(System.getProperty("reposilite.requestCacheSize", "8MB"));
// Reposilite.getLogger().debug("requestCacheSize set to " + config.requestCacheSize + " bytes");
reposilite.logger.info("Debug enabled")
config.enableDevLogging()
}
}

internal fun routing(reposilite: Reposilite, javalin: Javalin) {
ReposiliteWebConfiguration.routing(reposilite)
.flatMap { it.routes }
.sorted()
.map { Pair(it, it.createHandler(reposilite.contextFactory)) }
.also { reposilite.logger.debug("--- Routes") }
.forEach { (route, handler) ->
route.methods.forEach { method ->
when (method) {
HEAD -> javalin.head(route.path, handler)
GET -> javalin.get(route.path, handler)
PUT -> javalin.put(route.path, handler)
POST -> javalin.post(route.path, handler)
DELETE -> javalin.delete(route.path, handler)
AFTER -> javalin.after(route.path, handler)
BEFORE -> javalin.before(route.path, handler)
}

reposilite.logger.debug("- $method ${route.path}")
}
}
}

}
Loading

0 comments on commit 73bcce1

Please sign in to comment.