ApiResponse

This commit is contained in:
Eneko Nieto
2021-01-20 22:16:03 +01:00
parent 58d8d431eb
commit 9715743ce8
4 changed files with 114 additions and 52 deletions

View File

@@ -0,0 +1,9 @@
package eu.fosil.okupamicoche.entities
import com.fasterxml.jackson.annotation.JsonInclude
@JsonInclude(JsonInclude.Include.NON_NULL)
class ApiResponse<T>(val success: Boolean, val data: T?, val error: Exception?) {
constructor(success: Boolean, data: T) : this(success, data, null)
constructor(success: Boolean, error: Exception) : this(success, null, error)
}

View File

@@ -0,0 +1,29 @@
package eu.fosil.okupamicoche.spring.controller
import eu.fosil.okupamicoche.entities.ApiResponse
import eu.fosil.okupamicoche.entities.UserIdNotFoundException
import org.springframework.security.core.context.SecurityContextHolder
import org.springframework.security.oauth2.jwt.Jwt
open class ApiRestController {
fun <T> response(function: () -> T): ApiResponse<T> {
return try {
val data = function()
ApiResponse(true, data)
} catch (e: Exception) {
ApiResponse(false, e)
}
}
/**
* Devuelve el id del usuario actual.
*/
fun getCurrentUserId(): String {
val authentication = SecurityContextHolder.getContext().authentication
if (authentication.principal is Jwt) {
val jwt = authentication.principal as Jwt
return jwt.claims["sub"].toString()
}
throw UserIdNotFoundException()
}
}

View File

@@ -1,15 +1,13 @@
package eu.fosil.okupamicoche.spring.controller
import eu.fosil.okupamicoche.entities.ApiResponse
import eu.fosil.okupamicoche.entities.TravelId
import eu.fosil.okupamicoche.entities.UserId
import eu.fosil.okupamicoche.entities.UserIdNotFoundException
import eu.fosil.okupamicoche.repositories.TravelRepository
import eu.fosil.okupamicoche.repositories.UserRepository
import eu.fosil.okupamicoche.spring.dto.TravelDto
import eu.fosil.okupamicoche.usecases.travel.*
import org.springframework.data.repository.findByIdOrNull
import org.springframework.security.core.context.SecurityContextHolder
import org.springframework.security.oauth2.jwt.Jwt
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.ModelAttribute
import org.springframework.web.bind.annotation.RequestMapping
@@ -22,76 +20,91 @@ import org.springframework.web.bind.annotation.RestController
class TravelRestController(
private val userRepository: UserRepository,
private val travelRepository: TravelRepository
) {
) : ApiRestController() {
@RequestMapping("/create")
fun createTravel(@ModelAttribute @Validated travel: TravelDto) {
CreateTravel(travelRepository).createTravel(travel.toTravel(userRepository))
fun createTravel(@ModelAttribute @Validated travel: TravelDto): ApiResponse<Unit> {
return response {
CreateTravel(travelRepository).createTravel(travel.toTravel(userRepository))
}
}
@RequestMapping("/get")
fun getTravel(@RequestParam @Validated travelId: TravelId): TravelDto? {
return travelRepository.findByIdOrNull(travelId)?.let { TravelDto(it) }
fun getTravel(@RequestParam @Validated travelId: TravelId): ApiResponse<TravelDto?> {
return response {
travelRepository.findByIdOrNull(travelId)?.let { TravelDto(it) }
}
}
@RequestMapping("/cancel")
fun cancelTravel(@RequestParam @Validated travelId: TravelId) {
CancelTravel(travelRepository).cancelTravel(travelId)
fun cancelTravel(@RequestParam @Validated travelId: TravelId): ApiResponse<Unit> {
return response {
CancelTravel(travelRepository).cancelTravel(travelId)
}
}
@RequestMapping("/delete")
fun deleteTravel(@RequestParam @Validated travelId: TravelId) {
DeleteTravel(travelRepository).deleteTravel(travelId)
fun deleteTravel(@RequestParam @Validated travelId: TravelId): ApiResponse<Unit> {
return response {
DeleteTravel(travelRepository).deleteTravel(travelId)
}
}
@RequestMapping("/edit")
fun editTravel(@RequestParam @Validated travel: TravelDto) {
EditTravel(travelRepository).editTravel(travel.toTravel(userRepository))
fun editTravel(@RequestParam @Validated travel: TravelDto): ApiResponse<Unit> {
return response {
EditTravel(travelRepository).editTravel(travel.toTravel(userRepository))
}
}
@RequestMapping("/list")
fun listTravels(): List<TravelDto> {
return ListTravels(travelRepository).listTravels().map { t -> TravelDto(t) }
fun listTravels(): ApiResponse<List<TravelDto>> {
return response {
ListTravels(travelRepository).listTravels().map { t -> TravelDto(t) }
}
}
@RequestMapping("/listusertravels")
fun listUserTravels(): List<TravelDto> {
val userId = getCurrentUserId()
return ListUserTravels(travelRepository).listUserTravels(userId).map { t -> TravelDto(t) }
fun listUserTravels(): ApiResponse<List<TravelDto>> {
return response {
val userId = getCurrentUserId()
ListUserTravels(travelRepository).listUserTravels(userId).map { t -> TravelDto(t) }
}
}
@RequestMapping("/join")
fun join(@RequestParam @Validated travelId: TravelId) {
val userId = getCurrentUserId()
AddTraveler(userRepository, travelRepository).addTraveler(travelId, userId)
fun join(@RequestParam @Validated travelId: TravelId): ApiResponse<Unit> {
return response {
val userId = getCurrentUserId()
AddTraveler(userRepository, travelRepository).addTraveler(travelId, userId)
}
}
@RequestMapping("/leave")
fun leave(@RequestParam @Validated travelId: TravelId) {
val userId = getCurrentUserId()
RemoveTraveler(userRepository, travelRepository).removeTraveler(travelId, userId)
fun leave(@RequestParam @Validated travelId: TravelId): ApiResponse<Unit> {
return response {
val userId = getCurrentUserId()
RemoveTraveler(userRepository, travelRepository).removeTraveler(travelId, userId)
}
}
@RequestMapping("/addtraveler")
fun addTraveler(@RequestParam @Validated travelId: TravelId, @RequestParam @Validated userId: UserId) {
AddTraveler(userRepository, travelRepository).addTraveler(travelId, userId)
fun addTraveler(
@RequestParam @Validated travelId: TravelId,
@RequestParam @Validated userId: UserId
): ApiResponse<Unit> {
return response {
AddTraveler(userRepository, travelRepository).addTraveler(travelId, userId)
}
}
@RequestMapping("/removetraveler")
fun removeTraveler(@RequestParam @Validated travelId: TravelId, @RequestParam @Validated userId: UserId) {
RemoveTraveler(userRepository, travelRepository).removeTraveler(travelId, userId)
}
/**
* Devuelve el id del usuario actual.
*/
private fun getCurrentUserId(): String {
val authentication = SecurityContextHolder.getContext().authentication
if (authentication.principal is Jwt) {
val jwt = authentication.principal as Jwt
return jwt.claims["sub"].toString()
fun removeTraveler(
@RequestParam @Validated travelId: TravelId,
@RequestParam @Validated userId: UserId
): ApiResponse<Unit> {
return response {
RemoveTraveler(userRepository, travelRepository).removeTraveler(travelId, userId)
}
throw UserIdNotFoundException()
}
}

View File

@@ -1,5 +1,6 @@
package eu.fosil.okupamicoche.spring.controller
import eu.fosil.okupamicoche.entities.ApiResponse
import eu.fosil.okupamicoche.entities.UserId
import eu.fosil.okupamicoche.repositories.UserRepository
import eu.fosil.okupamicoche.spring.dto.CreateUserDto
@@ -12,30 +13,40 @@ import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/user")
class UserRestController(private val userRepository: UserRepository) {
class UserRestController(private val userRepository: UserRepository) : ApiRestController() {
@RequestMapping("/create")
fun createUser(@RequestBody @Validated createUserDto: CreateUserDto) {
CreateUser(userRepository).createUser(createUserDto.toUser(userRepository))
fun createUser(@RequestBody @Validated createUserDto: CreateUserDto): ApiResponse<Unit> {
return response {
CreateUser(userRepository).createUser(createUserDto.toUser(userRepository))
}
}
@RequestMapping("/get")
fun getUser(@RequestBody @Validated userId: UserId): UserDto? {
return GetUser(userRepository).getUser(userId)?.let { UserDto(it) }
fun getUser(@RequestBody @Validated userId: UserId): ApiResponse<UserDto?> {
return response {
GetUser(userRepository).getUser(userId)?.let { UserDto(it) }
}
}
@RequestMapping("/delete")
fun deleteUser(@RequestBody @Validated userId: UserId) {
DeleteUser(userRepository).deleteUser(userId)
fun deleteUser(@RequestBody @Validated userId: UserId): ApiResponse<Unit> {
return response {
DeleteUser(userRepository).deleteUser(userId)
}
}
@RequestMapping("/edit")
fun editUser(@RequestBody @Validated userDto: UserDto) {
EditUser(userRepository).editUser(userDto.toUser(userRepository))
fun editUser(@RequestBody @Validated userDto: UserDto): ApiResponse<Unit> {
return response {
EditUser(userRepository).editUser(userDto.toUser(userRepository))
}
}
@RequestMapping("/list")
fun listUsers(): List<UserDto> {
return ListUsers(userRepository).listUsers().map { UserDto(it) }
fun listUsers(): ApiResponse<List<UserDto>> {
return response {
ListUsers(userRepository).listUsers().map { UserDto(it) }
}
}
}