Skip to content

Instantly share code, notes, and snippets.

@panki
Created November 21, 2022 18:54
Show Gist options
  • Save panki/559509c3e30eb5a571c8cf34ffbe2670 to your computer and use it in GitHub Desktop.
Save panki/559509c3e30eb5a571c8cf34ffbe2670 to your computer and use it in GitHub Desktop.
package com.nuvoair.web.rest
import com.nuvoair.common.security.*
import com.nuvoair.security.jwt.MagicTokenProvider
import com.nuvoair.service.NuvoairUserService
import com.nuvoair.service.OnboardService
import com.nuvoair.utils.UrlBuilder
import com.nuvoair.web.rest.viewmodel.OnboardCompleteRequest
import com.nuvoair.web.rest.viewmodel.ValidateTokenRequest
import com.nuvoair.web.rest.viewmodel.ValidateTokenResponse
import datadog.trace.api.Trace
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.responses.ApiResponse
import io.swagger.v3.oas.annotations.responses.ApiResponses
import io.swagger.v3.oas.annotations.security.SecurityRequirement
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Value
import org.springframework.http.MediaType
import org.springframework.http.ResponseEntity
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.*
import java.util.*
import javax.validation.Valid
@Validated
@RestController
@RequestMapping("/onboard")
class OnboardController(
private val usersService: NuvoairUserService,
private val onboardService: OnboardService,
private val magicTokenProvider: MagicTokenProvider,
private val urlBuilder: UrlBuilder,
) {
private val log = LoggerFactory.getLogger(javaClass)
@Value("\${jhipster.clientApp.name}")
private var applicationName: String? = null
@Trace
@GetMapping("url", produces = [MediaType.APPLICATION_JSON_VALUE])
@Operation(summary = "Returns user's onboard url", security = [SecurityRequirement(name = NuvoAirSecurityConstants.BEARER_KEY)])
@ApiResponses(
value = [
ApiResponse(responseCode = "200", description = "Onboard url")
]
)
fun getUrl(): ResponseEntity<String> {
val userId = UUID.fromString(getCurrentUserLogin())
val user = usersService.findOne(userId).get()
val onboardLink = onboardService.getOnboardLink(user)
return ResponseEntity.ok().body(
urlBuilder.buildOnboardUrl(onboardLink)
)
}
@Trace
@PostMapping("validate", produces = [MediaType.APPLICATION_JSON_VALUE])
@Operation(summary = "Validates token and returns its meta data", security = [])
@ApiResponses(
value = [
ApiResponse(responseCode = "200", description = "Onboarding token metadata")
]
)
fun validate(@Valid @RequestBody body: ValidateTokenRequest): ResponseEntity<ValidateTokenResponse> {
try {
val onboardLink = magicTokenProvider.fromJwt(body.onboardToken)
val user = usersService.findOne(onboardLink.userId).get()
if (!onboardService.validateOnboardLink(onboardLink, user)) {
throw Exception("Invalid onboard link")
}
return ResponseEntity.ok().body(
ValidateTokenResponse.success(
link = onboardLink,
isOnboardCompleted = user.isOnboardCompleted(),
email = user.email!!
)
)
} catch (e: Exception) {
log.error("Validation failed", e)
}
return ResponseEntity.ok().body(
ValidateTokenResponse.fail()
)
}
@Trace
@PostMapping("complete", produces = [MediaType.APPLICATION_JSON_VALUE])
@Operation(summary = "Completes onboard of a user", security = [SecurityRequirement(name = NuvoAirSecurityConstants.BEARER_KEY)])
@ApiResponses(
value = [
ApiResponse(responseCode = "200", description = "Onboard completed")
]
)
fun complete(@Valid @RequestBody body: OnboardCompleteRequest): ResponseEntity<Void> {
val userId = UUID.fromString(getCurrentUserLogin())
val user = usersService.findOne(userId).get()
val onboardLink = magicTokenProvider.fromJwt(body.onboardToken)
onboardService.completeOnboard(onboardLink, user, body.password, body.email)
return ResponseEntity.ok().build()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment