liujie
2026-08-21 a7c8a8f6055e1a03414f2227d12ff2e87ec52d41
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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<SmsCodeResponse> sendSmsCode(@Valid @RequestBody GuideRegistrationSmsRequest request) {
        return ApiResponse.success(registrationService.sendCode(request.getPhone()));
    }
 
    @PostMapping("/verify-phone")
    public ApiResponse<GuideRegistrationTokenResponse> verifyPhone(
            @Valid @RequestBody GuideRegistrationVerifyRequest request) {
        return ApiResponse.success(registrationService.verifyPhone(request.getPhone(), request.getCode()));
    }
 
    @GetMapping("/cities")
    public ApiResponse<List<CityResponse>> cities() {
        return ApiResponse.success(cityService.enabledOptions());
    }
 
    @GetMapping("/teams")
    public ApiResponse<List<GuideRegistrationTeamOptionResponse>> teams() {
        return ApiResponse.success(teamService.registrationOptions());
    }
 
    @PostMapping(value = "/documents", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ApiResponse<GuideRegistrationDocumentResponse> 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<GuideRegistrationResponse> submit(
            @RequestHeader("X-Registration-Token") String registrationToken,
            @Valid @RequestBody GuideRegistrationSubmitRequest request) {
        return ApiResponse.success(registrationService.submit(registrationToken, request));
    }
}