Skip to content

Commit 369c90e

Browse files
authored
Added notifications about new comment in vulnerability (#2846)
* Added notifications about new comment in vulnerability
1 parent 2806d49 commit 369c90e

5 files changed

Lines changed: 85 additions & 12 deletions

File tree

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.saveourtool.save.backend.event
2+
3+
import com.saveourtool.save.backend.service.NotificationService
4+
import com.saveourtool.save.cosv.repository.LnkVulnerabilityMetadataUserRepository
5+
import com.saveourtool.save.cosv.service.VulnerabilityMetadataService
6+
import com.saveourtool.save.entities.Notification
7+
import com.saveourtool.save.entities.User
8+
import com.saveourtool.save.evententities.CommentEvent
9+
import com.saveourtool.save.utils.orNotFound
10+
import org.springframework.context.event.EventListener
11+
import org.springframework.stereotype.Component
12+
13+
/**
14+
* A comment listener for sending notifications.
15+
*/
16+
@Component
17+
class CommentListener(
18+
private val notificationService: NotificationService,
19+
private val vulnerabilityMetadataService: VulnerabilityMetadataService,
20+
private val lnkVulnerabilityMetadataUserRepository: LnkVulnerabilityMetadataUserRepository,
21+
) {
22+
/**
23+
* @param commentEvent new commentEvent
24+
*/
25+
@EventListener
26+
fun createComment(commentEvent: CommentEvent) {
27+
val sectionType = commentEvent.comment.section.substringAfter("/")
28+
.substringBefore("/")
29+
val id = commentEvent.comment.section.substringAfterLast("/")
30+
31+
when (sectionType) {
32+
VULN -> createVulnerabilityComment(id, commentEvent.comment.user)
33+
}
34+
}
35+
36+
private fun createVulnerabilityComment(identifier: String, commentOwner: User) {
37+
val vulnerability = vulnerabilityMetadataService.findByIdentifier(identifier).orNotFound { "Vulnerability with id: $identifier not found" }
38+
39+
val recipients = lnkVulnerabilityMetadataUserRepository.findByVulnerabilityMetadataId(vulnerability.requiredId())
40+
.map { it.user }
41+
.plus(vulnerability.user)
42+
.minus(
43+
commentOwner
44+
)
45+
46+
val message = messageNewVulnComment(commentOwner, identifier)
47+
val notifications = recipients.map { user ->
48+
Notification(
49+
message = message,
50+
user = user,
51+
)
52+
}
53+
notificationService.saveAll(notifications)
54+
}
55+
56+
companion object {
57+
private const val VULN = "vuln"
58+
59+
/**
60+
* @param user
61+
* @param identifier
62+
* @return message
63+
*/
64+
fun messageNewVulnComment(user: User, identifier: String) = """
65+
User: ${user.name} added new comment in $identifier vulnerability.
66+
""".trimIndent()
67+
}
68+
}

save-backend/src/main/kotlin/com/saveourtool/save/backend/security/VulnerabilityPermissionEvaluator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class VulnerabilityPermissionEvaluator(
5151
* @return check permission
5252
*/
5353
fun hasFullPermission(vulnerability: VulnerabilityMetadataDto, authentication: Authentication): Boolean {
54-
val linkUsers = vulnerabilityService.getUsers(vulnerability.identifier).map { it.name }
54+
val linkUsers = vulnerabilityService.findUsersByVulnerabilityId(vulnerability.identifier).map { it.name }
5555
return vulnerability.user.name == authentication.name || authentication.name in linkUsers
5656
}
5757
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ import com.saveourtool.save.backend.repository.CommentRepository
55
import com.saveourtool.save.backend.repository.UserRepository
66
import com.saveourtool.save.entities.Comment
77
import com.saveourtool.save.entities.CommentDto
8+
import com.saveourtool.save.evententities.CommentEvent
89
import com.saveourtool.save.utils.getByIdOrNotFound
910

11+
import org.springframework.context.ApplicationEventPublisher
1012
import org.springframework.security.core.Authentication
1113
import org.springframework.stereotype.Service
1214
import org.springframework.transaction.annotation.Transactional
@@ -21,6 +23,7 @@ import kotlinx.datetime.toJavaLocalDateTime
2123
class CommentService(
2224
private val commentRepository: CommentRepository,
2325
private val userRepository: UserRepository,
26+
private val applicationEventPublisher: ApplicationEventPublisher,
2427
) {
2528
/**
2629
* @param comment comment of user
@@ -36,6 +39,9 @@ class CommentService(
3639
comment.section,
3740
user,
3841
)
42+
43+
applicationEventPublisher.publishEvent(CommentEvent(newComment))
44+
3945
commentRepository.save(newComment)
4046
}
4147

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -406,17 +406,6 @@ class VulnerabilityService(
406406
}.map { it.identifier }
407407
}
408408

409-
/**
410-
* @param identifier vulnerability identifier
411-
* @return list users
412-
*/
413-
fun getUsers(identifier: String) = vulnerabilityMetadataRepository.findByIdentifier(identifier)
414-
.orNotFound { "Not found metadata for vulnerability $identifier" }
415-
.let { metadata ->
416-
lnkVulnerabilityMetadataUserRepository.findByVulnerabilityMetadataId(metadata.requiredId())
417-
.map { it.user.toUserInfo() }
418-
}
419-
420409
/**
421410
* @param name name of project
422411
* @param identifier vulnerability identifier
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.saveourtool.save.evententities
2+
3+
import com.saveourtool.save.entities.Comment
4+
5+
/**
6+
* @property comment
7+
**/
8+
data class CommentEvent(
9+
var comment: Comment
10+
)

0 commit comments

Comments
 (0)