diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/CourseController.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/CourseController.java new file mode 100644 index 0000000000000000000000000000000000000000..dfd9d86ee3dd2261bcf64376637b560f3edddd4c --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/CourseController.java @@ -0,0 +1,40 @@ +package id.ac.ui.cs.advprog.tutorial0.controller; + +import id.ac.ui.cs.advprog.tutorial0.model.Course; +import id.ac.ui.cs.advprog.tutorial0.service.course.CourseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; + +@Controller +@RequestMapping("/course") +public class CourseController { + @Autowired + private CourseService service; + + @GetMapping("/list") + public String courseListPage(Model model) { + List<Course> allCourses = service.findAll(); + model.addAttribute("courses", allCourses); + return "courseList"; + } + + @GetMapping("/create") + public String createCoursePage(Model model) { + Course course = new Course(); + model.addAttribute("course", course); + return "createCourse"; + } + + @PostMapping("/create") + public String createCoursePost(@ModelAttribute Course course, Model model) { + service.create(course); + return "redirect:list"; + } +} diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/StudentController.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/StudentController.java index 1cf06575df766e412e82adfbd0f06e0e09b7d51b..9d4295bb2e87ebbddfa872bddd05c9de35bd0c1c 100644 --- a/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/StudentController.java +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/controller/StudentController.java @@ -2,7 +2,7 @@ package id.ac.ui.cs.advprog.tutorial0.controller; import id.ac.ui.cs.advprog.tutorial0.exception.DuplicateStudentNameException; import id.ac.ui.cs.advprog.tutorial0.model.Student; -import id.ac.ui.cs.advprog.tutorial0.service.StudentService; +import id.ac.ui.cs.advprog.tutorial0.service.student.StudentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/model/Course.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/model/Course.java new file mode 100644 index 0000000000000000000000000000000000000000..21d0aae7f4dd1d99103704eb945731b08611d97e --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/model/Course.java @@ -0,0 +1,11 @@ +package id.ac.ui.cs.advprog.tutorial0.model; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class Course { + private String courseId; + private String courseName; + private boolean vacancyStatus; +} diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/repository/CourseRepository.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/repository/CourseRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..05011c5f4eff7511502f1d34ce071107d778e8be --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/repository/CourseRepository.java @@ -0,0 +1,22 @@ +package id.ac.ui.cs.advprog.tutorial0.repository; + +import id.ac.ui.cs.advprog.tutorial0.model.Course; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +@Repository +public class CourseRepository { + private List<Course> coursesInMemory = new ArrayList<>(); + + public Course create(Course course) { + coursesInMemory.add(course); + return course; + } + + public Iterator<Course> findAll() { + return coursesInMemory.iterator(); + } +} diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseService.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseService.java new file mode 100644 index 0000000000000000000000000000000000000000..878627ffe6ee99b86317ce622baeb7309c37ba30 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseService.java @@ -0,0 +1,10 @@ +package id.ac.ui.cs.advprog.tutorial0.service.course; + +import id.ac.ui.cs.advprog.tutorial0.model.Course; + +import java.util.List; + +public interface CourseService { + public Course create(Course course); + public List<Course> findAll(); +} diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseServiceImpl.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..b40567a829b3cf324b2042f8388dedb9bd469c98 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/course/CourseServiceImpl.java @@ -0,0 +1,41 @@ +package id.ac.ui.cs.advprog.tutorial0.service.course; + +import id.ac.ui.cs.advprog.tutorial0.model.Course; +import id.ac.ui.cs.advprog.tutorial0.repository.CourseRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +@Service +public class CourseServiceImpl implements CourseService { + @Autowired + private CourseRepository courseRepository; + + @Override + public Course create(Course course) { + generateCourseId(course); + course.setVacancyStatus(true); + courseRepository.create((course)); + return course; + } + + private void generateCourseId(Course course) { + StringBuilder stringBuilder = new StringBuilder(); + for (char letter: course.getCourseName().toCharArray()) { + stringBuilder.append((int)letter); + } + String courseId = stringBuilder.toString(); + course.setCourseId(courseId); + } + + @Override + public List<Course> findAll() { + Iterator<Course> courseIterator = courseRepository.findAll(); + List<Course> allCourses = new ArrayList<>(); + courseIterator.forEachRemaining(allCourses::add); + return allCourses; + } +} diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentService.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentService.java similarity index 77% rename from src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentService.java rename to src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentService.java index e6d77e0d11ff3d379a93613d3bb2d784494bdde9..bfae24b7f6b54ab60e476d84e39fd40adcba9e78 100644 --- a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentService.java +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentService.java @@ -1,4 +1,4 @@ -package id.ac.ui.cs.advprog.tutorial0.service; +package id.ac.ui.cs.advprog.tutorial0.service.student; import id.ac.ui.cs.advprog.tutorial0.model.Student; diff --git a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentServiceImpl.java b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentServiceImpl.java similarity index 96% rename from src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentServiceImpl.java rename to src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentServiceImpl.java index 741d86e1e596d77ca975b269704881a720260c75..be1d653bc3fea2eb07953387e834aceb6d261896 100644 --- a/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/StudentServiceImpl.java +++ b/src/main/java/id/ac/ui/cs/advprog/tutorial0/service/student/StudentServiceImpl.java @@ -1,4 +1,4 @@ -package id.ac.ui.cs.advprog.tutorial0.service; +package id.ac.ui.cs.advprog.tutorial0.service.student; import id.ac.ui.cs.advprog.tutorial0.exception.DuplicateStudentNameException; import id.ac.ui.cs.advprog.tutorial0.model.Student; diff --git a/src/main/resources/templates/courseList.html b/src/main/resources/templates/courseList.html new file mode 100644 index 0000000000000000000000000000000000000000..79523fbc4bbe184eb7413d7267f7aa305980622b --- /dev/null +++ b/src/main/resources/templates/courseList.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://www.thymeleaf.org"> +<head> + <meta charset="UTF-8"> + <title>Course List</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> +</head> +<body> +<h2>Course' List</h2> +<a th:href="@{/course/create}" class="btn btn-primary btn-sm mb-3" >Create course</a> + +<table class="table"> + <thead> + <tr> + <th scope="col">Course Id</th> + <th scope="col">Course Name</th> + <th scope="col">Vacancy Status</th> + </tr> + </thead> + <tbody th:each="course: ${courses}"> + <tr> + <td th:text="${course.courseId}"></td> + <td th:text="${course.courseName}"></td> + <td th:text="${course.vacancyStatus}"></td> + </tr> + + </tbody> +</table> + +<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/templates/createCourse.html b/src/main/resources/templates/createCourse.html new file mode 100644 index 0000000000000000000000000000000000000000..1236fced4530cc928e99570e73deaec96cdd5b43 --- /dev/null +++ b/src/main/resources/templates/createCourse.html @@ -0,0 +1,20 @@ +<!DOCTYPE html> +<html lang="en" xmlns:th="http://www.thymeleaf.org"> +<head> + <meta charset="UTF-8"> + <title>Create new Course</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> +</head> +<body> +<h3>Create new Course</h3> +<form th:action="@{/course/create}" th:object="${course}" method="post"> + <div class="form-group"> + <label for="nameInput">Name</label> + <input th:field="*{courseName}" type="text" class="form-control" id="nameInput" aria-describedby="nameHelp" placeholder="Enter course' name"> +<!-- <small id="nameHelp" class="form-text text-muted">Please enter unique name.</small>--> + </div> + <button type="submit" class="btn btn-primary">Submit</button> +</form> +<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script> +</body> +</html> \ No newline at end of file