Skip to content

Commit c9f0953

Browse files
radovanradicgvenzl
andauthored
Update JSON view example with call to save() (#300)
* Update JSON view example with call to save() * Update controller to actually use student view repo for create --------- Co-authored-by: Gerald Venzl <gerald.venzl@oracle.com>
1 parent d3dae95 commit c9f0953

File tree

5 files changed

+98
-20
lines changed

5 files changed

+98
-20
lines changed

java/micronaut-jsonview-demo-app/src/main/java/com/example/micronaut/Application.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ public static void main(String[] args) {
4848
@EventListener
4949
public void init(StartupEvent startupEvent) {
5050
// Clear the existing tables
51+
studentCourseRepository.deleteAll();
5152
courseRepository.deleteAll();
5253
studentRepository.deleteAll();
5354
teacherRepository.deleteAll();
54-
studentCourseRepository.deleteAll();
5555

5656
// Use relational operations to insert three new rows in the STUDENT table
5757
Student dennis = studentRepository.save(new Student("Denis", 8.5));

java/micronaut-jsonview-demo-app/src/main/java/com/example/micronaut/controller/StudentController.java

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@
77

88
package com.example.micronaut.controller;
99

10+
import java.util.List;
1011
import java.util.Optional;
1112

1213
import com.example.micronaut.dto.CreateStudentDto;
13-
import com.example.micronaut.entity.Student;
14-
import com.example.micronaut.entity.StudentCourse;
14+
import com.example.micronaut.entity.Course;
15+
import com.example.micronaut.entity.view.CourseView;
16+
import com.example.micronaut.entity.view.StudentScheduleView;
1517
import com.example.micronaut.entity.view.StudentView;
18+
import com.example.micronaut.entity.view.TeacherView;
1619
import com.example.micronaut.repository.CourseRepository;
17-
import com.example.micronaut.repository.StudentCourseRepository;
18-
import com.example.micronaut.repository.StudentRepository;
1920
import com.example.micronaut.repository.view.StudentViewRepository;
2021
import io.micronaut.core.annotation.NonNull;
2122
import io.micronaut.http.HttpStatus;
@@ -31,18 +32,14 @@
3132
public final class StudentController {
3233

3334
private final CourseRepository courseRepository;
34-
private final StudentRepository studentRepository;
35-
private final StudentCourseRepository studentCourseRepository;
3635
private final StudentViewRepository studentViewRepository;
3736

38-
public StudentController(CourseRepository courseRepository, StudentRepository studentRepository, StudentCourseRepository studentCourseRepository, StudentViewRepository studentViewRepository) { // <2>
37+
public StudentController(CourseRepository courseRepository, StudentViewRepository studentViewRepository) { // <2>
3938
this.courseRepository = courseRepository;
40-
this.studentRepository = studentRepository;
41-
this.studentCourseRepository = studentCourseRepository;
4239
this.studentViewRepository = studentViewRepository;
4340
}
4441

45-
@Get("/") // <3>
42+
@Get // <3>
4643
public Iterable<StudentView> findAll() {
4744
return studentViewRepository.findAll();
4845
}
@@ -75,15 +72,16 @@ public Optional<StudentView> updateStudent(Long id, @NonNull String student) {
7572
});
7673
}
7774

78-
@Post("/") // <8>
75+
@Post// <8>
7976
@Status(HttpStatus.CREATED)
80-
public Optional<StudentView> create(@NonNull @Body CreateStudentDto createDto) {
81-
// Use a relational operation to insert a new row in the STUDENT table
82-
Student student = studentRepository.save(new Student(createDto.student(), createDto.averageGrade()));
83-
// For each of the courses in createDto parameter, insert a row in the STUDENT_COURSE table
84-
courseRepository.findByNameIn(createDto.courses()).stream()
85-
.forEach(course -> studentCourseRepository.save(new StudentCourse(student, course)));
86-
return studentViewRepository.findByStudent(student.name());
77+
public StudentView create(@NonNull @Body CreateStudentDto createDto) {
78+
// Must initialize data for student view by given courses
79+
List<Course> courses = courseRepository.findByNameIn(createDto.courses());
80+
List<StudentScheduleView> scheduleViews = courses.stream()
81+
.map(c -> new StudentScheduleView(null, new CourseView(c.id(), c.name(), new TeacherView(c.teacher().id(), c.teacher().name()), c.room(), c.time()))).toList();
82+
StudentView studentView = new StudentView(createDto.student(), createDto.averageGrade(),
83+
scheduleViews);
84+
return studentViewRepository.save(studentView);
8785
}
8886

8987
@Delete("/{id}") // <9>

java/micronaut-jsonview-demo-app/src/main/resources/application.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ datasources:
1111
test-resources:
1212
containers:
1313
oracle:
14-
image-name: gvenzl/oracle-free:latest-faststart
14+
image-name: gvenzl/oracle-free:latest
1515
startup-timeout: 360s
1616
db-name: test
1717
flyway:

java/micronaut-jsonview-demo-app/src/test/java/com/example/micronaut/ApplicationTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,19 @@
77

88
package com.example.micronaut;
99

10+
import com.example.micronaut.dto.CreateStudentDto;
11+
import com.example.micronaut.entity.view.StudentView;
1012
import com.example.micronaut.repository.view.StudentViewRepository;
1113
import io.micronaut.runtime.server.EmbeddedServer;
1214
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
1315
import org.junit.jupiter.api.Test;
1416

17+
import java.util.List;
18+
import java.util.Optional;
19+
20+
import static org.junit.jupiter.api.Assertions.assertEquals;
1521
import static org.junit.jupiter.api.Assertions.assertFalse;
22+
import static org.junit.jupiter.api.Assertions.assertNotNull;
1623
import static org.junit.jupiter.api.Assertions.assertTrue;
1724

1825
@MicronautTest
@@ -23,4 +30,30 @@ void testStartup(EmbeddedServer embeddedServer, StudentViewRepository viewReposi
2330
assertTrue(viewRepository.count() > 0);
2431
assertFalse(viewRepository.findAll().isEmpty());
2532
}
33+
34+
@Test
35+
void testCrud(StudentClient studentClient) {
36+
// initially created
37+
List<StudentView> studentViews = studentClient.findAll();
38+
assertFalse(studentViews.isEmpty());
39+
assertEquals(3, studentViews.size());
40+
41+
// Create new
42+
CreateStudentDto createStudentDto = new CreateStudentDto("Aniko", 8.5, List.of("Math", "English"));
43+
StudentView studentView = studentClient.save(createStudentDto);
44+
assertNotNull(studentView);
45+
assertEquals("Aniko", studentView.student());
46+
// Student has two courses
47+
assertEquals(2, studentView.schedule().size());
48+
49+
// Find by name
50+
Optional<StudentView> optStudentView = studentClient.findByStudent("Aniko");
51+
assertTrue(optStudentView.isPresent());
52+
studentView = optStudentView.get();
53+
assertEquals(8.5, studentView.averageGrade());
54+
55+
studentViews = studentClient.findAll();
56+
// There is one more now
57+
assertEquals(4, studentViews.size());
58+
}
2659
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.example.micronaut;
2+
3+
import com.example.micronaut.dto.CreateStudentDto;
4+
import com.example.micronaut.entity.view.StudentView;
5+
import io.micronaut.core.annotation.NonNull;
6+
import io.micronaut.http.HttpStatus;
7+
import io.micronaut.http.annotation.Body;
8+
import io.micronaut.http.annotation.Delete;
9+
import io.micronaut.http.annotation.Get;
10+
import io.micronaut.http.annotation.Post;
11+
import io.micronaut.http.annotation.Put;
12+
import io.micronaut.http.annotation.Status;
13+
import io.micronaut.http.client.annotation.Client;
14+
import jakarta.validation.Valid;
15+
16+
import java.util.List;
17+
import java.util.Optional;
18+
19+
@SuppressWarnings("unused")
20+
@Client("/students")
21+
interface StudentClient {
22+
23+
@Get
24+
List<StudentView> findAll();
25+
26+
@Get("/student/{student}")
27+
Optional<StudentView> findByStudent(String student);
28+
29+
@Get("/{id}")
30+
Optional<StudentView> findById(Long id);
31+
32+
@Put("/{id}/average_grade/{averageGrade}")
33+
Optional<StudentView> updateAverageGrade(Long id, @NonNull Double averageGrade);
34+
35+
@Put("/{id}/student/{student}")
36+
Optional<StudentView> updateStudent(Long id, @NonNull String student);
37+
38+
@Post
39+
StudentView save(@Valid @Body CreateStudentDto createStudentDto);
40+
41+
@Delete("/{id}")
42+
@Status(HttpStatus.NO_CONTENT)
43+
void delete(Long id);
44+
45+
@Get("/max_average_grade")
46+
Optional<Double> findMaxAverageGrade();
47+
}

0 commit comments

Comments
 (0)