Compare commits
1 Commits
main
...
skz_c4po_9
Author | SHA1 | Date |
---|---|---|
|
e4e5906211 |
|
@ -71,10 +71,28 @@ include::{snippets}/deleteProject/http-response.adoc[]
|
|||
|
||||
include::{snippets}/deleteProject/response-fields.adoc[]
|
||||
|
||||
=== Update project
|
||||
|
||||
To update a project, call the PATCH request /projects/{projectId}
|
||||
|
||||
==== Request example
|
||||
|
||||
include::{snippets}/deleteProject/http-request.adoc[]
|
||||
|
||||
==== Response example
|
||||
|
||||
include::{snippets}/deleteProject/http-response.adoc[]
|
||||
|
||||
==== Response structure
|
||||
|
||||
include::{snippets}/deleteProject/response-fields.adoc[]
|
||||
|
||||
== Change History
|
||||
|
||||
|===
|
||||
|Date |Change
|
||||
|2022-03-04
|
||||
|Added PATCH endpoint to save Projects
|
||||
|2022-02-01
|
||||
|Added DELETE endpoint to save Projects
|
||||
|2021-12-22
|
||||
|
|
|
@ -5,6 +5,7 @@ import com.securityc4po.api.configuration.NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CO
|
|||
import com.securityc4po.api.configuration.RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings
|
||||
import org.springframework.data.annotation.Id
|
||||
import java.time.Instant
|
||||
|
||||
@SuppressFBWarnings(
|
||||
NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR,
|
||||
|
@ -16,4 +17,11 @@ abstract class BaseEntity<T>(
|
|||
) {
|
||||
@Id
|
||||
lateinit var id: String
|
||||
|
||||
var lastModified: Instant = Instant.now()
|
||||
|
||||
fun setLastModifiedToCurrentInstant() {
|
||||
this.lastModified = Instant.now()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -50,10 +50,6 @@ data class ProjectRequestBody(
|
|||
val tester: String? = null
|
||||
)
|
||||
|
||||
data class ProjectDeleteRequestBody(
|
||||
val id: String
|
||||
)
|
||||
|
||||
fun ProjectRequestBody.toProject(): Project {
|
||||
return Project(
|
||||
id = UUID.randomUUID().toString(),
|
||||
|
@ -65,5 +61,4 @@ fun ProjectRequestBody.toProject(): Project {
|
|||
createdBy = UUID.randomUUID().toString()
|
||||
|
||||
)
|
||||
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ import java.util.*
|
|||
origins = [],
|
||||
allowCredentials = "false",
|
||||
allowedHeaders = ["*"],
|
||||
methods = [RequestMethod.GET, RequestMethod.DELETE, RequestMethod.POST]
|
||||
methods = [RequestMethod.GET, RequestMethod.DELETE, RequestMethod.POST, RequestMethod.PATCH]
|
||||
)
|
||||
|
||||
@SuppressFBWarnings(BC_BAD_CAST_TO_ABSTRACT_COLLECTION)
|
||||
|
@ -49,4 +49,14 @@ class ProjectController(private val projectService: ProjectService) {
|
|||
ResponseEntity.ok().body(it.toProjectDeleteResponseBody())
|
||||
}
|
||||
}
|
||||
|
||||
@PatchMapping("/{id}")
|
||||
fun updateProject(
|
||||
@PathVariable(value = "id") id: String,
|
||||
@RequestBody body: ProjectRequestBody
|
||||
): Mono<ResponseEntity<ResponseBody>> {
|
||||
return this.projectService.updateProject(id, body).map {
|
||||
ResponseEntity.accepted().body(it.toProjectResponseBody())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,4 +14,6 @@ interface ProjectRepository: ReactiveMongoRepository<ProjectEntity, String> {
|
|||
|
||||
@DeleteQuery("{'data._id' : ?0}")
|
||||
fun deleteProjectById(id: String): Mono<Long>
|
||||
|
||||
|
||||
}
|
|
@ -7,6 +7,8 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings
|
|||
import org.springframework.stereotype.Service
|
||||
import reactor.core.publisher.Mono
|
||||
import reactor.kotlin.core.publisher.switchIfEmpty
|
||||
import java.time.Instant
|
||||
import java.util.*
|
||||
|
||||
|
||||
@Service
|
||||
|
@ -45,4 +47,30 @@ class ProjectService(private val projectRepository: ProjectRepository) {
|
|||
projectRepository.deleteProjectById(id).map{project}
|
||||
}
|
||||
}
|
||||
|
||||
fun updateProject(id: String, body: ProjectRequestBody): Mono<Project> {
|
||||
return projectRepository.findProjectById(id).switchIfEmpty{
|
||||
logger.info("Project with id $id not found. Updating not possible.")
|
||||
Mono.empty()
|
||||
}.flatMap{projectEntity: ProjectEntity ->
|
||||
projectEntity.lastModified = Instant.now()
|
||||
projectEntity.data = buildProject(body, projectEntity)
|
||||
projectRepository.save(projectEntity).map{
|
||||
it.toProject()
|
||||
}.doOnError {
|
||||
logger.warn("Project could not be updated in Database. Thrown exception: ", it)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun buildProject(body: ProjectRequestBody, projectEntity: ProjectEntity): Project{
|
||||
return Project(
|
||||
id = projectEntity.data.id,
|
||||
client = body.client,
|
||||
title = body.title,
|
||||
createdAt = projectEntity.data.createdAt,
|
||||
tester = body.tester,
|
||||
createdBy = projectEntity.data.createdBy
|
||||
)
|
||||
}
|
Loading…
Reference in New Issue