Skip to content

Commit d960424

Browse files
authored
Archives with raw COSV files should be at the top of the list (#2817)
### What's done: - added sorting of raw COSV files depending on whether the file is an archive. Closes #2815
1 parent 0de3877 commit d960424

6 files changed

Lines changed: 19 additions & 11 deletions

File tree

save-cloud-common/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ kotlin {
7575
implementation(libs.spring.boot)
7676
implementation(libs.spring.data.jpa)
7777
implementation(libs.jackson.module.kotlin)
78+
implementation(libs.hibernate.core)
7879
implementation(libs.hibernate.jpa21.api)
7980
api(libs.slf4j.api)
8081
api(libs.jetbrains.annotations)

save-cloud-common/src/commonMain/kotlin/com/saveourtool/save/entities/cosv/RawCosvFileDto.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@ data class RawCosvFileDto(
4141
*
4242
* @return true if this raw cosv file is uploaded zip archive, checking by [fileName]
4343
*/
44-
fun RawCosvFileDto.isUploadedZipArchive(): Boolean = status == RawCosvFileStatus.UPLOADED && fileName.endsWith(ZIP_ARCHIVE_EXTENSION, ignoreCase = true)
44+
fun RawCosvFileDto.isZipArchive(): Boolean = fileName.endsWith(ZIP_ARCHIVE_EXTENSION, ignoreCase = true)
4545

4646
/**
4747
* Extracted as extension to avoid Jackson issue with encoding this field
4848
*
4949
* @return true if this raw cosv file is uploaded json file, checking by [fileName]
5050
*/
51-
fun RawCosvFileDto.isUploadedJsonFile(): Boolean = status == RawCosvFileStatus.UPLOADED && !fileName.endsWith(ZIP_ARCHIVE_EXTENSION, ignoreCase = true)
51+
fun RawCosvFileDto.isUploadedJsonFile(): Boolean = !isZipArchive() && status == RawCosvFileStatus.UPLOADED
5252

5353
/**
5454
* Extracted as extension to avoid Jackson issue with encoding this field

save-cloud-common/src/jvmMain/kotlin/com/saveourtool/save/entities/cosv/RawCosvFile.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import com.saveourtool.save.entities.Organization
44
import com.saveourtool.save.entities.User
55
import com.saveourtool.save.spring.entity.BaseEntityWithDtoWithId
66
import com.saveourtool.save.spring.entity.IBaseEntityWithDate
7+
import com.saveourtool.save.utils.ZIP_ARCHIVE_EXTENSION
8+
9+
import org.hibernate.annotations.Formula
710

811
import java.time.LocalDateTime
912
import javax.persistence.*
@@ -21,6 +24,7 @@ import kotlinx.datetime.toKotlinLocalDateTime
2124
* @property contentLength
2225
* @property createDate
2326
* @property updateDate
27+
* @property isZip
2428
*/
2529
@Entity
2630
@Suppress("LongParameterList")
@@ -34,6 +38,8 @@ class RawCosvFile(
3438
var organization: Organization,
3539
@Enumerated(EnumType.STRING)
3640
var status: RawCosvFileStatus,
41+
@Formula("LOWER(file_name) LIKE '%_$ZIP_ARCHIVE_EXTENSION'")
42+
var isZip: Boolean? = null,
3743
var statusMessage: String? = null,
3844
var contentLength: Long? = null,
3945
override var createDate: LocalDateTime? = null,

save-cosv/src/main/kotlin/com/saveourtool/save/cosv/controllers/RawCosvFileController.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import com.saveourtool.save.v1
1515
import org.reactivestreams.Publisher
1616
import org.springframework.dao.DataIntegrityViolationException
1717
import org.springframework.data.domain.PageRequest
18+
import org.springframework.data.domain.Sort
1819
import org.springframework.http.HttpHeaders
1920
import org.springframework.http.HttpStatus
2021
import org.springframework.http.MediaType
@@ -318,7 +319,7 @@ class RawCosvFileController(
318319
authentication: Authentication,
319320
): ResponseEntity<RawCosvFileDtoFlux> = hasPermission(authentication, organizationName, Permission.READ, "read")
320321
.flatMap {
321-
rawCosvFileStorage.listByOrganizationAndUser(organizationName, authentication.name, PageRequest.of(page, size))
322+
rawCosvFileStorage.listByOrganizationAndUser(organizationName, authentication.name, PageRequest.of(page, size, Sort.by("isZip").descending().and(Sort.by("id"))))
322323
}
323324
.flatMapIterable { it }
324325
.let {

save-cosv/src/main/kotlin/com/saveourtool/save/cosv/storage/RawCosvFileStorage.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isHasErrors
99
import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isPendingRemoved
1010
import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isProcessing
1111
import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isUploadedJsonFile
12-
import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isUploadedZipArchive
12+
import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isZipArchive
1313
import com.saveourtool.save.entities.cosv.RawCosvFileStatisticsDto
1414
import com.saveourtool.save.entities.cosv.RawCosvFileStatus
1515
import com.saveourtool.save.s3.S3Operations
@@ -79,7 +79,7 @@ class RawCosvFileStorage(
7979
val filesList = s3KeyManager.listByOrganizationAndUser(organizationName, userName).toList()
8080
RawCosvFileStatisticsDto(
8181
filesList.count(),
82-
filesList.count { it.isUploadedZipArchive() },
82+
filesList.count { it.isZipArchive() },
8383
filesList.count { it.isUploadedJsonFile() },
8484
filesList.count { it.isProcessing() },
8585
filesList.count { it.isPendingRemoved() },

save-frontend/src/main/kotlin/com/saveourtool/save/frontend/components/basic/fileuploader/CosvFileManagerComponent.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isHasErrors
99
import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isPendingRemoved
1010
import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isProcessing
1111
import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isUploadedJsonFile
12-
import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isUploadedZipArchive
12+
import com.saveourtool.save.entities.cosv.RawCosvFileDto.Companion.isZipArchive
1313
import com.saveourtool.save.entities.cosv.RawCosvFileStatisticsDto
1414
import com.saveourtool.save.entities.cosv.RawCosvFileStreamingResponse
1515
import com.saveourtool.save.frontend.components.basic.selectFormRequired
@@ -89,7 +89,7 @@ val cosvFileManagerComponent: FC<Props> = FC {
8989
setAvailableFiles { it.minus(file) }
9090
setStatistics { it.copy(allAvailableFilesCount = statistics.allAvailableFilesCount.dec()) }
9191
when {
92-
file.isUploadedZipArchive() -> setStatistics { it.copy(uploadedArchivesCount = statistics.uploadedArchivesCount.dec()) }
92+
file.isZipArchive() -> setStatistics { it.copy(uploadedArchivesCount = statistics.uploadedArchivesCount.dec()) }
9393
file.isUploadedJsonFile() -> setStatistics { it.copy(uploadedJsonFilesCount = statistics.uploadedJsonFilesCount.dec()) }
9494
file.isProcessing() -> setStatistics { it.copy(processingFilesCount = statistics.processingFilesCount.dec()) }
9595
file.isPendingRemoved() -> setStatistics { it.copy(pendingRemovedFilesCount = statistics.pendingRemovedFilesCount.dec()) }
@@ -385,11 +385,11 @@ val cosvFileManagerComponent: FC<Props> = FC {
385385
availableFiles.map { file ->
386386
li {
387387
val highlightZipArchive = when {
388-
file.isUploadedZipArchive() -> "font-weight-bold"
388+
file.isZipArchive() -> "font-weight-bold"
389389
else -> ""
390390
}
391391
val fileColor = when {
392-
file.isUploadedZipArchive() -> "primary"
392+
file.isZipArchive() -> "primary"
393393
file.isUploadedJsonFile() -> "success"
394394
file.isProcessing() -> "secondary"
395395
file.isPendingRemoved() -> "light"
@@ -401,15 +401,15 @@ val cosvFileManagerComponent: FC<Props> = FC {
401401
asDynamic()["data-toggle"] = "tooltip"
402402
asDynamic()["data-placement"] = "left"
403403
title = when {
404-
file.isUploadedZipArchive() -> "It's a ZIP archive, please unzip to get JSON files"
404+
file.isZipArchive() -> "It's a ZIP archive, please unzip to get JSON files"
405405
file.isUploadedJsonFile() -> "It's a JSON file, you can submit it"
406406
file.isProcessing() -> "In progress, please wait"
407407
file.isPendingRemoved() -> "Already processed, will be deleted shortly"
408408
file.isDuplicate() -> "Duplicate, the vulnerability with such ID already uploaded: ${file.statusMessage.orEmpty()}"
409409
file.isHasErrors() -> "This JSON file has error: ${file.statusMessage.orEmpty()}"
410410
else -> ""
411411
}
412-
if (file.isUploadedZipArchive()) {
412+
if (file.isZipArchive()) {
413413
button {
414414
type = ButtonType.button
415415
className = ClassName("btn")

0 commit comments

Comments
 (0)