AuthController.java

package com.hwhub.backend.presentation.rest.auth;

import com.hwhub.backend.application.service.AuthService;
import com.hwhub.backend.application.service.AuthService.RegisterInfo;
import com.hwhub.backend.domain.model.UserModel;
import com.hwhub.backend.presentation.rest.auth.dto.LoginRequest;
import com.hwhub.backend.presentation.rest.auth.dto.LoginResponse;
import com.hwhub.backend.presentation.rest.auth.dto.LoginUserDto;
import com.hwhub.backend.presentation.rest.auth.dto.RefreshRequest;
import com.hwhub.backend.presentation.rest.auth.dto.RefreshResponse;
import com.hwhub.backend.presentation.rest.auth.dto.RegisterRequest;
import com.hwhub.backend.presentation.rest.auth.dto.RegisterResponse;
import com.hwhub.backend.presentation.rest.auth.dto.ResendVerificationRequest;
import com.hwhub.backend.presentation.rest.auth.dto.VerifyEmailRequest;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/auth")
@RequiredArgsConstructor
public class AuthController {

  private final AuthService authService;

  @Operation(security = {})
  @PostMapping("/login")
  public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest request) {
    var info = authService.login(request);
    LoginResponse response =
        new LoginResponse(info.token(), info.refreshToken(), LoginUserDto.fromModel(info.user()));
    return ResponseEntity.ok(response);
  }

  @Operation(security = {})
  @PostMapping("/register")
  public ResponseEntity<RegisterResponse> register(@Valid @RequestBody RegisterRequest request) {

    UserModel model =
        UserModel.create(
            request.email(), request.password(), request.displayName(), request.locale());

    RegisterInfo info = authService.register(model);

    RegisterResponse response =
        new RegisterResponse(
            info.emailVerificationRequired(),
            info.token(),
            info.refreshToken(),
            LoginUserDto.fromModel(info.user()),
            info.verificationExpiresAt() == null ? null : info.verificationExpiresAt().toString());

    return ResponseEntity.ok(response);
  }

  @Operation(security = {})
  @PostMapping("/refresh")
  public ResponseEntity<RefreshResponse> refresh(@Valid @RequestBody RefreshRequest request) {
    var info = authService.refresh(request.refreshToken());
    return ResponseEntity.ok(new RefreshResponse(info.token(), info.refreshToken()));
  }

  @Operation(security = {})
  @PostMapping("/email-verification/verify")
  public ResponseEntity<Void> verifyEmail(@Valid @RequestBody VerifyEmailRequest request) {
    authService.verifyEmail(request.token());
    return ResponseEntity.noContent().build();
  }

  @Operation(security = {})
  @PostMapping("/email-verification/resend")
  public ResponseEntity<Void> resendVerification(
      @Valid @RequestBody ResendVerificationRequest request) {
    authService.resendVerification(request.email());
    return ResponseEntity.noContent().build();
  }
}