diff --git a/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyAggregate.kt b/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyAggregate.kt index 2a82d0f..9ad7f4d 100644 --- a/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyAggregate.kt +++ b/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyAggregate.kt @@ -6,7 +6,6 @@ import org.axonframework.commandhandling.CommandHandler import org.axonframework.eventsourcing.EventSourcingHandler import org.axonframework.modelling.command.AggregateIdentifier import org.axonframework.modelling.command.AggregateLifecycle.apply -import org.axonframework.modelling.command.TargetAggregateIdentifier import org.axonframework.spring.stereotype.Aggregate import java.util.* @@ -15,14 +14,19 @@ class CopyAggregate() { @AggregateIdentifier lateinit var copyId: UUID - + lateinit var organisation: Party.Organisation + lateinit var copyStatus: CopyStatus + lateinit var borrower: Party.User + lateinit var name: String @CommandHandler constructor(command: RegisterNewCopy) : this() { apply(command.run { NewCopyRegistered( copyId = UUID.randomUUID(), - isbn = isbn, - owner = owner, + isbn = command.isbn, + owner = command.owner, + organisation = command.organisation, + name = command.name ) }) } @@ -30,11 +34,17 @@ class CopyAggregate() { @EventSourcingHandler fun on(evt: NewCopyRegistered) { this.copyId = evt.copyId + this.copyStatus = CopyStatus.AVAILABLE } } -data class RegisterNewCopy(val isbn: String, val owner: Party) +data class RegisterNewCopy(val isbn: String,val owner: Party.User, val organisation: Party.Organisation, val name: String) { +} + +data class NewCopyRegistered(val copyId: UUID, val isbn: String, val owner: Party.User, val organisation: Party.Organisation, val name: String) -data class NewCopyRegistered(val copyId: UUID, val isbn: String, val owner: Party) \ No newline at end of file +enum class CopyStatus{ + AVAILABLE, BORROWED +} \ No newline at end of file diff --git a/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyAvailabilityReadModel.kt b/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyAvailabilityReadModel.kt index 348df39..9d251b6 100644 --- a/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyAvailabilityReadModel.kt +++ b/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyAvailabilityReadModel.kt @@ -21,6 +21,7 @@ class CopyEventProcessor(val copyReadModelRepository: CopyReadModelRepository) { id = event.copyId, isbn = event.isbn, owner = event.owner.partyId, + status = CopyStatus.AVAILABLE ) ) } @@ -29,6 +30,8 @@ class CopyEventProcessor(val copyReadModelRepository: CopyReadModelRepository) { interface CopyReadModelRepository : CrudRepository { fun findAllByOwner(owner: Party): Iterable fun findAllByOwnerIn(owner: Collection): Iterable + + fun findByNameAndOrganisationIn(name: String, organisations: Collection): Iterable } @Entity(name = "copy_availability_model") @@ -37,6 +40,7 @@ data class CopyAvailabilityModel( val id: UUID, val isbn: String, val owner: UUID, + val status: CopyStatus ) diff --git a/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyController.kt b/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyController.kt index 76bd80d..dd6bfbf 100644 --- a/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyController.kt +++ b/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyController.kt @@ -23,7 +23,14 @@ class CopyController( suspend fun create(@RequestBody body: CreateCopyDTO, principal: Principal) = body.run { val user = authenticationService.findUser(principal) - val aggregateId = commandGateway.send(RegisterNewCopy(isbn, Party.User(user.id))).await() + val aggregateId = commandGateway.send( + RegisterNewCopy( + isbn, + user, + Party.Organisation(body.organisationID), + body.name + ) + ).await() CreatedCopyDTO(aggregateId) } @@ -38,10 +45,31 @@ class CopyController( .let { CopyAvailabilityListDTO(it) } } + @GetMapping("/search") + suspend fun listCopiesByName(@RequestBody body: searchDTO, principal: Principal) : SearchCopyListDTO = + authenticationService.withUser(principal) {it.organisations}.let { + queryGateway.query( + QueryByNameAndOrganisations( + body.name, + authenticationService.findUser(principal), + authenticationService.findUser(principal).organisations), + ResponseTypes.multipleInstancesOf(CopyAvailabilityModel::class.java) + ).await() + .map { it.run { CopyAvailabilityDTO(id = it.id, isbn = it.isbn) } } + .let { SearchCopyListDTO(it) } + } + + } -data class CreateCopyDTO(val isbn: String); -data class CreatedCopyDTO(val id: UUID); + +class searchDTO (val name: String) { +} + +data class SearchCopyListDTO (val l: List) + +data class CreateCopyDTO(val isbn: String, val organisationID: UUID, val owner: Party.User, val name: String) +data class CreatedCopyDTO(val id: UUID) data class CopyAvailabilityListDTO( val copies: List @@ -49,5 +77,5 @@ data class CopyAvailabilityListDTO( data class CopyAvailabilityDTO( val id: UUID, - var isbn: String, + var isbn: String ) diff --git a/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyQueryHandler.kt b/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyQueryHandler.kt index 6d0d06a..ef2a18d 100644 --- a/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyQueryHandler.kt +++ b/backend/src/main/kotlin/com/ksidelta/libruch/modules/copy/CopyQueryHandler.kt @@ -18,8 +18,17 @@ class CopyQueryHandler(val copyReadModelRepository: CopyReadModelRepository) { fun query(queryByOwners: QueryByOwners) = copyReadModelRepository.findAllByOwnerIn(owner = queryByOwners.owners).toList() + @QueryHandler + fun query(queryByName: QueryByNameAndOrganisations) = + copyReadModelRepository.findByNameAndOrganisationIn(name = queryByName.name, organisations = queryByName.organisations) } class QueryAllCopies() {} class QueryByOwner(val owner: Party) {} class QueryByOwners(val owners: Collection) {} + +class QueryByNameAndOrganisations( + val name: String, + val user: Party.User, + val organisations: Collection +)