Files
backend/src/main/java/com/yundage/chat/controller/AuthController.java

155 lines
7.3 KiB
Java
Raw Normal View History

2025-07-18 17:58:07 +08:00
package com.yundage.chat.controller;
import com.yundage.chat.common.ApiResponse;
import com.yundage.chat.common.ErrorCode;
2025-07-18 17:58:07 +08:00
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;
2025-07-18 17:58:07 +08:00
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 = "用户认证相关接口")
2025-07-18 17:58:07 +08:00
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<String, String> 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());
}
}
2025-07-18 17:58:07 +08:00
@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<AuthResponse> register(@Valid @RequestBody RegisterRequest request) {
2025-07-18 17:58:07 +08:00
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);
}
2025-07-18 17:58:07 +08:00
} catch (Exception e) {
return ApiResponse.error(ErrorCode.REGISTER_FAILED, "注册失败");
2025-07-18 17:58:07 +08:00
}
}
@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<AuthResponse> login(@Valid @RequestBody LoginRequest request) {
2025-07-18 17:58:07 +08:00
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);
}
2025-07-18 17:58:07 +08:00
} catch (Exception e) {
return ApiResponse.error(ErrorCode.LOGIN_FAILED, "登录失败");
2025-07-18 17:58:07 +08:00
}
}
@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());
}
}
2025-07-18 17:58:07 +08:00
@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) {
2025-07-18 17:58:07 +08:00
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());
}
2025-07-18 17:58:07 +08:00
} catch (Exception e) {
return ApiResponse.error(ErrorCode.INTERNAL_ERROR, "邮件发送失败");
2025-07-18 17:58:07 +08:00
}
}
@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) {
2025-07-18 17:58:07 +08:00
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);
}
2025-07-18 17:58:07 +08:00
} catch (Exception e) {
return ApiResponse.error(ErrorCode.INTERNAL_ERROR, "密码重置失败");
2025-07-18 17:58:07 +08:00
}
}
}