11package com .itasocialacademy .oitassist .participation .controller ;
22
3+ import com .itasocialacademy .oitassist .core .dao .dto .response .PageResponse ;
34import com .itasocialacademy .oitassist .participation .dao .dto .request .CreateApplicationRequest ;
5+ import com .itasocialacademy .oitassist .participation .dao .dto .request .EnrollmentRequestsFilter ;
46import com .itasocialacademy .oitassist .participation .dao .dto .request .RejectEnrollmentRequest ;
7+ import com .itasocialacademy .oitassist .participation .dao .dto .response .ApplicationListItemResponse ;
58import com .itasocialacademy .oitassist .participation .dao .dto .response .CreateApplicationResponse ;
69import com .itasocialacademy .oitassist .participation .dao .dto .response .ProcessApplicationResponse ;
710import com .itasocialacademy .oitassist .participation .service .interfaces .ApplicationService ;
1114import io .swagger .v3 .oas .annotations .responses .ApiResponse ;
1215import io .swagger .v3 .oas .annotations .responses .ApiResponses ;
1316import io .swagger .v3 .oas .annotations .tags .Tag ;
14- import jakarta .validation .Valid ;
1517import lombok .RequiredArgsConstructor ;
18+ import org .springdoc .core .annotations .ParameterObject ;
19+ import org .springframework .data .domain .Pageable ;
20+ import org .springframework .data .web .PageableDefault ;
1621import org .springframework .http .HttpStatus ;
1722import org .springframework .http .ResponseEntity ;
1823import org .springframework .security .access .prepost .PreAuthorize ;
2126
2227@ RestController
2328@ RequiredArgsConstructor
24- @ RequestMapping ("/api/v1/competitions/applications " )
29+ @ RequestMapping ("/api/v1" )
2530@ Tag (name = "Application Manager v1" , description = "Operations related to competition applications" )
2631public class ApplicationController {
2732 private final ApplicationService applicationService ;
@@ -51,11 +56,14 @@ public class ApplicationController {
5156 content = @ Content (mediaType = "application/json" , schema = @ Schema (implementation = ErrorResponse .class )))
5257 })
5358 @ PreAuthorize ("hasRole('USER')" )
54- @ PostMapping
59+ @ PostMapping ( "/competitions/{competitionId}/stages/{stageId}/applications" )
5560 public ResponseEntity <CreateApplicationResponse > apply (
56- @ Valid @ RequestBody CreateApplicationRequest createApplicationRequest ) {
61+ @ PathVariable Long competitionId ,
62+ @ PathVariable Long stageId ) {
63+ CreateApplicationRequest request = CreateApplicationRequest .builder ()
64+ .competitionId (competitionId ).stageId (stageId ).build ();
5765 return ResponseEntity .status (HttpStatus .CREATED )
58- .body ((CreateApplicationResponse ) applicationService .sendEnrollmentRequest (createApplicationRequest ));
66+ .body ((CreateApplicationResponse ) applicationService .sendEnrollmentRequest (request ));
5967 }
6068
6169 @ Operation (
@@ -74,7 +82,7 @@ public ResponseEntity<CreateApplicationResponse> apply(
7482 content = @ Content (mediaType = "application/json" , schema = @ Schema (implementation = ErrorResponse .class )))
7583 })
7684 @ PreAuthorize ("hasRole('ORG')" )
77- @ PostMapping ("/accept/ {id}" )
85+ @ PostMapping ("/enrollment/applications/ {id}/accept " )
7886 public ResponseEntity <ProcessApplicationResponse > acceptRequest (@ PathVariable Long id ) {
7987 return ResponseEntity .status (HttpStatus .CREATED )
8088 .body ((ProcessApplicationResponse ) applicationService .acceptRequest (id ));
@@ -95,7 +103,7 @@ public ResponseEntity<ProcessApplicationResponse> acceptRequest(@PathVariable Lo
95103 content = @ Content (mediaType = "application/json" , schema = @ Schema (implementation = ErrorResponse .class )))
96104 })
97105 @ PreAuthorize ("hasRole('ORG')" )
98- @ PatchMapping ("/reject/ {id}" )
106+ @ PatchMapping ("/enrollment/applications/ {id}/reject " )
99107 public ResponseEntity <ProcessApplicationResponse > rejectRequest (
100108 @ PathVariable Long id ,
101109 @ RequestBody RejectEnrollmentRequest rejectEnrollmentRequest ) {
@@ -111,7 +119,7 @@ public ResponseEntity<ProcessApplicationResponse> rejectRequest(
111119 content = @ Content (mediaType = "application/json" ,
112120 schema = @ Schema (implementation = ProcessApplicationResponse .class ))),
113121 @ ApiResponse (responseCode = "400" , description = """
114- User is unable to apply . Possible reasons:\s
122+ User is unable to cancel the request . Possible reasons:\s
115123 - The user is not the owner of the application.\s
116124 - The application request's status is not PENDING.""" ,
117125 content = @ Content (mediaType = "application/json" , schema = @ Schema (implementation = ErrorResponse .class ))),
@@ -121,9 +129,42 @@ public ResponseEntity<ProcessApplicationResponse> rejectRequest(
121129 content = @ Content (mediaType = "application/json" , schema = @ Schema (implementation = ErrorResponse .class )))
122130 })
123131 @ PreAuthorize ("hasRole('USER')" )
124- @ PatchMapping ("/cancel/ {id}" )
132+ @ PatchMapping ("/enrollment/applications/ {id}/cancel " )
125133 public ResponseEntity <ProcessApplicationResponse > cancelRequest (@ PathVariable Long id ) {
126134 return ResponseEntity .status (HttpStatus .OK )
127135 .body ((ProcessApplicationResponse ) applicationService .cancelRequest (id ));
128136 }
137+
138+ @ Operation (
139+ summary = "Get users' application requests" ,
140+ description = "Retrieves a paginated list of application requests "
141+ + "for a specific competition stage." )
142+ @ ApiResponses (value = {
143+ @ ApiResponse (responseCode = "200" , description = "Applications retrieved successfully" ,
144+ content = @ Content (mediaType = "application/json" ,
145+ schema = @ Schema (implementation = PageResponse .class ))),
146+ @ ApiResponse (responseCode = "400" , description = """
147+ The competition and stage info error. The reason: \s
148+ specified stage ID does not belong to the competition ID.""" ,
149+ content = @ Content (mediaType = "application/json" , schema = @ Schema (implementation = ErrorResponse .class ))),
150+ @ ApiResponse (responseCode = "403" , description = "Access denied (requires ORG role)" ,
151+ content = @ Content (mediaType = "application/json" , schema = @ Schema (implementation = ErrorResponse .class ))),
152+ @ ApiResponse (responseCode = "404" , description = """
153+ Resource missing. Possible reasons:\s
154+ - The requested competition does not exist.\s
155+ - The requested stage does not exist.""" ,
156+ content = @ Content (mediaType = "application/json" , schema = @ Schema (implementation = ErrorResponse .class )))
157+ })
158+ @ PreAuthorize ("hasRole('ORG')" )
159+ @ GetMapping ("/competitions/{competitionId}/stages/{stageId}/applications" )
160+ public ResponseEntity <PageResponse <ApplicationListItemResponse >> getRequests (
161+ @ PathVariable Long competitionId ,
162+ @ PathVariable Long stageId ,
163+ @ RequestParam (required = false ) String search ,
164+ @ ParameterObject @ PageableDefault (size = 20 , sort = "issuedAt" ) Pageable pageable ) {
165+ EnrollmentRequestsFilter request = EnrollmentRequestsFilter .builder ()
166+ .competitionId (competitionId ).stageId (stageId ).build ();
167+ return ResponseEntity .status (HttpStatus .OK )
168+ .body (PageResponse .from (applicationService .getEnrollmentRequests (request , search , pageable )));
169+ }
129170}
0 commit comments