diff --git a/src/main/kotlin/eu/fosil/okupamicoche/entities/ApiResponse.kt b/src/main/kotlin/eu/fosil/okupamicoche/entities/ApiResponse.kt new file mode 100644 index 0000000..76579bc --- /dev/null +++ b/src/main/kotlin/eu/fosil/okupamicoche/entities/ApiResponse.kt @@ -0,0 +1,9 @@ +package eu.fosil.okupamicoche.entities + +import com.fasterxml.jackson.annotation.JsonInclude + +@JsonInclude(JsonInclude.Include.NON_NULL) +class ApiResponse(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) +} \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/ApiRestController.kt b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/ApiRestController.kt new file mode 100644 index 0000000..a848424 --- /dev/null +++ b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/ApiRestController.kt @@ -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 response(function: () -> T): ApiResponse { + 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() + } +} \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/TravelRestController.kt b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/TravelRestController.kt index 80cb3d2..0244385 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/TravelRestController.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/TravelRestController.kt @@ -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 { + 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 { + 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 { + 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 { + 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 { + return response { + EditTravel(travelRepository).editTravel(travel.toTravel(userRepository)) + } } @RequestMapping("/list") - fun listTravels(): List { - return ListTravels(travelRepository).listTravels().map { t -> TravelDto(t) } + fun listTravels(): ApiResponse> { + return response { + ListTravels(travelRepository).listTravels().map { t -> TravelDto(t) } + } } @RequestMapping("/listusertravels") - fun listUserTravels(): List { - val userId = getCurrentUserId() - return ListUserTravels(travelRepository).listUserTravels(userId).map { t -> TravelDto(t) } + fun listUserTravels(): ApiResponse> { + 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 { + 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 { + 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 { + 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 { + return response { + RemoveTraveler(userRepository, travelRepository).removeTraveler(travelId, userId) } - throw UserIdNotFoundException() } } \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/UserRestController.kt b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/UserRestController.kt index 3820cd7..e2535ff 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/UserRestController.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/UserRestController.kt @@ -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 { + 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 { + 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 { + 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 { + return response { + EditUser(userRepository).editUser(userDto.toUser(userRepository)) + } } @RequestMapping("/list") - fun listUsers(): List { - return ListUsers(userRepository).listUsers().map { UserDto(it) } + fun listUsers(): ApiResponse> { + return response { + ListUsers(userRepository).listUsers().map { UserDto(it) } + } } } \ No newline at end of file