Skip to content

Commit a68f920

Browse files
authored
Added dates for vulnerability (#2259)
* Added dates for vulnerability
1 parent d7242fd commit a68f920

File tree

13 files changed

+250
-2
lines changed

13 files changed

+250
-2
lines changed

db/test-data/db.changelog-insert.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<include file="tests-source-version-insert.xml" relativeToChangelogFile="true"/>
3333
<include file="vulnerability-insert.xml" relativeToChangelogFile="true"/>
3434
<include file="vulnerability-project-insert.xml" relativeToChangelogFile="true"/>
35+
<include file="vulnerability-date-insert.xml" relativeToChangelogFile="true"/>
3536

3637
<changeSet id="add-tests-data" author="nulls">
3738
<tagDatabase tag="test-data-insert"/>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
id;date;type;vulnerability_id;user_id;create_date;update_date
2+
1;"2022-01-01 00:00:00";"DISCOVERED";1;1;"2021-01-01 00:00:00";"2021-01-01 00:00:00"
3+
2;"2022-02-02 00:00:00";"INTRODUCED";1;1;"2021-01-01 00:00:00";"2021-01-01 00:00:00"
4+
3;"2022-03-03 00:00:00";"CVE_CREATED";1;1;"2021-01-01 00:00:00";"2021-01-01 00:00:00"
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<databaseChangeLog
3+
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
6+
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
7+
8+
<changeSet id="vulnerability-date-insert" author="frolov" context="dev">
9+
<loadData tableName="vulnerability_date" encoding="UTF-8" separator=";" quotchar="&quot;" file="db/test-data/sqlRequests/vulnerability-date.csv">
10+
<column header="id" name="id" type="bigint"/>
11+
<column header="date" name="date" type="DATETIME(3)"/>
12+
<column header="type" name="type" type="varchar(64))"/>
13+
<column header="vulnerability_id" name="vulnerability_id" type="bigint"/>
14+
<column header="user_id" name="user_id" type="bigint"/>
15+
<column header="create_date" name="create_date" type="DATETIME(3)"/>
16+
<column header="update_date" name="update_date" type="DATETIME(3)"/>
17+
</loadData>
18+
</changeSet>
19+
20+
</databaseChangeLog>

db/v-2/tables/db.changelog-tables.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<include file="comments.xml" relativeToChangelogFile="true"/>
4343
<include file="contest-sample.xml" relativeToChangelogFile="true"/>
4444
<include file="contest-sample-field.xml" relativeToChangelogFile="true"/>
45+
<include file="vulnerability-date.xml" relativeToChangelogFile="true"/>
4546

4647
<changeSet id="02-tables" author="frolov">
4748
<tagDatabase tag="v2.0-tables"/>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<databaseChangeLog
3+
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
6+
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
7+
8+
<changeSet id="vulnerability-date-1" author="frolov" context="dev or prod">
9+
<createTable tableName="vulnerability_date">
10+
<column name="id" type="bigint" autoIncrement="true">
11+
<constraints primaryKey="true" nullable="false"/>
12+
</column>
13+
<column name="date" type="DATETIME(3)">
14+
<constraints nullable="true"/>
15+
</column>
16+
<column name="type" type="varchar(64)">
17+
<constraints nullable="false"/>
18+
</column>
19+
<column name="vulnerability_id" type="bigint">
20+
<constraints foreignKeyName="fk_vulnerability_date_vulnerability" references="vulnerability(id)" nullable="false" deleteCascade="true"/>
21+
</column>
22+
<column name="user_id" type="bigint">
23+
<constraints foreignKeyName="fk_user_vulnerability_date" references="user(id)" nullable="false"/>
24+
</column>
25+
<column name="create_date" type="DATETIME(3)">
26+
<constraints nullable="true"/>
27+
</column>
28+
<column name="update_date" type="DATETIME(3)">
29+
<constraints nullable="true"/>
30+
</column>
31+
</createTable>
32+
</changeSet>
33+
34+
</databaseChangeLog>

save-backend/src/main/kotlin/com/saveourtool/save/backend/controllers/vulnerability/VulnerabilityController.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.saveourtool.save.configs.ApiSwaggerSupport
66
import com.saveourtool.save.configs.RequiresAuthorizationSourceHeader
77
import com.saveourtool.save.domain.Role
88
import com.saveourtool.save.entities.vulnerabilities.Vulnerability
9+
import com.saveourtool.save.entities.vulnerability.VulnerabilityDateDto
910
import com.saveourtool.save.entities.vulnerability.VulnerabilityDto
1011
import com.saveourtool.save.entities.vulnerability.VulnerabilityProjectDto
1112
import com.saveourtool.save.filters.VulnerabilityFilter
@@ -226,6 +227,22 @@ class VulnerabilityController(
226227
ResponseEntity.ok("Projects were successfully saved in vulnerability")
227228
}
228229

230+
@PostMapping("/save-date")
231+
@Operation(
232+
method = "POST",
233+
summary = "Save new date.",
234+
description = "Save new date.",
235+
)
236+
@ApiResponse(responseCode = "200", description = "Successfully saved new date in vulnerability")
237+
fun saveDate(
238+
@RequestBody vulnerabilityDateDto: VulnerabilityDateDto,
239+
authentication: Authentication,
240+
): Mono<StringResponse> = blockingToMono {
241+
vulnerabilityService.saveDate(vulnerabilityDateDto, authentication)
242+
}.map {
243+
ResponseEntity.ok("Date was successfully saved in vulnerability")
244+
}
245+
229246
@DeleteMapping("/delete-project")
230247
@Operation(
231248
method = "Delete",
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.saveourtool.save.backend.repository.vulnerability
2+
3+
import com.saveourtool.save.entities.vulnerabilities.VulnerabilityDate
4+
import com.saveourtool.save.spring.repository.BaseEntityRepository
5+
import org.springframework.stereotype.Repository
6+
7+
/**
8+
* Repository of vulnerabilityDateRepository
9+
*/
10+
@Repository
11+
interface VulnerabilityDateRepository : BaseEntityRepository<VulnerabilityDate>

save-backend/src/main/kotlin/com/saveourtool/save/backend/service/vulnerability/VulnerabilityService.kt

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,28 @@ package com.saveourtool.save.backend.service.vulnerability
33
import com.saveourtool.save.authservice.utils.AuthenticationDetails
44
import com.saveourtool.save.backend.repository.OrganizationRepository
55
import com.saveourtool.save.backend.repository.UserRepository
6+
import com.saveourtool.save.backend.repository.vulnerability.VulnerabilityDateRepository
67
import com.saveourtool.save.backend.repository.vulnerability.VulnerabilityProjectRepository
78
import com.saveourtool.save.backend.repository.vulnerability.VulnerabilityRepository
89
import com.saveourtool.save.entities.vulnerabilities.Vulnerability
10+
import com.saveourtool.save.entities.vulnerabilities.VulnerabilityDate
911
import com.saveourtool.save.entities.vulnerabilities.VulnerabilityProject
12+
import com.saveourtool.save.entities.vulnerability.VulnerabilityDateDto
1013
import com.saveourtool.save.entities.vulnerability.VulnerabilityDto
1114
import com.saveourtool.save.entities.vulnerability.VulnerabilityProjectDto
1215
import com.saveourtool.save.filters.VulnerabilityFilter
1316
import com.saveourtool.save.utils.getByIdOrNotFound
1417
import com.saveourtool.save.utils.orNotFound
18+
1519
import org.springframework.security.core.Authentication
1620
import org.springframework.stereotype.Service
1721
import org.springframework.transaction.annotation.Transactional
1822
import org.springframework.web.server.ResponseStatusException
23+
1924
import java.time.LocalDateTime
25+
2026
import kotlin.random.Random
27+
import kotlinx.datetime.toJavaLocalDateTime
2128

2229
/**
2330
* A service that provides `Vulnerability`
@@ -27,6 +34,7 @@ import kotlin.random.Random
2734
class VulnerabilityService(
2835
private val vulnerabilityRepository: VulnerabilityRepository,
2936
private val vulnerabilityProjectRepository: VulnerabilityProjectRepository,
37+
private val vulnerabilityDateRepository: VulnerabilityDateRepository,
3038
private val userRepository: UserRepository,
3139
private val organizationRepository: OrganizationRepository,
3240
) {
@@ -151,6 +159,7 @@ class VulnerabilityService(
151159
isActive = false,
152160
userId = user.requiredId(),
153161
organization = organizationNew,
162+
dates = emptySet(),
154163
)
155164
val vulnerabilityNew = vulnerabilityRepository.saveAndFlush(vulnerability)
156165
val newName = "SOTV-${LocalDateTime.now().year}-${vulnerabilityNew.id}"
@@ -167,6 +176,14 @@ class VulnerabilityService(
167176
vulnerability = vulnerabilityNew,
168177
)
169178
}
179+
dates = vulnerabilityDto.dates.map { dto ->
180+
VulnerabilityDate(
181+
date = dto.date.toJavaLocalDateTime(),
182+
type = dto.type,
183+
vulnerability = vulnerabilityNew,
184+
userId = user.requiredId(),
185+
)
186+
}.toSet()
170187
}
171188
)
172189
}
@@ -251,6 +268,32 @@ class VulnerabilityService(
251268
}
252269
}
253270

271+
/**
272+
* @param vulnerabilityDateDto dto of vulnerability date
273+
* @param authentication - auth info of a current user
274+
*/
275+
@Transactional
276+
fun saveDate(
277+
vulnerabilityDateDto: VulnerabilityDateDto,
278+
authentication: Authentication,
279+
) {
280+
val userId = (authentication.details as AuthenticationDetails).id
281+
val user = userRepository.getByIdOrNotFound(userId)
282+
283+
vulnerabilityRepository.findByName(vulnerabilityDateDto.vulnerabilityName)?.let { vulnerability ->
284+
vulnerabilityDateRepository.save(
285+
vulnerabilityDateDto.let { dto ->
286+
VulnerabilityDate(
287+
date = dto.date.toJavaLocalDateTime(),
288+
type = dto.type,
289+
vulnerability = vulnerability,
290+
userId = user.requiredId(),
291+
)
292+
}
293+
)
294+
}
295+
}
296+
254297
/**
255298
* @param name name of project
256299
* @param vulnerabilityName name of vulnerability
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.saveourtool.save.entities.vulnerability
2+
3+
import kotlinx.datetime.LocalDateTime
4+
import kotlinx.serialization.Serializable
5+
6+
/**
7+
* @property date
8+
* @property type
9+
* @property vulnerabilityName
10+
*/
11+
@Serializable
12+
data class VulnerabilityDateDto(
13+
val date: LocalDateTime,
14+
val type: VulnerabilityDateType,
15+
val vulnerabilityName: String,
16+
)
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.saveourtool.save.entities.vulnerability
2+
3+
import kotlin.js.JsExport
4+
import kotlinx.serialization.Serializable
5+
6+
/**
7+
* Enum of vulnerability date type
8+
* @property value pretty name
9+
*/
10+
@Serializable
11+
@JsExport
12+
enum class VulnerabilityDateType(val value: String) {
13+
/**
14+
* Date of CVE created
15+
*/
16+
CVE_CREATED("CVE created"),
17+
18+
/**
19+
* Date of CVE updated
20+
*/
21+
CVE_UPDATED("CVE updated"),
22+
23+
/**
24+
* Date of discovered
25+
*/
26+
DISCOVERED("Discovered"),
27+
28+
/**
29+
* Date of fixed
30+
*/
31+
FIXED("Fixed"),
32+
33+
/**
34+
* Date of introduced
35+
*/
36+
INTRODUCED("Introduced"),
37+
38+
/**
39+
* Date of released
40+
*/
41+
RELEASED("Released"),
42+
;
43+
44+
override fun toString(): String = value
45+
}

0 commit comments

Comments
 (0)