package com.tourguide.api.guide; import com.tourguide.common.api.ApiResponse; import com.tourguide.modules.user.dto.GuideProfileUpdateRequest; import com.tourguide.modules.user.dto.GuideNewPhoneCodeRequest; import com.tourguide.modules.user.dto.GuidePhoneChangeRequest; import com.tourguide.modules.user.dto.GuidePhoneChangeTokenResponse; import com.tourguide.modules.user.dto.GuidePhoneCodeRequest; import com.tourguide.modules.user.dto.GuidePhoneVerifyRequest; import com.tourguide.modules.user.dto.GuideUserResponse; import com.tourguide.modules.user.dto.SmsCodeResponse; import com.tourguide.modules.user.service.GuidePhoneChangeService; import com.tourguide.modules.user.service.GuideUserService; import com.tourguide.modules.user.service.MiniAvatarStorageService; import com.tourguide.security.AppUserPrincipal; import org.springframework.http.MediaType; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.validation.Valid; /** * 导游端个人资料接口。 * 导游只能读取和修改本人允许维护的资料,账号状态及运营配置仍由管理后台控制。 */ @RestController @RequestMapping("/api/guide/profile") public class GuideProfileController { private final GuideUserService userService; private final MiniAvatarStorageService avatarStorageService; private final GuidePhoneChangeService phoneChangeService; public GuideProfileController(GuideUserService userService, MiniAvatarStorageService avatarStorageService, GuidePhoneChangeService phoneChangeService) { this.userService = userService; this.avatarStorageService = avatarStorageService; this.phoneChangeService = phoneChangeService; } /** * 查询当前已登录且处于启用状态的导游个人资料。 * * @param principal 安全过滤器解析出的当前导游身份 * @return 当前导游基础资料 */ @GetMapping public ApiResponse get(@AuthenticationPrincipal AppUserPrincipal principal) { return ApiResponse.success(GuideUserResponse.from(userService.findEnabledById(principal.getUserId()))); } /** * 更新当前导游本人可维护的个人资料,不允许通过该接口修改账号状态。 * * @param principal 安全过滤器解析出的当前导游身份 * @param request 导游个人资料更新参数 * @return 更新后的导游基础资料 */ @PutMapping public ApiResponse update(@AuthenticationPrincipal AppUserPrincipal principal, @Valid @RequestBody GuideProfileUpdateRequest request) { return ApiResponse.success(userService.updateProfile(principal.getUserId(), request)); } @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ApiResponse updateAvatar(@AuthenticationPrincipal AppUserPrincipal principal, @RequestPart("file") MultipartFile file) { String avatar = avatarStorageService.store(file); return ApiResponse.success(userService.updateAvatar(principal.getUserId(), avatar)); } @PostMapping("/phone-change/old-code") public ApiResponse sendOldPhoneCode(@AuthenticationPrincipal AppUserPrincipal principal, @Valid @RequestBody GuidePhoneCodeRequest request) { return ApiResponse.success(phoneChangeService.sendOldPhoneCode(principal.getUserId(), request.getPhone())); } @PostMapping("/phone-change/verify-old") public ApiResponse verifyOldPhone( @AuthenticationPrincipal AppUserPrincipal principal, @Valid @RequestBody GuidePhoneVerifyRequest request) { return ApiResponse.success(phoneChangeService.verifyOldPhone( principal.getUserId(), request.getPhone(), request.getCode())); } @PostMapping("/phone-change/new-code") public ApiResponse sendNewPhoneCode(@AuthenticationPrincipal AppUserPrincipal principal, @Valid @RequestBody GuideNewPhoneCodeRequest request) { return ApiResponse.success(phoneChangeService.sendNewPhoneCode( principal.getUserId(), request.getChangeToken(), request.getNewPhone())); } @PutMapping("/phone") public ApiResponse changePhone(@AuthenticationPrincipal AppUserPrincipal principal, @Valid @RequestBody GuidePhoneChangeRequest request) { return ApiResponse.success(phoneChangeService.changePhone( principal.getUserId(), request.getChangeToken(), request.getNewPhone(), request.getCode())); } }