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
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package fr.polyflix.user.application.http.controller

import fr.polyflix.user.application.http.dto.response.groupRequest.GroupRequestResponse
import fr.polyflix.user.application.http.dto.response.groupRequest.PaginatedGroupRequestResponse
import fr.polyflix.user.domain.service.GroupRequestService
import org.springframework.data.domain.PageRequest
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import java.util.*

@RestController
@RequestMapping("/groups/{slug}/requests")
class GroupRequestController(private val groupRequestService: GroupRequestService) {
@GetMapping
fun getGroupRequests(
@RequestParam(required = false, defaultValue = "0") page: Int,
@RequestParam(required = false, defaultValue = "10") size: Int
): ResponseEntity<PaginatedGroupRequestResponse> {
val groupRequests = groupRequestService.getGroupRequests(PageRequest.of(page, size))
return ResponseEntity.ok(PaginatedGroupRequestResponse(groupRequests))
}

@GetMapping("/{id}")
fun getGroupById(@PathVariable id: UUID): ResponseEntity<GroupRequestResponse> {
return groupRequestService.findGroupRequestById(id)
.map { ResponseEntity.ok(GroupRequestResponse(it)) }
.orElseGet { ResponseEntity.notFound().build() }
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package fr.polyflix.user.application.http.dto.response.group

import fr.polyflix.user.application.http.dto.response.groupRequest.GroupRequestResponse
import fr.polyflix.user.application.http.dto.response.user.UserResponse
import fr.polyflix.user.domain.entity.Group
import java.util.UUID
import java.util.*

class GroupResponse(group: Group) {
val id: UUID = group.id
val name: String = group.name
val slug: String = group.slug
val owner: UserResponse = UserResponse(group.owner)
val members: List<UserResponse> = group.members.map { UserResponse(it) }
val groupRequests: List<GroupRequestResponse> = group.groupRequests.map { GroupRequestResponse(it) }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package fr.polyflix.user.application.http.dto.response.groupRequest

import fr.polyflix.user.domain.entity.GroupRequest
import java.time.LocalDateTime
import java.util.*

class GroupRequestResponse(groupRequest: GroupRequest) {
val id: UUID = groupRequest.id
val reason: String = groupRequest.reason
val createdDate: LocalDateTime = groupRequest.createdDate
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package fr.polyflix.user.application.http.dto.response.groupRequest

import fr.polyflix.user.domain.entity.GroupRequest
import org.springframework.data.domain.Page

class PaginatedGroupRequestResponse(data: Page<GroupRequest>) {
val totalElements: Long = data.totalElements
val totalPages: Int = data.totalPages
val currentPage: Int = data.number
val data: List<GroupRequestResponse> = data.content.map { GroupRequestResponse(it) }
}
5 changes: 3 additions & 2 deletions src/main/kotlin/fr/polyflix/user/domain/entity/Group.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package fr.polyflix.user.domain.entity

import java.util.UUID
import java.util.*

class Group(
val id: UUID,
var name: String,
val slug: String,
val owner: User,
var members: MutableSet<User>
var members: MutableSet<User>,
var groupRequests: MutableSet<GroupRequest>
) {
override fun toString(): String {
return "Group { name = $name, slug = $slug }"
Expand Down
10 changes: 10 additions & 0 deletions src/main/kotlin/fr/polyflix/user/domain/entity/GroupRequest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package fr.polyflix.user.domain.entity

import java.time.LocalDateTime
import java.util.*

class GroupRequest(
val id: UUID,
val reason: String,
var createdDate: LocalDateTime
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package fr.polyflix.user.domain.persistence.repository

import fr.polyflix.user.domain.entity.GroupRequest
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import java.util.*

interface GroupRequestRepository {
fun findAll(pageable: Pageable): Page<GroupRequest>
fun findOne(id: UUID): Optional<GroupRequest>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package fr.polyflix.user.domain.service

import fr.polyflix.user.domain.entity.GroupRequest
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import java.util.*

interface GroupRequestService {
fun getGroupRequests(pageable: Pageable): Page<GroupRequest>
fun findGroupRequestById(id: UUID): Optional<GroupRequest>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package fr.polyflix.user.domain.service.impl

import fr.polyflix.user.domain.entity.GroupRequest
import fr.polyflix.user.domain.persistence.repository.GroupRequestRepository
import fr.polyflix.user.domain.service.GroupRequestService
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import java.util.*

class GroupRequestServiceImpl(
private val groupRequestRepository: GroupRequestRepository,
) : GroupRequestService {
override fun getGroupRequests(pageable: Pageable): Page<GroupRequest> {
return groupRequestRepository.findAll(pageable)
}

override fun findGroupRequestById(id: UUID): Optional<GroupRequest> {
return groupRequestRepository.findOne(id)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import java.util.*

class GroupServiceImpl(private val groupRepository: GroupRepository, private val userRepository: UserRepository): GroupService {
class GroupServiceImpl(private val groupRepository: GroupRepository, private val userRepository: UserRepository) :
GroupService {
private val logger = LoggerFactory.getLogger(javaClass)

override fun create(props: CreateGroupProps): Group {
Expand All @@ -32,7 +33,7 @@ class GroupServiceImpl(private val groupRepository: GroupRepository, private val
logger.info("Slug '$slug' generated from group '${props.name}'")

// Build the group and save it
val group = Group(id, props.name, slug, owner, members.toMutableSet())
val group = Group(id, props.name, slug, owner, members.toMutableSet(), mutableSetOf())
return groupRepository.save(group)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@ package fr.polyflix.user.infrastructure.configuration

import fr.polyflix.user.domain.messaging.producer.UserProducer
import fr.polyflix.user.domain.persistence.repository.GroupRepository
import fr.polyflix.user.domain.persistence.repository.GroupRequestRepository
import fr.polyflix.user.domain.persistence.repository.RoleRepository
import fr.polyflix.user.domain.persistence.repository.UserRepository
import fr.polyflix.user.domain.service.GroupRequestService
import fr.polyflix.user.domain.service.GroupService
import fr.polyflix.user.domain.service.UserService
import fr.polyflix.user.domain.service.impl.GroupRequestServiceImpl
import fr.polyflix.user.domain.service.impl.GroupServiceImpl
import fr.polyflix.user.domain.service.impl.UserServiceImpl
import org.springframework.context.annotation.Bean
Expand All @@ -15,12 +18,21 @@ import org.springframework.context.annotation.Configuration
class BeanConfiguration {

@Bean
fun userService(userRepository: UserRepository, roleRepository: RoleRepository, userProducer: UserProducer) : UserService {
fun userService(
userRepository: UserRepository,
roleRepository: RoleRepository,
userProducer: UserProducer
): UserService {
return UserServiceImpl(userRepository, roleRepository, userProducer)
}

@Bean
fun groupService(userRepository: UserRepository, groupRepository: GroupRepository): GroupService {
return GroupServiceImpl(groupRepository, userRepository)
}

@Bean
fun groupRequestService(groupRequestRepository: GroupRequestRepository): GroupRequestService {
return GroupRequestServiceImpl(groupRequestRepository)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package fr.polyflix.user.infrastructure.persistence.postgres

import fr.polyflix.user.infrastructure.persistence.postgres.entity.GroupRequestEntity
import org.springframework.data.jpa.repository.JpaRepository
import java.util.*

interface SpringGroupRequestRepository : JpaRepository<GroupRequestEntity, UUID>
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,12 @@ class GroupEntity(
inverseJoinColumns = [JoinColumn(name = "user_id", referencedColumnName = "id")]
)
val members: Set<UserEntity>,

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "groups_requests",
joinColumns = [JoinColumn(name = "group_id", referencedColumnName = "id")],
inverseJoinColumns = [JoinColumn(name = "request_id", referencedColumnName = "id")]
)
val groupRequests: Set<GroupRequestEntity>,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package fr.polyflix.user.infrastructure.persistence.postgres.entity

import org.springframework.data.annotation.CreatedDate
import java.time.LocalDateTime
import java.util.*
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.Id
import javax.persistence.Table

@Entity
@Table(name = "groups_requests")
class GroupRequestEntity(
@Id val id: UUID,

@Column
val reason: String,

@CreatedDate
@Column(name = "created_date", nullable = false, updatable = false)
var createdDate: LocalDateTime
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,18 @@ import fr.polyflix.user.infrastructure.persistence.postgres.entity.GroupEntity
import org.springframework.stereotype.Component

@Component
class GroupEntityMapper(private val userMapper: UserEntityMapper): PersistenceMapper<Group, GroupEntity> {
class GroupEntityMapper(
private val userMapper: UserEntityMapper,
private val groupRequestMapper: GroupRequestEntityMapper
) : PersistenceMapper<Group, GroupEntity> {
override fun toDomain(entity: GroupEntity): Group {
return Group(
entity.id,
entity.name,
entity.slug,
userMapper.toDomain(entity.owner),
entity.members.map { userMapper.toDomain(it) }.toMutableSet()
entity.members.map { userMapper.toDomain(it) }.toMutableSet(),
entity.groupRequests.map { groupRequestMapper.toDomain(it) }.toMutableSet()
)
}

Expand All @@ -22,7 +26,8 @@ class GroupEntityMapper(private val userMapper: UserEntityMapper): PersistenceMa
domain.name,
domain.slug,
userMapper.toEntity(domain.owner),
domain.members.map { userMapper.toEntity(it) }.toSet()
domain.members.map { userMapper.toEntity(it) }.toSet(),
domain.groupRequests.map { groupRequestMapper.toEntity(it) }.toSet()
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package fr.polyflix.user.infrastructure.persistence.postgres.mapper

import fr.polyflix.user.domain.entity.GroupRequest
import fr.polyflix.user.infrastructure.persistence.postgres.entity.GroupRequestEntity
import org.springframework.stereotype.Component

@Component
class GroupRequestEntityMapper : PersistenceMapper<GroupRequest, GroupRequestEntity> {
override fun toDomain(entity: GroupRequestEntity): GroupRequest {
return GroupRequest(entity.id, entity.reason, entity.createdDate)
}

override fun toEntity(domain: GroupRequest): GroupRequestEntity {
return GroupRequestEntity(domain.id, domain.reason, domain.createdDate)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import fr.polyflix.user.infrastructure.persistence.postgres.SpringGroupRepositor
import fr.polyflix.user.infrastructure.persistence.postgres.SpringRoleRepository
import fr.polyflix.user.infrastructure.persistence.postgres.SpringUserRepository
import fr.polyflix.user.infrastructure.persistence.postgres.entity.GroupEntity
import fr.polyflix.user.infrastructure.persistence.postgres.entity.GroupRequestEntity
import fr.polyflix.user.infrastructure.persistence.postgres.entity.RoleEntity
import fr.polyflix.user.infrastructure.persistence.postgres.entity.UserEntity
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.CommandLineRunner
import org.springframework.stereotype.Component
import java.time.LocalDateTime
import java.util.*

@Component
Expand Down Expand Up @@ -66,6 +68,18 @@ class UserSeeder(
)
)

val groupRequestDO3 = GroupRequestEntity(
UUID.fromString("77695670-a8ea-49ec-9c8c-4c9bc26fdf3c"),
"I want to join this group because I am in DO3",
LocalDateTime.now()
)

val groupRequestDO4 = GroupRequestEntity(
UUID.fromString("8b9b0aa1-22de-48bb-ae00-622ff007647d"),
"I want to join this group because I am in DO4",
LocalDateTime.now()
)

val userSeeds = listOf(memberUser, contributorUser, administratorUser)

val groupSeeds = listOf(
Expand All @@ -74,14 +88,16 @@ class UserSeeder(
"DO4",
"do4",
administratorUser,
setOf(memberUser, contributorUser, administratorUser)
setOf(memberUser, contributorUser, administratorUser),
setOf(groupRequestDO4)
),
GroupEntity(
UUID.fromString("ce3848ce-742f-4467-ab9d-3c5889cf282f"),
"DO3",
"do3",
contributorUser,
setOf(memberUser)
setOf(memberUser),
setOf(groupRequestDO3)
)
)

Expand Down