package com.yundage.chat.controller; import com.yundage.chat.common.ApiResponse; import com.yundage.chat.common.ErrorCode; import com.yundage.chat.dto.*; import com.yundage.chat.service.UserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/api/auth") @Tag(name = "认证管理", description = "用户认证相关接口") public class AuthController { @Autowired private UserService userService; @PostMapping("/send-code") @Operation(summary = "发送验证码", description = "向手机或邮箱发送验证码") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "验证码发送成功"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "验证码发送失败") }) public ApiResponse sendVerificationCode(@Valid @RequestBody VerificationCodeRequest request) { try { String code = userService.sendVerificationCode(request.getContact()); Map data = new HashMap<>(); data.put("message", "验证码已发送"); // 仅在开发模式下返回验证码 if (code != null) { data.put("code", code); } return ApiResponse.success("验证码发送成功", data); } catch (Exception e) { return ApiResponse.error(ErrorCode.VERIFICATION_CODE_SEND_FAILED, e.getMessage()); } } @PostMapping("/register") @Operation(summary = "用户注册", description = "注册新用户账号") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "注册成功"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "注册失败") }) public ApiResponse register(@Valid @RequestBody RegisterRequest request) { try { AuthResponse response = userService.register(request); return ApiResponse.success("注册成功", response); } catch (RuntimeException e) { String message = e.getMessage(); if (message.contains("邮箱已被注册")) { return ApiResponse.error(ErrorCode.EMAIL_ALREADY_REGISTERED, message); } else if (message.contains("手机号已被注册")) { return ApiResponse.error(ErrorCode.PHONE_ALREADY_REGISTERED, message); } else if (message.contains("验证码")) { return ApiResponse.error(ErrorCode.VERIFICATION_CODE_INVALID, message); } else { return ApiResponse.error(ErrorCode.REGISTER_FAILED, message); } } catch (Exception e) { return ApiResponse.error(ErrorCode.REGISTER_FAILED, "注册失败"); } } @PostMapping("/login") @Operation(summary = "用户登录", description = "使用验证码登录") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "登录成功"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "登录失败") }) public ApiResponse login(@Valid @RequestBody LoginRequest request) { try { AuthResponse response = userService.login(request); return ApiResponse.success("登录成功", response); } catch (RuntimeException e) { String message = e.getMessage(); if (message.contains("验证码无效") || message.contains("验证码已过期")) { return ApiResponse.error(ErrorCode.VERIFICATION_CODE_INVALID, message); } else if (message.contains("用户不存在")) { return ApiResponse.error(ErrorCode.USER_NOT_FOUND, message); } else { return ApiResponse.error(ErrorCode.LOGIN_FAILED, message); } } catch (Exception e) { return ApiResponse.error(ErrorCode.LOGIN_FAILED, "登录失败"); } } @PostMapping("/logout") @Operation(summary = "用户登出", description = "退出用户登录状态") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "登出成功"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "登出失败") }) public ApiResponse logout() { try { userService.logout(); return ApiResponse.success("登出成功"); } catch (Exception e) { return ApiResponse.error(ErrorCode.INTERNAL_ERROR, "登出失败: " + e.getMessage()); } } @PostMapping("/forgot-password") @Operation(summary = "忘记密码", description = "发送密码重置邮件") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "邮件发送成功"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "邮件发送失败") }) public ApiResponse forgotPassword(@Valid @RequestBody PasswordResetRequest request) { try { userService.requestPasswordReset(request); return ApiResponse.success("密码重置邮件已发送"); } catch (RuntimeException e) { if (e.getMessage().contains("用户不存在")) { return ApiResponse.error(ErrorCode.USER_NOT_FOUND, e.getMessage()); } else { return ApiResponse.error(ErrorCode.INTERNAL_ERROR, e.getMessage()); } } catch (Exception e) { return ApiResponse.error(ErrorCode.INTERNAL_ERROR, "邮件发送失败"); } } @PostMapping("/reset-password") @Operation(summary = "重置密码", description = "使用token重置密码") @ApiResponses(value = { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "密码重置成功"), @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "密码重置失败") }) public ApiResponse resetPassword(@Valid @RequestBody ResetPasswordRequest request) { try { userService.resetPassword(request); return ApiResponse.success("密码重置成功"); } catch (RuntimeException e) { String message = e.getMessage(); if (message.contains("重置令牌无效") || message.contains("已过期")) { return ApiResponse.error(ErrorCode.PASSWORD_RESET_TOKEN_INVALID, message); } else if (message.contains("用户不存在")) { return ApiResponse.error(ErrorCode.USER_NOT_FOUND, message); } else { return ApiResponse.error(ErrorCode.INTERNAL_ERROR, message); } } catch (Exception e) { return ApiResponse.error(ErrorCode.INTERNAL_ERROR, "密码重置失败"); } } }