Skip to content

Commit

Permalink
More event updates.
Browse files Browse the repository at this point in the history
  • Loading branch information
cstroe committed Jan 23, 2019
1 parent 53ca11b commit 9af2868
Show file tree
Hide file tree
Showing 11 changed files with 72 additions and 46 deletions.
8 changes: 7 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ services:
image: postgres:10
ports:
- 5432:5432
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
environment:
POSTGRES_DB: checklister
POSTGRES_USER: checklister
Expand All @@ -18,7 +23,8 @@ services:
ports:
- 8180:8080
depends_on:
- db
db:
condition: service_healthy
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/checklister
SPRING_DATASOURCE_USERNAME: checklister
Expand Down
10 changes: 5 additions & 5 deletions src/main/kotlin/cloud/cosmin/checklister/rest/ItemController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@ constructor(private val itemService: ItemService) {
@PutMapping("/api/v1/item/{itemId}")
@ApiOperation("Update an item")
fun updateItem(@PathVariable itemId: UUID,
@RequestBody dto: ItemUpdateDto): ResponseEntity<ItemGetDto> {
val updated = itemService.update(dto)
if(updated.isPresent) {
return ResponseEntity.ok(updated.get())
@RequestBody dto: ItemPostDto): ResponseEntity<ItemGetDto> {
val updated = itemService.update(itemId, dto)
return if(updated.isPresent) {
ResponseEntity.ok(updated.get())
} else {
return ResponseEntity.notFound().build()
ResponseEntity.notFound().build()
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cloud.cosmin.checklister.service

interface EventSink {
fun accept(event: ItemEvent)
fun accept(event: ItemUpdateEvent)
fun accept(event: ItemRankEvent)
}
8 changes: 3 additions & 5 deletions src/main/kotlin/cloud/cosmin/checklister/service/ItemEvent.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package cloud.cosmin.checklister.service

import cloud.cosmin.checklister.dto.ItemUpdateDto
import cloud.cosmin.checklister.dto.ItemPostDto
import java.util.*

enum class ItemEventType {
UPDATE, RANK
}

abstract class ItemEvent(val type: ItemEventType, val id: UUID)
data class ItemUpdateEvent(val type: ItemEventType, val id: UUID, val item: ItemPostDto)

data class ItemUpdateEvent(val payload: ItemUpdateDto) : ItemEvent(ItemEventType.UPDATE, payload.id)

data class ItemRankEvent(val payload: UUID, val op: RankOperation) : ItemEvent(ItemEventType.RANK, payload)
data class ItemRankEvent(val type: ItemEventType, val id: UUID, val op: RankOperation, val newRank: Int)
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cloud.cosmin.checklister.service

import cloud.cosmin.checklister.dto.ItemUpdateDto
import cloud.cosmin.checklister.dto.ItemPostDto
import org.springframework.stereotype.Service
import java.util.*

Expand All @@ -9,13 +9,13 @@ import java.util.*
*/
@Service
class ItemEventService(private val eventSink: EventSink) : ItemEvents {
override fun update(dto: ItemUpdateDto) {
val event = ItemUpdateEvent(dto)
override fun update(id: UUID, dto: ItemPostDto) {
val event = ItemUpdateEvent(ItemEventType.UPDATE, id, dto)
eventSink.accept(event)
}

override fun rank(id: UUID, op: RankOperation) {
val event = ItemRankEvent(id, op)
override fun rank(id: UUID, op: RankOperation, newRank: Int) {
val event = ItemRankEvent(ItemEventType.RANK, id, op, newRank)
eventSink.accept(event)
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package cloud.cosmin.checklister.service

import cloud.cosmin.checklister.dto.ItemUpdateDto
import cloud.cosmin.checklister.dto.ItemPostDto
import java.util.*

/**
* Actions on items that can be audited.
*/
interface ItemEvents {
fun update(dto: ItemUpdateDto): Unit
fun rank(id: UUID, op: RankOperation): Unit
fun update(id: UUID, dto: ItemPostDto): Unit
fun rank(id: UUID, op: RankOperation, newRank: Int): Unit
}
10 changes: 5 additions & 5 deletions src/main/kotlin/cloud/cosmin/checklister/service/ItemService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package cloud.cosmin.checklister.service

import cloud.cosmin.checklister.dao.ItemEntity
import cloud.cosmin.checklister.dto.ItemGetDto
import cloud.cosmin.checklister.dto.ItemUpdateDto
import cloud.cosmin.checklister.dto.ItemPostDto
import cloud.cosmin.checklister.repo.ItemRepo
import org.springframework.stereotype.Service
import java.util.*
Expand All @@ -16,8 +16,8 @@ class ItemService(val itemRepo: ItemRepo,
.map({ converterService.itemDto(it) })
}

fun update(dto: ItemUpdateDto): Optional<ItemGetDto> {
val optionalItem = itemRepo.findById(dto.id)
fun update(id: UUID, dto: ItemPostDto): Optional<ItemGetDto> {
val optionalItem = itemRepo.findById(id)
if (!optionalItem.isPresent) {
return Optional.empty()
}
Expand All @@ -27,7 +27,7 @@ class ItemService(val itemRepo: ItemRepo,
item.contentType = dto.contentType

val saved = itemRepo.save(item)
itemEventService.update(dto)
itemEventService.update(id, dto)
return Optional.of(converterService.itemDto(saved))
}

Expand All @@ -39,7 +39,7 @@ class ItemService(val itemRepo: ItemRepo,
RankOperation.BOTTOM -> itemRepo.rankBottom(id)
}

itemEventService.rank(id, op)
itemEventService.rank(id, op, entity.rank)
return converterService.itemDto(entity)
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package cloud.cosmin.checklister.service.eventsink

import cloud.cosmin.checklister.service.EventSink
import cloud.cosmin.checklister.service.ItemEvent
import cloud.cosmin.checklister.service.ItemRankEvent
import cloud.cosmin.checklister.service.ItemUpdateEvent
import org.apache.logging.log4j.LogManager
import org.springframework.stereotype.Service

@Service
class LoggerEventSink : EventSink {
private val log = LogManager.getLogger(javaClass)

override fun accept(event: ItemEvent) {
override fun accept(event: ItemUpdateEvent) {
log.info("ItemEvent: {}", event)
}

override fun accept(event: ItemRankEvent) {
log.info("ItemEvent: {}", event)
}
}
14 changes: 14 additions & 0 deletions src/main/resources/log4j2.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
<Logger name="cloud.cosmin.checklister.service.eventsink.LoggerEventSink" level="info"/>
</Loggers>
</Configuration>
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cloud.cosmin.checklister.service

import cloud.cosmin.checklister.dto.ItemUpdateDto
import cloud.cosmin.checklister.dto.ItemPostDto
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.mockito.Mockito.mock
Expand All @@ -15,10 +15,11 @@ internal class ItemEventServiceTest {
val eventSink = mock(EventSink::class.java)
val service = ItemEventService(eventSink)

val itemUpdateDto = ItemUpdateDto(UUID.randomUUID(), "content", "contentType")
service.update(itemUpdateDto)
val id = UUID.randomUUID()
val itemUpdateDto = ItemPostDto("content", "contentType")
service.update(id, itemUpdateDto)

val event = ItemUpdateEvent(itemUpdateDto)
val event = ItemUpdateEvent(ItemEventType.UPDATE, id, itemUpdateDto)
verify(eventSink).accept(event)
}

Expand All @@ -29,9 +30,9 @@ internal class ItemEventServiceTest {
val service = ItemEventService(eventSink)

val id = UUID.randomUUID()
service.rank(id, RankOperation.UP)
service.rank(id, RankOperation.UP, 1)

val event = ItemRankEvent(id, RankOperation.UP)
val event = ItemRankEvent(ItemEventType.RANK, id, RankOperation.UP, 1)
verify(eventSink).accept(event)
}

Expand All @@ -42,9 +43,9 @@ internal class ItemEventServiceTest {
val service = ItemEventService(eventSink)

val id = UUID.randomUUID()
service.rank(id, RankOperation.DOWN)
service.rank(id, RankOperation.DOWN, 1)

val event = ItemRankEvent(id, RankOperation.DOWN)
val event = ItemRankEvent(ItemEventType.RANK, id, RankOperation.DOWN, 1)
verify(eventSink).accept(event)
}

Expand All @@ -55,9 +56,9 @@ internal class ItemEventServiceTest {
val service = ItemEventService(eventSink)

val id = UUID.randomUUID()
service.rank(id, RankOperation.TOP)
service.rank(id, RankOperation.TOP, 1)

val event = ItemRankEvent(id, RankOperation.TOP)
val event = ItemRankEvent(ItemEventType.RANK, id, RankOperation.TOP, 1)
verify(eventSink).accept(event)
}

Expand All @@ -68,9 +69,9 @@ internal class ItemEventServiceTest {
val service = ItemEventService(eventSink)

val id = UUID.randomUUID()
service.rank(id, RankOperation.BOTTOM)
service.rank(id, RankOperation.BOTTOM, 1)

val event = ItemRankEvent(id, RankOperation.BOTTOM)
val event = ItemRankEvent(ItemEventType.RANK, id, RankOperation.BOTTOM, 1)
verify(eventSink).accept(event)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package cloud.cosmin.checklister.service

import cloud.cosmin.checklister.dao.ItemEntity
import cloud.cosmin.checklister.dto.ItemGetDto
import cloud.cosmin.checklister.dto.ItemUpdateDto
import cloud.cosmin.checklister.dto.ItemPostDto
import cloud.cosmin.checklister.repo.ItemRepo
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
Expand Down Expand Up @@ -70,10 +70,10 @@ internal class ItemServiceTest {
`when`(itemRepo.save(entity)).thenReturn(entity)
`when`(converterService.itemDto(entity)).thenReturn(dto)

val itemUpdateDto = ItemUpdateDto(id, "content", "contentType")
val itemUpdateDto = ItemPostDto("content", "contentType")

val itemService = ItemService(itemRepo, converterService, eventService)
val returned = itemService.update(itemUpdateDto).get()
val returned = itemService.update(id, itemUpdateDto).get()

assertEquals(dto, returned)
}
Expand Down Expand Up @@ -193,12 +193,12 @@ internal class ItemServiceTest {
`when`(itemRepo.save(entity)).thenReturn(entity)
`when`(converterService.itemDto(entity)).thenReturn(dto)

val itemUpdateDto = ItemUpdateDto(id, "content", "contentType")
val itemUpdateDto = ItemPostDto("content", "contentType")

val itemService = ItemService(itemRepo, converterService, eventService)
itemService.update(itemUpdateDto).get()
itemService.update(id, itemUpdateDto).get()

verify(eventService).update(itemUpdateDto)
verify(eventService).update(id, itemUpdateDto)
}

@Test @DisplayName("should emit a rank event")
Expand All @@ -213,6 +213,7 @@ internal class ItemServiceTest {
entity.id = id
entity.content = "dbContent"
entity.contentType = "dbContentType"
entity.rank = 1

val dto = ItemGetDto(id, null, null, null, null)

Expand All @@ -222,6 +223,6 @@ internal class ItemServiceTest {
val itemService = ItemService(itemRepo, converterService, eventService)
itemService.rank(id, RankOperation.TOP)

verify(eventService).rank(id, RankOperation.TOP)
verify(eventService).rank(id, RankOperation.TOP, 1)
}
}

0 comments on commit 9af2868

Please sign in to comment.