Skip to content

Commit

Permalink
dir index
Browse files Browse the repository at this point in the history
  • Loading branch information
dzikoysk committed Aug 18, 2024
1 parent 80ba6a4 commit ba57ef1
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class FrontendFacade internal constructor(
) : Facade {

private val resources = HashMap<String, ResourceSupplier>(0)
private val formattedBasePath = basePath.computed { BasePathFormatter.formatBasePath(it) }
val formattedBasePath = basePath.computed { BasePathFormatter.formatBasePath(it) }

init {
computed(basePath, formattedBasePath, frontendSettings) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import com.reposilite.storage.api.FileDetails
import com.reposilite.storage.api.Location
import com.reposilite.token.AccessTokenIdentifier
import panda.std.Result
import java.io.InputStream

class MavenFacade internal constructor(
private val journalist: Journalist,
Expand All @@ -54,6 +55,9 @@ class MavenFacade internal constructor(
fun findFile(lookupRequest: LookupRequest): Result<ResolvedDocument, ErrorResponse> =
repositoryService.findFile(lookupRequest)

fun findData(lookupRequest: LookupRequest): Result<InputStream, ErrorResponse> =
repositoryService.findInputStream(lookupRequest)

fun deployFile(deployRequest: DeployRequest): Result<Unit, ErrorResponse> =
repositoryService.deployFile(deployRequest)

Expand Down Expand Up @@ -88,6 +92,9 @@ class MavenFacade internal constructor(
findLatestVersion(lookupRequest.toVersionLookupRequest())
.flatMap { latestService.createLatestBadge(lookupRequest, it.version) }

fun acceptsCachingOf(request: LookupRequest): Boolean =
getRepository(request.repository)?.acceptsCachingOf(request.gav) ?: false

fun canAccessResource(accessToken: AccessTokenIdentifier?, repository: Repository, gav: Location): Result<Unit, ErrorResponse> =
repositorySecurityProvider.canAccessResource(accessToken, repository, gav)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import com.reposilite.maven.api.ResolvedDocument
import com.reposilite.maven.api.ResolvedFileEvent
import com.reposilite.plugin.Extensions
import com.reposilite.shared.ErrorResponse
import com.reposilite.shared.badRequestError
import com.reposilite.shared.errorResponse
import com.reposilite.shared.notFound
import com.reposilite.shared.notFoundError
Expand Down Expand Up @@ -114,8 +113,7 @@ internal class RepositoryService(

fun findFile(lookupRequest: LookupRequest): Result<ResolvedDocument, ErrorResponse> =
resolve(lookupRequest) { repository, gav ->
findFile(lookupRequest.accessToken, repository, gav).map {
val (details, stream) = it
findFile(lookupRequest.accessToken, repository, gav).map { (details, stream) ->
ResolvedDocument(
document = details,
cachable = repository.acceptsCachingOf(gav),
Expand Down Expand Up @@ -144,6 +142,9 @@ internal class RepositoryService(
.flatMap { details -> findInputStream(repository, gav).map { details to it } }
.let { extensions.emitEvent(ResolvedFileEvent(accessToken, repository, gav, it)).result }

fun findInputStream(lookupRequest: LookupRequest): Result<InputStream, ErrorResponse> =
resolve(lookupRequest) { repository, gav -> findInputStream(repository, gav) }

private fun findInputStream(repository: Repository, gav: Location): Result<InputStream, ErrorResponse> =
when {
mirrorService.shouldPrioritizeMirrorRepository(repository, gav) -> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.reposilite.maven.infrastructure

import com.reposilite.storage.api.DirectoryInfo
import com.reposilite.storage.api.FileType

internal fun createDirectoryIndexPage(basePath: String, uri: String, directory: DirectoryInfo): String {
val formattedUri = basePath + uri.removePrefix("/")

Check warning on line 7 in reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt

View check run for this annotation

Codecov / codecov/patch

reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt#L7

Added line #L7 was not covered by tests

// language=html
return """

Check warning on line 10 in reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt

View check run for this annotation

Codecov / codecov/patch

reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt#L10

Added line #L10 was not covered by tests
<!DOCTYPE html>
<html lang='en'>
<head>
<title>Index of $formattedUri</title>

Check warning on line 14 in reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt

View check run for this annotation

Codecov / codecov/patch

reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt#L14

Added line #L14 was not covered by tests
<meta charset='utf-8'>
<style>
li {
padding: 2px 10px;
}
.back::marker {
content: '🔙';
}
.directory::marker {
content: '📁';
}
.file::marker {
content: '📄';
}
</style>
</head>
<body>
<h1>Index of $formattedUri</h1>

Check warning on line 32 in reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt

View check run for this annotation

Codecov / codecov/patch

reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt#L32

Added line #L32 was not covered by tests
<ul>
<li class='back'>
<a href='${formattedUri.substringBeforeLast("/")}'>Parent Directory</a>

Check warning on line 35 in reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt

View check run for this annotation

Codecov / codecov/patch

reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt#L35

Added line #L35 was not covered by tests
</li>
${directory.files.flatMap {
listOf(
"<li class='${it.type.name.lowercase()}'>",

Check warning on line 39 in reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt

View check run for this annotation

Codecov / codecov/patch

reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt#L37-L39

Added lines #L37 - L39 were not covered by tests
"<a href='$formattedUri/${it.name}'>${it.name}${if (it.type == FileType.DIRECTORY) "/" else ""}</a>",
"</li>"
)
}.joinToString(separator = "")}

Check warning on line 43 in reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt

View check run for this annotation

Codecov / codecov/patch

reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt#L41-L43

Added lines #L41 - L43 were not covered by tests
</ul>
</body>
</html>
""".trimIndent()

Check warning on line 47 in reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt

View check run for this annotation

Codecov / codecov/patch

reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/DirectoryIndexPage.kt#L47

Added line #L47 was not covered by tests
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@ import com.reposilite.maven.MavenFacade
import com.reposilite.maven.api.DeleteRequest
import com.reposilite.maven.api.DeployRequest
import com.reposilite.maven.api.LookupRequest
import com.reposilite.shared.ErrorResponse
import com.reposilite.shared.extensions.resultAttachment
import com.reposilite.shared.extensions.uri
import com.reposilite.storage.api.DirectoryInfo
import com.reposilite.storage.api.DocumentInfo
import com.reposilite.storage.api.FileType
import com.reposilite.storage.api.Location
import com.reposilite.token.AccessTokenIdentifier
import com.reposilite.web.api.ReposiliteRoute
Expand All @@ -31,13 +35,15 @@ import io.javalin.community.routing.Route.GET
import io.javalin.community.routing.Route.HEAD
import io.javalin.community.routing.Route.POST
import io.javalin.community.routing.Route.PUT
import io.javalin.http.ContentType
import io.javalin.http.Context
import io.javalin.openapi.ContentType.FORM_DATA_MULTIPART
import io.javalin.openapi.HttpMethod
import io.javalin.openapi.OpenApi
import io.javalin.openapi.OpenApiContent
import io.javalin.openapi.OpenApiParam
import io.javalin.openapi.OpenApiResponse
import panda.std.Result

const val X_GENERATE_CHECKSUMS = "X-Generate-Checksums"

Expand Down Expand Up @@ -70,25 +76,43 @@ internal class MavenEndpoints(
}
}

fun findFile(ctx: Context, identifier: AccessTokenIdentifier?, repository: String, gav: Location) {
LookupRequest(identifier, repository, gav)
.let { request -> mavenFacade.findFile(request) }
.peek {
ctx.resultAttachment(
name = it.document.name,
contentType = it.document.contentType,
contentLength = it.document.contentLength,
lastTimeModified = it.document.lastModifiedTime,
compressionStrategy = compressionStrategy,
cache = it.cachable,
data = it.content
)
}
.onError {
ctx.status(it.status).html(frontendFacade.createNotFoundPage(ctx.uri(), it.message))
mavenFacade.logger.debug("FIND | Could not find file due to $it")
}
}
fun findFile(ctx: Context, identifier: AccessTokenIdentifier?, repository: String, gav: Location): Result<Any, ErrorResponse> =
LookupRequest(accessToken = identifier, repository = repository, gav = gav).let { request ->
mavenFacade
.findDetails(request)
.map { details ->
when (details) {
is DocumentInfo ->
mavenFacade
.findData(request)
.peek {
ctx.resultAttachment(
name = details.name,
contentType = details.contentType,
contentLength = details.contentLength,
lastTimeModified = details.lastModifiedTime,
compressionStrategy = compressionStrategy,
cache = mavenFacade.acceptsCachingOf(request),
data = it,
)
}
is DirectoryInfo ->
ctx.html(
createDirectoryIndexPage(
basePath = frontendFacade.formattedBasePath.get(),
uri = ctx.uri(),
directory = details,

Check warning on line 104 in reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/MavenEndpoints.kt

View check run for this annotation

Codecov / codecov/patch

reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/MavenEndpoints.kt#L100-L104

Added lines #L100 - L104 were not covered by tests
)
)
else ->
throw IllegalStateException("Expected file details, but got $details")

Check warning on line 108 in reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/MavenEndpoints.kt

View check run for this annotation

Codecov / codecov/patch

reposilite-backend/src/main/kotlin/com/reposilite/maven/infrastructure/MavenEndpoints.kt#L108

Added line #L108 was not covered by tests
}
}
.onError {
ctx.status(it.status).html(frontendFacade.createNotFoundPage(ctx.uri(), it.message))
mavenFacade.logger.debug("FIND | Could not find file due to $it")
}
}

@OpenApi(
tags = [ "Maven" ],
Expand Down

0 comments on commit ba57ef1

Please sign in to comment.