Skip to content

Commit f02c6de

Browse files
authored
Merge pull request #5 from Anvarjon7/feat/lesson-strategy
Feat/lesson strategy
2 parents 4c199c4 + e677692 commit f02c6de

File tree

61 files changed

+1517
-63
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1517
-63
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.example.aiacademy.config;
2+
3+
import com.example.aiacademy.models.ERole;
4+
import com.example.aiacademy.models.Role;
5+
import com.example.aiacademy.repositories.RoleRepository;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.boot.CommandLineRunner;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
11+
@Configuration
12+
@RequiredArgsConstructor
13+
public class DataInitializer {
14+
15+
private final RoleRepository roleRepository;
16+
17+
@Bean
18+
CommandLineRunner initRoles() {
19+
return args -> {
20+
for (ERole roleEnum : ERole.values()) {
21+
roleRepository.findByName(roleEnum)
22+
.orElseGet(() -> {
23+
Role role = new Role();
24+
role.setName(roleEnum);
25+
return roleRepository.save(role);
26+
});
27+
}
28+
};
29+
}
30+
}

src/main/java/com/example/aiacademy/config/SecurityConfig.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,13 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
3434
.requestMatchers("/api/auth/**",
3535
"v3/api-docs/**",
3636
"/swagger-ui/**",
37-
"/swagger-ui.html").permitAll()
37+
"/swagger-ui.html",
38+
"/api/modules/*/lessons/**",
39+
"/api/modules/*/lessons/video/**",
40+
"/api/modules/*/lessons/pdf/**",
41+
"/api/modules/*/lessons/text/**",
42+
"/api/modules/*/lessons/quiz/**"
43+
).permitAll()
3844
.anyRequest().authenticated())
3945
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
4046
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.example.aiacademy.config;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
5+
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
6+
7+
@Configuration
8+
public class StaticResourceConfig implements WebMvcConfigurer {
9+
10+
@Override
11+
public void addResourceHandlers(ResourceHandlerRegistry registry) {
12+
registry.addResourceHandler("/files/**")
13+
.addResourceLocations("file:uploads/");
14+
}
15+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.example.aiacademy.controllers;
2+
3+
import com.example.aiacademy.services.LessonQueryService;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.http.ResponseEntity;
6+
import org.springframework.web.bind.annotation.GetMapping;
7+
import org.springframework.web.bind.annotation.PathVariable;
8+
import org.springframework.web.bind.annotation.RequestMapping;
9+
import org.springframework.web.bind.annotation.RestController;
10+
11+
@RestController
12+
@RequestMapping("/api/modules/{moduleId}/lessons")
13+
@RequiredArgsConstructor
14+
public class LessonQueryController {
15+
16+
private final LessonQueryService lessonQueryService;
17+
18+
@GetMapping
19+
public ResponseEntity<?> getLessons(@PathVariable Long moduleId) {
20+
return ResponseEntity.ok(
21+
lessonQueryService.getLessonsByModuleId(moduleId)
22+
);
23+
}
24+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.example.aiacademy.controllers;
2+
3+
import com.example.aiacademy.dto.ModuleRequest;
4+
import com.example.aiacademy.services.ModuleService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.http.ResponseEntity;
7+
import org.springframework.web.bind.annotation.*;
8+
9+
import java.security.Principal;
10+
11+
@RestController
12+
@RequestMapping("/api/courses/{courseId}/modules")
13+
@RequiredArgsConstructor
14+
public class ModuleController {
15+
16+
private final ModuleService moduleService;
17+
18+
@PostMapping
19+
public ResponseEntity<?> create(@PathVariable Long courseId,
20+
@RequestBody ModuleRequest request,
21+
Principal principal) {
22+
23+
return ResponseEntity.ok(
24+
moduleService.createModule(courseId, principal.getName(), request)
25+
);
26+
}
27+
28+
@GetMapping
29+
public ResponseEntity<?> getByCourse(@PathVariable Long courseId) {
30+
return ResponseEntity.ok(
31+
moduleService.getModulesByCourse(courseId)
32+
);
33+
}
34+
35+
@PutMapping("/{moduleId}")
36+
public ResponseEntity<?> update(@PathVariable Long moduleId,
37+
Principal principal,
38+
@RequestBody ModuleRequest request) {
39+
return ResponseEntity.ok(
40+
moduleService.update(moduleId, principal.getName(), request)
41+
);
42+
}
43+
44+
@DeleteMapping("/{moduleId}")
45+
public ResponseEntity<?> delete(@PathVariable Long moduleId,
46+
Principal principal) {
47+
moduleService.delete(moduleId, principal.getName());
48+
49+
return ResponseEntity.noContent().build();
50+
}
51+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.example.aiacademy.controllers;
2+
3+
import com.example.aiacademy.dto.PdfLessonRequest;
4+
import com.example.aiacademy.services.PdfLessonService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.http.MediaType;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.web.bind.annotation.*;
9+
import org.springframework.web.multipart.MultipartFile;
10+
11+
import java.security.Principal;
12+
13+
@RestController
14+
@RequestMapping("/api/modules/{moduleId}/lessons/pdf")
15+
@RequiredArgsConstructor
16+
public class PdfLessonController {
17+
18+
private final PdfLessonService pdfLessonService;
19+
20+
@PostMapping
21+
public ResponseEntity<?> create(@PathVariable Long moduleId,
22+
@RequestBody PdfLessonRequest request,
23+
Principal principal) {
24+
return ResponseEntity.ok(
25+
pdfLessonService.create(moduleId, principal.getName(), request)
26+
);
27+
}
28+
29+
@PostMapping(
30+
value = "/upload/{lessonId}",
31+
consumes = MediaType.MULTIPART_FORM_DATA_VALUE
32+
)
33+
public ResponseEntity<?> uploadPdf(@PathVariable Long lessonId,
34+
@RequestParam("file") MultipartFile file,
35+
Principal principal) {
36+
37+
if (file != null || !file.isEmpty()) {
38+
System.out.println("FILE" + file.getName());
39+
}else {
40+
System.out.println("File is null");
41+
}
42+
return ResponseEntity.ok(
43+
pdfLessonService.uploadPdf(lessonId, principal.getName(), file)
44+
);
45+
}
46+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.example.aiacademy.controllers;
2+
3+
import com.example.aiacademy.dto.QuizLessonRequest;
4+
import com.example.aiacademy.services.QuizLessonService;
5+
import io.swagger.v3.oas.annotations.parameters.RequestBody;
6+
import jakarta.validation.Valid;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.MediaType;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.web.bind.annotation.PathVariable;
11+
import org.springframework.web.bind.annotation.PostMapping;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
import java.security.Principal;
16+
17+
@RestController
18+
@RequestMapping("/api/modules/{moduleId}/lessons/quiz")
19+
@RequiredArgsConstructor
20+
public class QuizLessonController {
21+
22+
private final QuizLessonService quizLessonService;
23+
24+
@PostMapping(
25+
consumes = MediaType.APPLICATION_JSON_VALUE,
26+
produces = MediaType.APPLICATION_JSON_VALUE
27+
)
28+
public ResponseEntity<?> create( @PathVariable Long moduleId,
29+
@RequestBody QuizLessonRequest request,
30+
Principal principal
31+
) {
32+
System.out.println("REQUEST = " + request);
33+
System.out.println("QUESTIONS = " + request.getQuestions());
34+
return ResponseEntity.ok(
35+
quizLessonService.create(moduleId, principal.getName(), request)
36+
);
37+
}
38+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.example.aiacademy.controllers;
2+
3+
import com.example.aiacademy.dto.TextLessonRequest;
4+
import com.example.aiacademy.services.TextLessonService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.http.ResponseEntity;
7+
import org.springframework.web.bind.annotation.*;
8+
9+
import java.security.Principal;
10+
11+
@RestController
12+
@RequestMapping("/api/modules/{moduleId}/lessons/text")
13+
@RequiredArgsConstructor
14+
public class TextLessonController {
15+
16+
private final TextLessonService textLessonService;
17+
18+
@PostMapping
19+
public ResponseEntity<?> create(@PathVariable Long moduleId,
20+
@RequestBody TextLessonRequest request,
21+
Principal principal) {
22+
return ResponseEntity.ok(
23+
textLessonService.create(moduleId, principal.getName(), request)
24+
);
25+
}
26+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.example.aiacademy.controllers;
2+
3+
import com.example.aiacademy.dto.VideoLessonRequest;
4+
import com.example.aiacademy.services.VideoLessonService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.http.MediaType;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.stereotype.Controller;
9+
import org.springframework.web.bind.annotation.*;
10+
import org.springframework.web.multipart.MultipartFile;
11+
12+
import java.security.Principal;
13+
14+
@RestController
15+
@RequestMapping("/api/modules/{moduleId}/lessons/video")
16+
@RequiredArgsConstructor
17+
public class VideoLessonController {
18+
19+
private final VideoLessonService videoLessonService;
20+
21+
@PostMapping
22+
public ResponseEntity<?> createLesson(
23+
Principal principal,
24+
@PathVariable Long moduleId,
25+
@RequestBody VideoLessonRequest request
26+
) {
27+
return ResponseEntity.ok(videoLessonService.createLesson(moduleId, principal.getName(), request));
28+
}
29+
30+
@PostMapping(
31+
value = "/upload/{lessonId}",
32+
consumes = MediaType.MULTIPART_FORM_DATA_VALUE
33+
)
34+
public ResponseEntity<?> uploadVideo(
35+
Principal principal,
36+
@PathVariable Long moduleId,
37+
// @PathVariable Long lessonId,
38+
@RequestParam("file") MultipartFile file
39+
)
40+
{
41+
if (file != null || !file.isEmpty()){
42+
System.out.println("file " + file.getName());
43+
}
44+
return ResponseEntity.ok(videoLessonService.uploadVideo(moduleId, principal.getName(), file));
45+
}
46+
}

src/main/java/com/example/aiacademy/dto/CourseResponse.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example.aiacademy.dto;
22

3+
import com.example.aiacademy.models.Course;
34
import lombok.Builder;
45
import lombok.Getter;
56
import lombok.Setter;
@@ -15,4 +16,15 @@ public class CourseResponse {
1516
private String category;
1617
private String level;
1718
private String tutorEmail;
19+
20+
public static CourseResponse fromEntity(Course course){
21+
return CourseResponse.builder()
22+
.id(course.getId())
23+
.title(course.getTitle())
24+
.description(course.getDescription())
25+
.category(course.getCategory())
26+
.level(course.getLevel())
27+
.tutorEmail(course.getTutor().getFullname())
28+
.build();
29+
}
1830
}

0 commit comments

Comments
 (0)