From 0e296cf4e73eafa4d6e488697e87101234b11d08 Mon Sep 17 00:00:00 2001 From: Taufik Pragusga <taufik@pragusga.com> Date: Mon, 14 Feb 2022 17:41:54 +0700 Subject: [PATCH] feat: create course page --- .../controller/CourseController.java | 39 ++++++++++++++++++ .../ui/cs/adprog/tutorial0/model/Course.java | 12 ++++++ .../repository/CourseRepository.java | 22 ++++++++++ .../tutorial0/service/CourseService.java | 11 +++++ .../tutorial0/service/CourseServiceImpl.java | 41 +++++++++++++++++++ src/main/resources/templates/courseList.html | 39 ++++++++++++++++++ .../resources/templates/createCourse.html | 41 +++++++++++++++++++ 7 files changed, 205 insertions(+) create mode 100644 src/main/java/id/ac/ui/cs/adprog/tutorial0/controller/CourseController.java create mode 100644 src/main/java/id/ac/ui/cs/adprog/tutorial0/model/Course.java create mode 100644 src/main/java/id/ac/ui/cs/adprog/tutorial0/repository/CourseRepository.java create mode 100644 src/main/java/id/ac/ui/cs/adprog/tutorial0/service/CourseService.java create mode 100644 src/main/java/id/ac/ui/cs/adprog/tutorial0/service/CourseServiceImpl.java create mode 100644 src/main/resources/templates/courseList.html create mode 100644 src/main/resources/templates/createCourse.html diff --git a/src/main/java/id/ac/ui/cs/adprog/tutorial0/controller/CourseController.java b/src/main/java/id/ac/ui/cs/adprog/tutorial0/controller/CourseController.java new file mode 100644 index 0000000..fe28a87 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/adprog/tutorial0/controller/CourseController.java @@ -0,0 +1,39 @@ +package id.ac.ui.cs.adprog.tutorial0.controller; + +import id.ac.ui.cs.adprog.tutorial0.model.Course; +import id.ac.ui.cs.adprog.tutorial0.service.CourseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +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/adprog/tutorial0/model/Course.java b/src/main/java/id/ac/ui/cs/adprog/tutorial0/model/Course.java new file mode 100644 index 0000000..52a959f --- /dev/null +++ b/src/main/java/id/ac/ui/cs/adprog/tutorial0/model/Course.java @@ -0,0 +1,12 @@ +package id.ac.ui.cs.adprog.tutorial0.model; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Course { + private String id; + private String name; + private Boolean vacancyStatus = false; +} diff --git a/src/main/java/id/ac/ui/cs/adprog/tutorial0/repository/CourseRepository.java b/src/main/java/id/ac/ui/cs/adprog/tutorial0/repository/CourseRepository.java new file mode 100644 index 0000000..0c395bf --- /dev/null +++ b/src/main/java/id/ac/ui/cs/adprog/tutorial0/repository/CourseRepository.java @@ -0,0 +1,22 @@ +package id.ac.ui.cs.adprog.tutorial0.repository; + +import org.springframework.stereotype.Repository; +import id.ac.ui.cs.adprog.tutorial0.model.Course; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +@Repository +public class CourseRepository { + private List<Course> coursesInMemory = new ArrayList<Course>(); + + 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/adprog/tutorial0/service/CourseService.java b/src/main/java/id/ac/ui/cs/adprog/tutorial0/service/CourseService.java new file mode 100644 index 0000000..70d8712 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/adprog/tutorial0/service/CourseService.java @@ -0,0 +1,11 @@ +package id.ac.ui.cs.adprog.tutorial0.service; + +import java.util.List; + +import id.ac.ui.cs.adprog.tutorial0.model.Course; + +public interface CourseService { + public Course create(Course course); + + public List<Course> findAll(); +} diff --git a/src/main/java/id/ac/ui/cs/adprog/tutorial0/service/CourseServiceImpl.java b/src/main/java/id/ac/ui/cs/adprog/tutorial0/service/CourseServiceImpl.java new file mode 100644 index 0000000..c1c807b --- /dev/null +++ b/src/main/java/id/ac/ui/cs/adprog/tutorial0/service/CourseServiceImpl.java @@ -0,0 +1,41 @@ +package id.ac.ui.cs.adprog.tutorial0.service; + +import id.ac.ui.cs.adprog.tutorial0.model.Course; +import id.ac.ui.cs.adprog.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) { + generateId(course); + courseRepository.create(course); + return course; + } + + private void generateId(Course course) { + StringBuilder stringBuilder = new StringBuilder(); + for (char letter : course.getName().toCharArray()) { + stringBuilder.append(String.valueOf((int) letter)); + } + String id = stringBuilder.toString(); + course.setId(id); + } + + @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/resources/templates/courseList.html b/src/main/resources/templates/courseList.html new file mode 100644 index 0000000..66b83b8 --- /dev/null +++ b/src/main/resources/templates/courseList.html @@ -0,0 +1,39 @@ +<!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">CourseId</th> + <th scope="col">Name</th> + <th scope="col">Vacancy Status</th> + </tr> + </thead> + <tbody th:each="course: ${courses}"> + <tr> + <td th:text="${course.id}"></td> + <td th:text="${course.name}"></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> diff --git a/src/main/resources/templates/createCourse.html b/src/main/resources/templates/createCourse.html new file mode 100644 index 0000000..989e243 --- /dev/null +++ b/src/main/resources/templates/createCourse.html @@ -0,0 +1,41 @@ +<!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="*{name}" type="text" class="form-control" id="nameInput" aria-describedby="nameHelp" + placeholder="Enter course' name"> + </div> + <div class="form-group"> + <p>Status Vacancy</p> + <label for="radio1"> + True + </label> + <input th:field="*{vacancyStatus}" th:value="${true}" type="radio" id="radio1"> + <label for="radio2"> + False + </label> + <input th:field="*{vacancyStatus}" th:value="${false}" type="radio" id="radio2"> + </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> -- GitLab