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