AuthenticationController.java

package mirante.api.security;

import mirante.api.account.Account;
import mirante.api.account.AccountDTO;
import mirante.api.account.AccountRepository;
import mirante.api.account.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

@RestController
public class AuthenticationController {

  @Autowired
  private AccountService accountService;

  private final AccountRepository repository;

  AuthenticationController(AccountRepository repository) {
    this.repository = repository;
  }

  @GetMapping("/auth/token")
  @ResponseStatus(HttpStatus.OK)
  String getToken(@RequestBody AccountDTO request) {

    Optional<String> token =
        accountService.login(request.registration, request.password);

    if (token.isPresent()) {
      return "{\"token\":\"" + token.orElseThrow() + "\"}";
    } else
      return "Failed to generate token";
  }

  @GetMapping("/auth")
  @ResponseStatus(HttpStatus.OK)
  void authHealth() {}

  @GetMapping("/auth/token/health")
  @ResponseStatus(HttpStatus.OK)
  void tokenHealth() {}

  @PostMapping("/auth")
  @ResponseStatus(HttpStatus.CREATED)
  Account newAccount(@RequestBody AccountDTO request) {

    Account newAccount = new Account(
        request.registration,
        request.name,
        request.email,
        request.password
    );

    System.out.println(newAccount);
    return repository.save(newAccount);
  }
}