feat: as a developer I want to edit projects

This commit is contained in:
Stipe-Knez 2022-03-04 12:33:58 +01:00
parent 282d66efa6
commit e4e5906211
6 changed files with 67 additions and 6 deletions

View File

@ -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

View File

@ -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()
}
}

View File

@ -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()
)
}

View File

@ -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())
}
}
}

View File

@ -14,4 +14,6 @@ interface ProjectRepository: ReactiveMongoRepository<ProjectEntity, String> {
@DeleteQuery("{'data._id' : ?0}")
fun deleteProjectById(id: String): Mono<Long>
}

View File

@ -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
)
}