package com.tourguide.api.guide; import com.tourguide.common.api.ApiResponse; import com.tourguide.modules.operation.dto.CityResponse; import com.tourguide.modules.operation.service.OperationCityService; import com.tourguide.modules.user.dto.GuideRegistrationDocumentResponse; import com.tourguide.modules.user.dto.GuideRegistrationResponse; import com.tourguide.modules.user.dto.GuideRegistrationSmsRequest; import com.tourguide.modules.user.dto.GuideRegistrationSubmitRequest; import com.tourguide.modules.user.dto.GuideRegistrationTeamOptionResponse; import com.tourguide.modules.user.dto.GuideRegistrationTokenResponse; import com.tourguide.modules.user.dto.GuideRegistrationVerifyRequest; import com.tourguide.modules.user.dto.SmsCodeResponse; import com.tourguide.modules.user.service.GuideRegistrationDocumentStorageService; import com.tourguide.modules.user.service.GuideRegistrationService; import com.tourguide.modules.user.service.GuideTeamService; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.validation.Valid; import java.util.List; @RestController @RequestMapping("/api/guide/registration") public class GuideRegistrationController { private final GuideRegistrationService registrationService; private final GuideRegistrationDocumentStorageService documentStorageService; private final OperationCityService cityService; private final GuideTeamService teamService; public GuideRegistrationController(GuideRegistrationService registrationService, GuideRegistrationDocumentStorageService documentStorageService, OperationCityService cityService, GuideTeamService teamService) { this.registrationService = registrationService; this.documentStorageService = documentStorageService; this.cityService = cityService; this.teamService = teamService; } @PostMapping("/sms-code") public ApiResponse sendSmsCode(@Valid @RequestBody GuideRegistrationSmsRequest request) { return ApiResponse.success(registrationService.sendCode(request.getPhone())); } @PostMapping("/verify-phone") public ApiResponse verifyPhone( @Valid @RequestBody GuideRegistrationVerifyRequest request) { return ApiResponse.success(registrationService.verifyPhone(request.getPhone(), request.getCode())); } @GetMapping("/cities") public ApiResponse> cities() { return ApiResponse.success(cityService.enabledOptions()); } @GetMapping("/teams") public ApiResponse> teams() { return ApiResponse.success(teamService.registrationOptions()); } @PostMapping(value = "/documents", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ApiResponse uploadDocument( @RequestHeader("X-Registration-Token") String registrationToken, @RequestPart("file") MultipartFile file) { registrationService.requireVerifiedPhone(registrationToken); return ApiResponse.success(new GuideRegistrationDocumentResponse(documentStorageService.store(file))); } @PostMapping("/applications") public ApiResponse submit( @RequestHeader("X-Registration-Token") String registrationToken, @Valid @RequestBody GuideRegistrationSubmitRequest request) { return ApiResponse.success(registrationService.submit(registrationToken, request)); } }