Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<compiler-plugin.version>3.8.1</compiler-plugin.version>
<kotlin.version>1.7.10</kotlin.version>
<lombok.version>1.18.24</lombok.version>
<maven.compiler.release>11</maven.compiler.release>
<maven.compiler.release>17</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
Expand Down Expand Up @@ -177,6 +177,7 @@
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<executions>
Expand Down Expand Up @@ -208,6 +209,7 @@
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<executions>
Expand Down
7 changes: 3 additions & 4 deletions src/main/kotlin/org/kravbank/domain/Publication.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package org.kravbank.domain;
package org.kravbank.domain

import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.annotation.JsonManagedReference
import io.quarkus.hibernate.orm.panache.PanacheEntity;
import java.time.LocalDateTime
import java.util.*
import javax.persistence.*

@Entity
class Publication : PanacheEntity() {
class Publication : SoftDeletable() {

var comment: String = ""

Expand All @@ -19,7 +18,7 @@ class Publication : PanacheEntity() {
@Column(unique = true)
var ref: String = UUID.randomUUID().toString()

var deletedDate: LocalDateTime? = null
override var deletedDate: LocalDateTime? = null

@ManyToOne(
cascade = [CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH], //CascadeType.Detach
Expand Down
8 changes: 8 additions & 0 deletions src/main/kotlin/org/kravbank/domain/SoftDeletable.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.kravbank.domain

import io.quarkus.hibernate.orm.panache.PanacheEntity
import java.time.LocalDateTime

sealed class SoftDeletable: PanacheEntity() {
abstract var deletedDate: LocalDateTime?
}
18 changes: 18 additions & 0 deletions src/main/kotlin/org/kravbank/repository/BackendRepository.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.kravbank.repository

import io.quarkus.hibernate.orm.panache.PanacheEntity
import io.quarkus.hibernate.orm.panache.PanacheRepository
import org.kravbank.domain.SoftDeletable
import java.time.LocalDateTime

open class BackendRepository<T : PanacheEntity> : PanacheRepository<T> {
override fun delete(entity: T) = when (entity) {
is SoftDeletable -> {
val deletedDate = LocalDateTime.now()
entity.deletedDate = deletedDate
persistAndFlush(entity)
} else -> {
super.delete(entity)
}
}
}
11 changes: 3 additions & 8 deletions src/main/kotlin/org/kravbank/repository/CodelistRepository.kt
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
package org.kravbank.repository

import io.quarkus.hibernate.orm.panache.PanacheRepository
import org.kravbank.domain.Codelist
import org.kravbank.lang.BackendException
import org.kravbank.lang.BadRequestException
import org.kravbank.lang.NotFoundException
import org.kravbank.utils.Messages.RepoErrorMsg.CODELIST_BADREQUEST_CREATE
import org.kravbank.utils.Messages.RepoErrorMsg.CODELIST_BADREQUEST_DELETE
import org.kravbank.utils.Messages.RepoErrorMsg.CODELIST_BADREQUEST_UPDATE
import org.kravbank.utils.Messages.RepoErrorMsg.CODELIST_NOTFOUND
import java.util.*
import javax.enterprise.context.ApplicationScoped

@ApplicationScoped
class CodelistRepository : PanacheRepository<Codelist> {
class CodelistRepository : BackendRepository<Codelist>() {

@Throws(BackendException::class)
fun findByRef(projectId: Long, ref: String): Codelist {
Expand Down Expand Up @@ -43,12 +41,9 @@ class CodelistRepository : PanacheRepository<Codelist> {
}

@Throws(BackendException::class)
fun deleteCodelist(projectId: Long, codelistRef: String): Codelist {
val deleted: Boolean
fun deleteCodelist(projectId: Long, codelistRef: String): Boolean {
val found = findByRef(projectId, codelistRef)
deleted = deleteById(found.id)
if (!deleted) throw BadRequestException(CODELIST_BADREQUEST_DELETE)
return found
return deleteById(found.id)
}

@Throws(BackendException::class)
Expand Down
12 changes: 1 addition & 11 deletions src/main/kotlin/org/kravbank/repository/PublicationRepository.kt
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
package org.kravbank.repository

import io.quarkus.hibernate.orm.panache.PanacheRepository
import org.kravbank.domain.Publication
import org.kravbank.lang.BackendException
import org.kravbank.lang.BadRequestException
import org.kravbank.lang.NotFoundException
import org.kravbank.utils.Messages.RepoErrorMsg.PUBLICATION_BADREQUEST_CREATE
import org.kravbank.utils.Messages.RepoErrorMsg.PUBLICATION_BADREQUEST_UPDATE
import org.kravbank.utils.Messages.RepoErrorMsg.PUBLICATION_NOTFOUND
import java.time.LocalDateTime
import java.util.*
import javax.enterprise.context.ApplicationScoped
import kotlin.streams.toList

@ApplicationScoped
class PublicationRepository : PanacheRepository<Publication> {
class PublicationRepository : BackendRepository<Publication>() {
@Throws(BackendException::class)
fun findByRef(projectId: Long, ref: String): Publication {
val publication =
Expand Down Expand Up @@ -43,13 +40,6 @@ class PublicationRepository : PanacheRepository<Publication> {
}
}

fun deletePublication(id: Long): Boolean {
val deletedDate = LocalDateTime.now()
val updates = update("deleteddate = ?1 where id = ?2", deletedDate, id)
if (updates > 0) return true
return false
}

@Throws(BackendException::class)
fun updatePublication(id: Long, publication: Publication) {
val updated = update(
Expand Down
6 changes: 2 additions & 4 deletions src/main/kotlin/org/kravbank/resource/CodelistResource.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import javax.transaction.Transactional
import javax.ws.rs.*
import javax.ws.rs.core.MediaType.APPLICATION_JSON
import javax.ws.rs.core.Response
import kotlin.streams.toList

@Path("/api/v1/projects/{projectRef}/codelists")
@Produces(APPLICATION_JSON)
Expand Down Expand Up @@ -56,9 +55,8 @@ class CodelistResource(val codelistService: CodelistService) {
@PathParam("projectRef") projectRef: String,
@PathParam("codelistRef") codelistRef: String
): Response {
val codelist = codelistService.delete(projectRef, codelistRef)
val form = CodelistForm().fromEntity(codelist)
return Response.ok(form.ref).build()
codelistService.delete(projectRef, codelistRef)
return Response.ok(codelistRef).build()
}

@PUT
Expand Down
2 changes: 1 addition & 1 deletion src/main/kotlin/org/kravbank/service/CodelistService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class CodelistService(
}

@Throws(BackendException::class)
fun delete(projectRef: String, codelistRef: String): Codelist {
fun delete(projectRef: String, codelistRef: String): Boolean {
val foundProject = projectRepository.findByRef(projectRef)
return codelistRepository.deleteCodelist(foundProject.id, codelistRef)
}
Expand Down
7 changes: 3 additions & 4 deletions src/main/kotlin/org/kravbank/service/PublicationService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package org.kravbank.service
import org.kravbank.dao.PublicationForm
import org.kravbank.domain.Publication
import org.kravbank.lang.BackendException
import org.kravbank.lang.BadRequestException
import org.kravbank.repository.ProjectRepository
import org.kravbank.repository.PublicationRepository
import java.time.LocalDateTime
Expand Down Expand Up @@ -39,9 +38,9 @@ class PublicationService(
fun delete(projectRef: String, publicationRef: String): Publication {
val foundProject = projectRepository.findByRef(projectRef)
val publication = publicationRepository.findByRef(foundProject.id, publicationRef)
val deleted = publicationRepository.deletePublication(publication.id)
if (deleted) return publication
throw BadRequestException("Bad request! Did not delete publication")
publicationRepository.delete(publication)
return publication
// throw BadRequestException("Bad request! Did not delete publication") TODO: Put somewhere else further up in chain
}

@Throws(BackendException::class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import io.quarkus.test.security.TestSecurity
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.fail
import org.kravbank.dao.CodelistForm
import org.kravbank.domain.Codelist
import org.kravbank.lang.BadRequestException
Expand All @@ -17,7 +18,6 @@ import org.kravbank.utils.Messages.RepoErrorMsg.CODELIST_NOTFOUND
import org.kravbank.utils.TestSetup
import org.kravbank.utils.TestSetup.Arrange.codelist
import org.kravbank.utils.TestSetup.Arrange.codelists
import org.kravbank.utils.TestSetup.Arrange.newCodelist_2
import org.kravbank.utils.TestSetup.Arrange.updatedCodelistForm
import org.mockito.ArgumentMatchers
import org.mockito.Mockito
Expand Down Expand Up @@ -90,14 +90,31 @@ internal class CodelistResourceMockTest {

val response: Response = codelistResource.listCodelists(projectRef)

val entity: List<CodelistForm> = response.entity as List<CodelistForm>
val entity = response.entity

// Litt over-the-top her kanskje, men det viser "type narrowing", kalt "smart casts" i Kotlin
//
if (entity is List<*>) {

assertNotNull(response)
assertEquals(Response.Status.OK.statusCode, response.status)
assertNotNull(response.entity)
assertFalse(entity.isEmpty())
val firstObjectInList = entity[0]
if (firstObjectInList is CodelistForm) {
assertEquals(codelists[0].title, firstObjectInList.title)
assertEquals(codelists[0].description, firstObjectInList.description)
} else {
if (firstObjectInList !== null) {
fail("""Expected a list of CodelistForm, but the list contained: ${firstObjectInList::class.java.typeName}""")
} else {
fail("""Expected a list of CodelistForm, but there was no object in the list.""")
}
}
} else {
fail("""Expected a list of CodelistForm, got: ${entity::class.java.typeName}""")
}

assertNotNull(response)
assertEquals(Response.Status.OK.statusCode, response.status)
assertNotNull(response.entity)
assertFalse(entity.isEmpty())
assertEquals(codelists[0].title, entity[0].title)
assertEquals(codelists[0].description, entity[0].description)
}

@Test
Expand Down Expand Up @@ -127,13 +144,13 @@ internal class CodelistResourceMockTest {
codelistRef
)
)
.thenReturn(newCodelist_2)
.thenReturn(true)

val response: Response =
codelistResource.deleteCodelist(projectRef, codelistRef)

assertNotNull(response)
assertEquals(newCodelist_2.ref, response.entity)
assertEquals(codelistRef, response.entity)
}

@Test
Expand All @@ -146,16 +163,17 @@ internal class CodelistResourceMockTest {
)
)
.thenThrow(BadRequestException(CODELIST_BADREQUEST_DELETE))
try {

val exception = assertThrows(
BadRequestException::class.java
) {
codelistResource.deleteCodelist(
projectRef,
codelistRef
).entity as BadRequestException

} catch (e: Exception) {
assertEquals(CODELIST_BADREQUEST_DELETE, e.message)
)
}

assertEquals(CODELIST_BADREQUEST_DELETE, exception.message)
}

@Test
Expand Down
10 changes: 4 additions & 6 deletions src/test/kotlin/org/kravbank/service/CodelistServiceTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import org.kravbank.utils.TestSetup
import org.kravbank.utils.TestSetup.Arrange.codelist
import org.kravbank.utils.TestSetup.Arrange.codelistForm
import org.kravbank.utils.TestSetup.Arrange.codelists
import org.kravbank.utils.TestSetup.Arrange.newCodelist_2
import org.kravbank.utils.TestSetup.Arrange.updatedCodelistForm
import org.mockito.ArgumentMatchers
import org.mockito.Mockito
Expand Down Expand Up @@ -105,13 +104,12 @@ internal class CodelistServiceTest {
codelistRef
)
)
.thenReturn(newCodelist_2)
.thenReturn(true)

val mockedCodelist: Codelist =
codelistService.delete(projectRef, codelistRef)
val result = codelistService.delete(projectRef, codelistRef)

Assertions.assertNotNull(mockedCodelist)
Assertions.assertEquals(newCodelist_2, mockedCodelist)
Assertions.assertNotNull(result)
Assertions.assertEquals(true, result)
}

@Test
Expand Down