Skip to content

Commit 1228c53

Browse files
author
Hattinger04
committed
fixing many bugs in rest services
1 parent 060a049 commit 1228c53

File tree

8 files changed

+206
-51
lines changed

8 files changed

+206
-51
lines changed

src/main/java/io/github/Hattinger04/course/CourseController.java

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.github.Hattinger04.course.model.course.Course;
2020
import io.github.Hattinger04.course.model.exercise.Exercise;
2121
import io.github.Hattinger04.course.model.student.Student;
22+
import io.github.Hattinger04.course.model.teacher.Teacher;
2223
import io.github.Hattinger04.user.model.User;
2324

2425
@RestController
@@ -33,18 +34,18 @@ public class CourseController {
3334

3435
/**
3536
* Get student by id in Course from database
36-
* Needs course object
37+
* Needs course and student object
3738
*
3839
* @param json
3940
* @return
4041
*/
4142
@PreAuthorize("hasAuthority('TEACHER')")
42-
@PostMapping("/getStudentByID")
43+
@PostMapping("/getStudent")
4344
@ResponseBody
44-
public ResponseEntity<?> getStudentByID(@RequestBody String json) {
45-
Object[] objects = restServices.deserializeMany(new Class[] {Course.class, Student.class}, json);
46-
Student student;
47-
if((student = courseService.getStudent((Course)objects[0], (Student)objects[1])) == null) {
45+
public ResponseEntity<?> getStudent(@RequestBody String json) {
46+
Student s = (Student) restServices.deserialize(Student.class, json);
47+
User student;
48+
if((student = courseService.getUserByStudent(s)) == null) {
4849
return new ResponseEntity<>("Student not exisiting!", HttpStatus.NOT_FOUND);
4950
}
5051
return new ResponseEntity<>(student, HttpStatus.OK);
@@ -68,9 +69,9 @@ public ResponseEntity<?> getAllStudents(@RequestBody String json) {
6869
}
6970
return new ResponseEntity<>(students, HttpStatus.OK);
7071
}
71-
72+
7273
/**
73-
* Get all students in Course from database
74+
* get teacher from course from database
7475
* Needs course object
7576
*
7677
* @param json
@@ -81,16 +82,16 @@ public ResponseEntity<?> getAllStudents(@RequestBody String json) {
8182
@ResponseBody
8283
public ResponseEntity<?> getCourseTeacher(@RequestBody String json) {
8384
Course course = (Course) restServices.deserialize(Course.class, json);
84-
User teacher;
85-
if((teacher = courseService.getCourseTeacher(course)) == null) {
86-
return new ResponseEntity<>("Teacher is not in course!", HttpStatus.NOT_FOUND);
85+
List<User> teachers;
86+
if((teachers = courseService.getCourseTeachers(course)) == null) {
87+
return new ResponseEntity<>("There is no teacher in this course - contact an admin!", HttpStatus.NOT_FOUND);
8788
}
88-
return new ResponseEntity<>(teacher, HttpStatus.OK);
89+
return new ResponseEntity<>(teachers, HttpStatus.OK);
8990
}
9091

9192
/**
9293
* Create a new Course
93-
* Needs course object
94+
* Needs course and teacher object
9495
*
9596
* @param json
9697
* @return
@@ -99,8 +100,16 @@ public ResponseEntity<?> getCourseTeacher(@RequestBody String json) {
99100
@PutMapping("/createCourse")
100101
@ResponseBody
101102
public ResponseEntity<?> createCourse(@RequestBody String json) {
102-
return courseService.createCourse((Course) restServices.deserialize(Course.class, json)) != null ?
103-
new ResponseEntity<>(HttpStatus.OK) : new ResponseEntity<>("Could not create course!", HttpStatus.NOT_IMPLEMENTED);
103+
Object[] objects;
104+
Course course;
105+
if((objects = restServices.deserializeMany(new Class[] {Course.class, Teacher.class}, json)) != null) {
106+
if((course = courseService.createCourse((Course) objects[0])) != null) {
107+
courseService.setCourseTeacher(course, (Teacher) objects[1]);
108+
return new ResponseEntity<>(HttpStatus.OK);
109+
}
110+
return new ResponseEntity<>("Could not create course!", HttpStatus.NOT_IMPLEMENTED);
111+
}
112+
return new ResponseEntity<>("Wrong JSON format!", HttpStatus.NOT_IMPLEMENTED);
104113
}
105114

106115
/**

src/main/java/io/github/Hattinger04/course/model/CourseService.java

Lines changed: 96 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.Hattinger04.course.model;
22

3+
import java.util.ArrayList;
34
import java.util.List;
45
import java.util.Set;
56

@@ -62,32 +63,93 @@ public Course getCourseByName(String name) {
6263
return courseRepository.findByName(name);
6364
}
6465

65-
public Student getStudent(Course course, Student student) {
66-
Student s = null;
66+
/**
67+
* Returns user by student
68+
*
69+
* @param student
70+
* @return
71+
*/
72+
public User getUserByStudent(Student student) {
73+
User user = getUserByStudentID(student);
74+
return user == null ? getUserByStudentUsername(student) : user;
75+
}
76+
77+
private User getUserByStudentID(Student student) {
6778
try {
68-
if ((s = studentRepository.findById(student.getId())) == null) { // TODO: if not tested!
69-
s = studentRepository.findByName(student.getUser().getUsername());
70-
}
71-
} catch (NullPointerException e) {
72-
return s;
79+
Student s = studentRepository.findByUserId(student.getUser().getId()).get(0);
80+
return new User(s.getUser().getId(), s.getUser().getUsername());
81+
} catch (NullPointerException | IndexOutOfBoundsException e) {
82+
return null;
83+
}
84+
}
85+
86+
private User getUserByStudentUsername(Student student) {
87+
try {
88+
Student s = studentRepository.findByName(student.getUser().getUsername()).get(0);
89+
return new User(s.getUser().getId(), s.getUser().getUsername());
90+
} catch (NullPointerException | IndexOutOfBoundsException e) {
91+
return null;
7392
}
74-
return s;
7593
}
7694

7795
public List<User> getAllStudents(Course course) {
78-
return courseRepository.getAllStudents(course.getId());
96+
List<User> users = new ArrayList<>();
97+
for (String[] s : courseRepository.getAllStudents(course.getId())) {
98+
users.add(new User(Integer.valueOf(s[0]), s[1]));
99+
}
100+
return users;
79101
}
80102

81-
public User getCourseTeacher(Course course) {
82-
return courseRepository.getCourseTeacher(course.getId());
103+
public List<User> getCourseTeachers(Course course) {
104+
List<User> users = new ArrayList<>();
105+
for (String[] s : courseRepository.getCourseTeacher(course.getId())) {
106+
users.add(new User(Integer.valueOf(s[0]), s[1]));
107+
}
108+
return users;
109+
}
110+
111+
public User getUserByTeacher(Teacher teacher) {
112+
User user = getUserByTeacherID(teacher);
113+
return user == null ? getUserByTeacherUsername(teacher) : user;
114+
}
115+
116+
private User getUserByTeacherID(Teacher teacher) {
117+
try {
118+
Teacher t = teacherRepository.findByUserId(teacher.getUser().getId());
119+
return new User(t.getUser().getId(), t.getUser().getUsername());
120+
} catch (NullPointerException e) {
121+
return null;
122+
}
123+
}
124+
125+
private User getUserByTeacherUsername(Teacher teacher) {
126+
try {
127+
Teacher t = teacherRepository.findByName(teacher.getUser().getUsername());
128+
return new User(t.getUser().getId(), t.getUser().getUsername());
129+
} catch (NullPointerException e) {
130+
return null;
131+
}
83132
}
84133

85134
public boolean setCourseTeacher(Course course, Teacher teacher) {
86135
try {
87-
teacherRepository.save(teacher);
88-
courseRepository.addUserToCourse(teacher.getId(), course.getId());
136+
// check if course is exisiting
137+
if (courseRepository.doesCourseExist(course.getId()) == 0) {
138+
return false;
139+
}
140+
User user = getUserByStudent(new Student(teacher.getId(), teacher.getUser()));
141+
// check if user is already in course
142+
if(user != null && courseRepository.isUserInCourse(user.getId(), course.getId()) != 0) {
143+
return false;
144+
}
145+
// check if user is already student
146+
if (user != null && courseRepository.isUserStudent(user.getId(), course.getId()) != 0) {
147+
return false;
148+
}
149+
Teacher t = teacherRepository.save(teacher);
150+
courseRepository.addUserToCourse(t.getUser().getId(), course.getId());
89151
return true;
90-
} catch (IllegalArgumentException e) {
152+
} catch (IllegalArgumentException | NullPointerException e) {
91153
return false;
92154
}
93155
}
@@ -102,11 +164,24 @@ public boolean deleteCourseTeacher(Course course, Teacher teacher) {
102164
}
103165
}
104166

105-
// TODO: working with student / teacher table
106167
public boolean addStudentToCourse(Course course, Student student) {
107168
try {
108-
studentRepository.save(student);
109-
courseRepository.addUserToCourse(student.getUser().getId(), course.getId());
169+
// check if course is existing
170+
if (courseRepository.doesCourseExist(course.getId()) == 0) {
171+
return false;
172+
}
173+
// check if student is already in course
174+
User user = getUserByStudent(student);
175+
if(user != null && courseRepository.isUserInCourse(user.getId(), course.getId()) != 0) {
176+
return false;
177+
}
178+
// check if user is already teacher
179+
user = getUserByTeacher(new Teacher(student.getId(), student.getUser()));
180+
if (user != null && courseRepository.isUserTeacher(user.getId(), course.getId()) != 0) {
181+
return false;
182+
}
183+
Student s = studentRepository.save(student);
184+
courseRepository.addUserToCourse(s.getUser().getId(), course.getId());
110185
return true;
111186
} catch (IllegalArgumentException e) {
112187
return false;
@@ -167,9 +242,9 @@ public Exercise createExercise(Exercise exercise) {
167242
public boolean deleteExercise(Exercise exercise) {
168243
try {
169244
exerciseRepository.delete(exercise);
170-
return true;
245+
return true;
171246
} catch (IllegalArgumentException e) {
172-
return false;
247+
return false;
173248
}
174249
}
175250

@@ -195,9 +270,9 @@ public Solution createSolution(Solution solution) {
195270
public boolean deleteSolution(Solution solution) {
196271
try {
197272
solutionRepository.delete(solution);
198-
return true;
273+
return true;
199274
} catch (IllegalArgumentException e) {
200-
return false;
275+
return false;
201276
}
202277
}
203278

src/main/java/io/github/Hattinger04/course/model/course/CourseRepository.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,20 @@
1010
import org.springframework.data.repository.query.Param;
1111
import org.springframework.stereotype.Repository;
1212

13-
import io.github.Hattinger04.user.model.User;
14-
1513
@Repository
1614
public interface CourseRepository extends JpaRepository<Course, Long>{
1715
Course findById(int id);
1816
Course findByName(String name);
1917
// TODO: SQL not tested yet!
2018

21-
@Query(value = "SELECT user_id, username FROM USER u JOIN TEACHER t using(user_id) JOIN course c using(course_id, user_id) where c.course_id=:course_id", nativeQuery = true)
22-
User getCourseTeacher(int course_id);
19+
@Query(value = "SELECT user_id, username FROM USERS u JOIN TEACHER t using(user_id) JOIN user_course c using(user_id) where c.course_id=:course_id", nativeQuery = true)
20+
List<String[]> getCourseTeacher(int course_id);
21+
22+
@Query(value = "SELECT user_id, username FROM USERS u JOIN STUDENT s using(user_id) JOIN user_course c using(user_id) where c.course_id=:course_id", nativeQuery = true)
23+
List<String[]> getAllStudents(int course_id);
2324

24-
@Query(value = "SELECT user_id, username FROM USER u JOIN STUDENT s using(user_id) JOIN course c using(course_id, user_id) where c.course_id=:course_id", nativeQuery = true)
25-
List<User> getAllStudents(int course_id);
25+
@Query(value = "SELECT EXISTS(SELECT user_id FROM USERS u JOIN STUDENT s using(user_id) JOIN user_course c using(user_id) where user_id=:user_id and c.course_id=:course_id)", nativeQuery = true)
26+
public int isUserInCourse(@Param("user_id") int user_id, @Param("course_id") int course_id);
2627

2728
@Modifying
2829
@Query(value = "insert into user_course (user_id, course_id) values (:user_id,:course_id)", nativeQuery = true)
@@ -34,7 +35,7 @@ public interface CourseRepository extends JpaRepository<Course, Long>{
3435
@Transactional
3536
public void removeUserFromCourse(@Param("user_id") int user_id, @Param("course_id") int course_id);
3637

37-
@Query(value = "SELECT count(*) FROM STUDENT s JOIN USER u using(user_id) JOIN course c using(course_id, user_id) where c.course_id=:course_id", nativeQuery = true)
38+
@Query(value = "SELECT count(*) FROM STUDENT s JOIN USER u using(user_id) user_course c using(user_id) where c.course_id=:course_id", nativeQuery = true)
3839
public int countStudents(@Param("course_id") int course_id);
3940

4041
/**
@@ -44,10 +45,10 @@ public interface CourseRepository extends JpaRepository<Course, Long>{
4445
* @param course_id
4546
* @return
4647
*/
47-
@Query(value = "SELECT count(*) FROM STUDENT s JOIN USER u using(user_id) JOIN course c using(course_id, user_id) where c.course_id=:course_id and s.user_id=:user_id", nativeQuery = true)
48+
@Query(value = "SELECT EXISTS(SELECT student_id FROM STUDENT s JOIN USERS u using(user_id) JOIN user_course c using(user_id) where c.course_id=:course_id and s.user_id=:user_id)", nativeQuery = true)
4849
public int isUserStudent(@Param("user_id") int user_id, @Param("course_id") int course_id);
4950

50-
@Query(value = "SELECT count(*) FROM TEACHER t JOIN USER u using(user_id) JOIN course c using(course_id, user_id) where c.course_id=:course_id", nativeQuery = true)
51+
@Query(value = "SELECT count(*) FROM TEACHER t JOIN USERS u using(user_id) JOIN user_course c using(user_id) where c.course_id=:course_id", nativeQuery = true)
5152
public int countTeacher(@Param("course_id") int course_id);
5253

5354
/**
@@ -57,6 +58,15 @@ public interface CourseRepository extends JpaRepository<Course, Long>{
5758
* @param course_id
5859
* @return
5960
*/
60-
@Query(value = "SELECT count(*) FROM TEACHER t JOIN USER u using(user_id) JOIN course c using(course_id, user_id) where c.course_id=:course_id and t.user_id=:user_id", nativeQuery = true)
61+
@Query(value = "SELECT EXISTS(SELECT teacher_id FROM TEACHER t JOIN USERS u using(user_id) JOIN user_course c using(user_id) where c.course_id=:course_id and t.user_id=:user_id)", nativeQuery = true)
6162
public int isUserTeacher(@Param("user_id") int user_id, @Param("course_id") int course_id);
63+
64+
/**
65+
* If return value equals 0 => no course with this course_id exists
66+
*
67+
* @param course_id
68+
* @return
69+
*/
70+
@Query(value = "SELECT EXISTS(SELECT course_id FROM COURSE c where c.course_id=:course_id)", nativeQuery = true)
71+
public int doesCourseExist(@Param("course_id") int course_id);
6272
}
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package io.github.Hattinger04.course.model.student;
22

3+
import java.util.List;
4+
35
import org.springframework.data.jpa.repository.JpaRepository;
46
import org.springframework.data.jpa.repository.Query;
57
import org.springframework.data.repository.query.Param;
68

79
public interface StudentRepository extends JpaRepository<Student, Long>{
810
Student findById(int id);
9-
@Query(value = "SELECT * FROM STUDENT s JOIN user u USING (user_id) where u.user_id=:user_id", nativeQuery = true)
10-
Student findByUserId(@Param("user_id") int user_id);
11-
@Query(value = "SELECT * FROM STUDENT s JOIN user u USING (user_id) where u.username=:username", nativeQuery = true)
12-
Student findByName(@Param("username") String username);
11+
@Query(value = "SELECT * FROM STUDENT s JOIN USERS u USING (user_id) where u.user_id=:user_id", nativeQuery = true)
12+
List<Student> findByUserId(@Param("user_id") int user_id);
13+
@Query(value = "SELECT * FROM STUDENT s JOIN USERS u USING (user_id) where u.username=:username", nativeQuery = true)
14+
List<Student> findByName(@Param("username") String username);
1315
}

src/main/java/io/github/Hattinger04/course/model/teacher/Teacher.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
@JsonTypeName("teacher")
3232
public class Teacher {
3333

34+
public Teacher(User user) {
35+
this.user = user;
36+
}
37+
3438
@Id
3539
@GeneratedValue(strategy = GenerationType.IDENTITY)
3640
@Column(name = "teacher_id")
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package io.github.Hattinger04.course.model.teacher;
22

33
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.data.jpa.repository.Query;
5+
import org.springframework.data.repository.query.Param;
46

57
public interface TeacherRepository extends JpaRepository<Teacher, Long>{
6-
Teacher findById(int id);
8+
Teacher findById(int id); @Query(value = "SELECT * FROM TEACHER t JOIN USERS u USING (user_id) where u.user_id=:user_id", nativeQuery = true)
9+
Teacher findByUserId(@Param("user_id") int user_id);
10+
@Query(value = "SELECT * FROM TEACHER t JOIN USERS u USING (user_id) where u.username=:username", nativeQuery = true)
11+
Teacher findByName(@Param("username") String username);
12+
713
}

src/main/java/io/github/Hattinger04/user/model/User.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public User(int id) {
3838
public User(String username) {
3939
this.username = username;
4040
}
41+
public User(int id, String username) {
42+
this.id = id;
43+
this.username = username;
44+
}
45+
4146
@Id
4247
@GeneratedValue(strategy = GenerationType.IDENTITY)
4348
@Column(name = "user_id")

0 commit comments

Comments
 (0)