package io.kaif.web.api; import javax.validation.Valid; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import io.kaif.model.account.AccountAccessToken; import io.kaif.model.clientapp.ClientApp; import io.kaif.service.ClientAppService; import io.kaif.web.support.SingleWrapper; @RestController @RequestMapping("/api/client-app") public class ClientAppResource { static class CreateClientApp { @Size(min = ClientApp.NAME_MIN, max = ClientApp.NAME_MAX) @NotNull public String name; @Size(min = ClientApp.DESCRIPTION_MIN, max = ClientApp.DESCRIPTION_MAX) @NotNull public String description; /** * do not use `@URL` to validate because it does not allow custom scheme other than http */ @Pattern(regexp = ClientApp.CALLBACK_URI_PATTERN) @NotNull public String callbackUri; } static class UpdateClientApp { @NotNull public String clientId; @Size(min = ClientApp.NAME_MIN, max = ClientApp.NAME_MAX) @NotNull public String name; @Size(min = ClientApp.DESCRIPTION_MIN, max = ClientApp.DESCRIPTION_MAX) @NotNull public String description; /** * do not use `@URL` to validate because it does not allow custom scheme other than http */ @Pattern(regexp = ClientApp.CALLBACK_URI_PATTERN) @NotNull public String callbackUri; } static class RevokeClientApp { @NotNull public String clientId; } static class GenerateDebugAccessToken { @NotNull public String clientId; } @Autowired private ClientAppService clientAppService; @RequestMapping(value = "/create", method = RequestMethod.PUT) public SingleWrapper<String> create(AccountAccessToken accountAccessToken, @RequestBody @Valid CreateClientApp create) { String clientId = clientAppService.create(accountAccessToken, create.name.trim(), create.description.trim(), create.callbackUri.trim()).getClientId(); return SingleWrapper.of(clientId); } @RequestMapping(value = "/update", method = RequestMethod.POST) public void update(AccountAccessToken accountAccessToken, @RequestBody @Valid UpdateClientApp update) { clientAppService.update(accountAccessToken, update.clientId, update.name.trim(), update.description.trim(), update.callbackUri.trim()); } @RequestMapping(value = "/revoke", method = RequestMethod.POST) public void revoke(AccountAccessToken accountAccessToken, @RequestBody @Valid RevokeClientApp revoke) { clientAppService.revokeApp(accountAccessToken, revoke.clientId); } @RequestMapping(value = "/generate-debug-access-token", method = RequestMethod.POST) public SingleWrapper<String> generateDebugAccessToken(AccountAccessToken accountAccessToken, @RequestBody @Valid GenerateDebugAccessToken generate) { return SingleWrapper.of(clientAppService.generateDebugAccessToken(accountAccessToken, generate.clientId)); } }