From cbdd22d0b5d9a543d3deeca724f8d5889f201181 Mon Sep 17 00:00:00 2001
From: Hilmi Al Biruni <hilmi.albiruni@ui.ac.id>
Date: Thu, 22 Sep 2022 20:53:49 +0700
Subject: [PATCH] push tutorial 3

---
 README.md                                     | 34 +++++++
 belajarbelajar/build.gradle                   |  5 +
 .../controller/BaseController.java            | 12 +++
 .../controller/CourseController.java          | 97 ++++++++-----------
 .../controller/PengajarController.java        | 61 ++++++++++++
 .../belajarbelajar/model/CourseModel.java     | 97 ++++++++++---------
 .../belajarbelajar/model/PengajarModel.java   | 40 ++++++++
 .../model/PenyelenggaraModel.java             | 36 +++++++
 .../belajarbelajar/repository/CourseDb.java   | 22 +++++
 .../belajarbelajar/repository/PengajarDb.java | 15 +++
 .../repository/PenyelenggaraDb.java           |  9 ++
 .../belajarbelajar/service/CourseService.java | 14 +--
 .../service/CourseServiceImpl.java            | 55 +++++++----
 .../service/PengajarService.java              | 12 +++
 .../service/PengajarServiceImpl.java          | 47 +++++++++
 .../service/PenyelenggaraService.java         |  7 ++
 .../service/PenyelenggaraServiceImpl.java     | 20 ++++
 .../src/main/resources/application.properties | 15 +++
 .../main/resources/templates/add-course.html  | 22 +++--
 .../resources/templates/add-pengajar.html     | 20 ++++
 .../templates/berhasil-ditambahkan.html       | 14 ---
 .../resources/templates/delete-course.html    | 15 +--
 .../resources/templates/error-update.html     | 20 ++++
 .../resources/templates/form-add-course.html  | 47 +++++++++
 .../templates/form-add-pengajar.html          | 36 +++++++
 .../templates/form-update-course.html         | 49 ++++++++++
 .../templates/form-update-pengajar.html       | 44 +++++++++
 .../src/main/resources/templates/home.html    | 22 +++++
 .../templates/notifikasi-delete.html          | 14 ---
 .../templates/notifikasi-gagal-add.html       | 14 ---
 .../resources/templates/update-course.html    | 20 ++++
 .../resources/templates/update-pengajar.html  | 20 ++++
 .../main/resources/templates/view-course.html | 52 +++++++---
 .../resources/templates/viewall-course.html   | 48 ++++++---
 34 files changed, 841 insertions(+), 214 deletions(-)
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/BaseController.java
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/PengajarController.java
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PengajarModel.java
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PenyelenggaraModel.java
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/CourseDb.java
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/PengajarDb.java
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/PenyelenggaraDb.java
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarService.java
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarServiceImpl.java
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PenyelenggaraService.java
 create mode 100644 belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PenyelenggaraServiceImpl.java
 create mode 100644 belajarbelajar/src/main/resources/templates/add-pengajar.html
 delete mode 100644 belajarbelajar/src/main/resources/templates/berhasil-ditambahkan.html
 create mode 100644 belajarbelajar/src/main/resources/templates/error-update.html
 create mode 100644 belajarbelajar/src/main/resources/templates/form-add-course.html
 create mode 100644 belajarbelajar/src/main/resources/templates/form-add-pengajar.html
 create mode 100644 belajarbelajar/src/main/resources/templates/form-update-course.html
 create mode 100644 belajarbelajar/src/main/resources/templates/form-update-pengajar.html
 create mode 100644 belajarbelajar/src/main/resources/templates/home.html
 delete mode 100644 belajarbelajar/src/main/resources/templates/notifikasi-delete.html
 delete mode 100644 belajarbelajar/src/main/resources/templates/notifikasi-gagal-add.html
 create mode 100644 belajarbelajar/src/main/resources/templates/update-course.html
 create mode 100644 belajarbelajar/src/main/resources/templates/update-pengajar.html

diff --git a/README.md b/README.md
index 73a47bc..eeb94f7 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,40 @@
 ## Authors
 * **Hilmi Al Biruni** - *2006463843* - *APAP-B*
 
+## Tutorial 3
+### Pertanyaan 1: Tolong jelaskan secara singkat apa kegunaan dari anotasi-anotasi yang ada pada model (@AllArgsConstructor, @NoArgsConstructor, @Setter, @Getter, @Entity, @Table)
+#### @AllArgsConstructor digunakan untuk menghasilkan constructor pada semua field pada class dengan suatu parameter.
+#### @NoArgsConstructor digunakan untuk menghasilkan no-args constructor yang akan menghasilkan pesan error jika constructor terseebut tidak dapat ditulis karena adanya final fields
+#### @Setter dan @Getter digunakan untuk mempermudah generate setter dan getter sehingga tidak perlu membuat manual, hanya memanggil get dan set saja.
+#### @Entity digunakan untuk mewakili data yang akan disimpan didalam database
+#### @Table digunakan untuk menentukan nama table database yang nantinya digunakan sebagai pemetaan
+#### Referensi : https://javabydeveloper.com/lombok-allargsconstructor-examples/ https://projectlombok.org/api/lombok/NoArgsConstructor.html
+
+### Pertanyaan 2: Pada class CourseDb, terdapat method findByCodeUsingQuery dan findByCode, apakah perbedaan kedua method tersebut? Jelaskan juga kegunaan @Query pada method findByCodeUsingQuery! 
+Pada findByCode tidak menggunakan @Query sedangkan pada findByCodeUsingQuery menggunakan @Query. @Query digunakan untuk mengimplementasikan command MySQL pada interface dan menghubungkannya ke database sehingga akan menjadi @Query("SELECT.....") lalu diikuti dengan  findByCodeUsingQuery
+
+### Pertanyaan 3: Jelaskan perbedaan kegunaan dari anotasi @JoinTable dan @JoinColumn
+#### @JoinTable menyimpan id dari kedua entity ke tabel yang terpisah. Penggunaan @JoinTable ketika kita ingin mengatur hubungan antara entity dengan table lain.
+
+#### Sedangkan @JoinColumn menyimpan id dari entity lain di column baru di tabel yang sama. Penggunaan @JoinColumn ketika entity memiliki direct relationship seperti foreign key antara dua entity.
+
+### Pertanyaan 4: Pada class Pengajar, digunakan anotasi @JoinColumn pada atribut Course, apa kegunaan dari name, referencedColumnName, dan nullable dalam anotasi tersebut? dan apa perbedaan nullable dan penggunaan anotasi @NotNull
+Pada @JoinColumn di atribut Course, name berguna untuk menyatakan nama dari foreign key column. Lalu, referencedColumnName berguna untuk mencari nama dari column yang direferensi oleh foreign key column. Kemudian, nullable untuk menyatakan apakah foreign key kolomnya null atau tidak. Perbedaan dari nullable dengan anotasi @NotNull adalah nullable hanya menambahkan batasan null yang true / false ke definisi tabel, sedangkan anotasi @NotNull memeriksa apakah atributnya bukan null.
+
+
+### Pertanyaan 5: Jelaskan kegunaan FetchType.LAZY, CascadeType.ALL, dan FetchType.EAGER
+#### FetchType.LAZY berisi seluruh data java object yang telah di-fetch saat dibutuhkan atau saat memanggil datanya (LAZY). FetchType biasanya digunakan di relasi many-to-many atau one-to-many.
+
+#### CascadeType.All berguna supaya segala perubahan yang ada pada suatu entity akan terjadi juga pada entity seluruh anaknya/child. Perubahan terjadi saat ada delete, update, dan lainnya.
+
+#### FetchType.EAGER berisi seluruh data java objects yang telah di-fetch langsung. fetchtype ini akan melakukan fetch-nya diawal. Berbeda dengan tipe LAZY, tipe ini digunakan untuk relasi many-to-one atau one-to-one.
+
+
+
+
+
+
+
 ## Tutorial 2
 ### Pertanyaan 1: Cobalah untuk menambahkan sebuah Course dengan mengakses link berikut: http://localhost:8080/course/add?code=APAP&nameCourse=APAP%20Tutorial2&description=2020%20Fasilkom&jumlahSks=3 Apa yang terjadi? Jelaskan mengapa hal tersebut dapat terjadi?
 Jika link tersebut diakses akan memunculkan Whitelabel Error Page Service Error 500. Hal ini dikarenakan sudah ada perintah return "add-course" pada controller. Controller merupakan file yang berfungsi untuk melakukan mapping dari request yang diinput, kemudian akan diminta untuk memanggil template html yang akan direturn. Sedangkan html "add-course" belum dibuat, sehingga hal ini akan menyebabkan error.
diff --git a/belajarbelajar/build.gradle b/belajarbelajar/build.gradle
index 605ad94..ae74c87 100644
--- a/belajarbelajar/build.gradle
+++ b/belajarbelajar/build.gradle
@@ -17,6 +17,11 @@ dependencies {
 	implementation 'org.springframework.boot:spring-boot-starter-web'
 	developmentOnly 'org.springframework.boot:spring-boot-devtools'
 	testImplementation 'org.springframework.boot:spring-boot-starter-test'
+	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
+	implementation 'mysql:mysql-connector-java:5.1.6'
+	compileOnly("org.projectlombok:lombok:1.18.24")
+	annotationProcessor('org.projectlombok:lombok:1.18.24')
+	implementation 'org.springframework.boot:spring-boot-starter-validation:2.7.3'
 }
 
 tasks.named('test') {
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/BaseController.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/BaseController.java
new file mode 100644
index 0000000..35d4540
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/BaseController.java
@@ -0,0 +1,12 @@
+package apap.tutorial.belajarbelajar.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class BaseController {
+    @GetMapping("/")
+    private String Home() {
+        return "home";
+    }
+}
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/CourseController.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/CourseController.java
index 81aca5a..1ec411e 100644
--- a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/CourseController.java
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/CourseController.java
@@ -1,96 +1,79 @@
 package apap.tutorial.belajarbelajar.controller;
 
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import apap.tutorial.belajarbelajar.model.PengajarModel;
+import apap.tutorial.belajarbelajar.service.CourseService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import apap.tutorial.belajarbelajar.model.CourseModel;
-import apap.tutorial.belajarbelajar.service.CourseService;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
 @Controller
 public class CourseController {
+    @Qualifier("courseServiceImpl")
     @Autowired
     private CourseService courseService;
 
-    @RequestMapping("course/add")
-    public String addCourse(
-            @RequestParam(value = "code", required = true) String code,
-            @RequestParam(value = "nameCourse", required = true) String nameCourse,
-            @RequestParam(value = "description", required = true) String description,
-            @RequestParam(value = "jumlahSks", required = true) String jumlahSks,
-            Model model) {
-        for (CourseModel object : courseService.getListCourse()){
-            if (code.equalsIgnoreCase(object.getCode())){
-                return "notifikasi-gagal-add";
-            }
-        }
-        CourseModel course = new CourseModel(code, nameCourse, description, Integer.parseInt(jumlahSks));
+    @GetMapping("/course/add")
+    public String addCourseFormPage(Model model) {
+        model.addAttribute("course", new CourseModel());
+        return "form-add-course";
+    }
 
+    @PostMapping("/course/add")
+    public String addCourseSubmitPage(@ModelAttribute CourseModel course, Model model) {
         courseService.addCourse(course);
-        model.addAttribute("code", code);
-        model.addAttribute("nameCourse", nameCourse);
-
+        model.addAttribute("code", course.getCode());
         return "add-course";
     }
-    @RequestMapping("course/viewAll")
+
+    @GetMapping("/course/viewall")
     public String listCourse(Model model) {
         List<CourseModel> listCourse = courseService.getListCourse();
         model.addAttribute("listCourse", listCourse);
         return "viewall-course";
     }
 
-    @RequestMapping("course/view")
-    public String detailCourse(@RequestParam(value = "code") String code, Model model) {
-        // Mendapatkan CourseModel sesuai dengan code
+
+    @GetMapping("/course/viewall-sort")
+    public String listCourseSort(Model model) {
+        List<CourseModel> listCourse = courseService.getCourseSort();
+        model.addAttribute("listCourse", listCourse);
+        return "viewall-course";
+    }
+
+    @GetMapping("/course/view")
+    public String viewDetailCoursePage(@RequestParam(value = "code") String code, Model model) {
         CourseModel course = courseService.getCourseByCodeCourse(code);
-        // Add variabel semua courseModel ke "course" untuk dirender pada thymeleaf
+        List<PengajarModel> listPengajar = course.getListPengajar();
+        model.addAttribute("listPengajar", listPengajar);
         model.addAttribute("course", course);
         return "view-course";
     }
 
-    @GetMapping("course/view/code-course/{code}")
-    public String detailCoursePathVariable(@PathVariable(value = "code") String code, Model model) {
-        // Mendapatkan CourseModel sesuai dengan code
+    @GetMapping("course/view-query")
+    public String viewDetailCoursePageQuery(@RequestParam(value = "code") String code, Model model) {
         CourseModel course = courseService.getCourseByCodeCourse(code);
-        // Add variabel semua courseModel ke "course" untuk dirender pada thymeleaf
+        List<PengajarModel> listPengajar = course.getListPengajar();
+        model.addAttribute("listPengajar", listPengajar);
         model.addAttribute("course", course);
         return "view-course";
     }
 
-    @GetMapping("course/update/code-course/{code}/jumlah-sks/{sks}")
-    public String updateBanyakSks( @PathVariable(value = "code") String code, @PathVariable(value = "sks") int sks, Model model) {
-        // Mendapatkan CourseModel sesuai dengan code
+    @GetMapping("course/update/{code}")
+    public String updateCourseFormPage(@PathVariable(value = "code") String code, Model model) {
         CourseModel course = courseService.getCourseByCodeCourse(code);
-        // Update variabel jumlahSks
-        course.setJumlahSks(sks);
         model.addAttribute("course", course);
-        return "berhasil-ditambahkan";
+        return "form-update-course";
     }
 
-
-//    }
-@GetMapping("course/delete/code-course/{code}")
-public String deleteCourse(@PathVariable(value = "code") String code, Model model) {
-    CourseModel course = courseService.getCourseByCodeCourse(code);
-    List<CourseModel> listCourse = courseService.getListCourse();
-//    listCourse.remove(course);
-    model.addAttribute("course", course);
-    if (courseService.getListCourse().contains(code) == false) {
-        return "notifikasi-delete";
+    @PostMapping("course/update")
+    public String updateCourseSubmitPage(@ModelAttribute CourseModel course, Model model) {
+        CourseModel updatedCourse = courseService.updateCourse(course);
+        model.addAttribute("code", updatedCourse.getCode());
+        return "update-course";
     }
-    else {
-        listCourse.remove(course);
-        model.addAttribute("course", course);
-        return "delete-course";
-    }
-}
-
-
-
 }
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/PengajarController.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/PengajarController.java
new file mode 100644
index 0000000..c5148ec
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/controller/PengajarController.java
@@ -0,0 +1,61 @@
+package apap.tutorial.belajarbelajar.controller;
+
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import apap.tutorial.belajarbelajar.model.PengajarModel;
+import apap.tutorial.belajarbelajar.service.CourseService;
+import apap.tutorial.belajarbelajar.service.PengajarService;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+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.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Controller
+public class PengajarController {
+    @Qualifier("pengajarServiceImpl")
+    @Autowired
+    private PengajarService pengajarService;
+
+    @Qualifier("courseServiceImpl")
+    @Autowired
+    private CourseService courseService;
+
+    @GetMapping("/pengajar/add/{code}")
+    public String addPengajarFormPage(@PathVariable String code, Model model) {
+        PengajarModel pengajar = new PengajarModel();
+        CourseModel course = courseService.getCourseByCodeCourse(code);
+        pengajar.setCourse(course);
+        model.addAttribute("pengajar", pengajar);
+        return "form-add-pengajar";
+    }
+
+    @PostMapping("/pengajar/add")
+    public String addPengajarSubmitPage(@ModelAttribute PengajarModel pengajar, Model model) {
+        pengajarService.addPengajar(pengajar);
+        model.addAttribute("noPengajar", pengajar.getNoPengajar());
+        return "add-pengajar";
+    }
+
+    @PostMapping("/pengajar/update")
+    public String updatePengajarSubmit(@ModelAttribute PengajarModel pengajar, Model model){
+        PengajarModel updatedPengajar = pengajarService.updatePengajar(pengajar);
+        model.addAttribute("noPengajar",updatedPengajar.getNoPengajar());
+        return "update-pengajar";
+    }
+
+    @GetMapping("/pengajar/update/{noPengajar}")
+    public String updatePengajar(@PathVariable Long noPengajar, Model model){
+        PengajarModel pengajar = pengajarService.getPengajarByNoPengajar(noPengajar);
+        String validate = pengajarService.validateUpdate(pengajar);
+        model.addAttribute("pengajar",noPengajar);
+        return validate;
+    }
+
+}
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/CourseModel.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/CourseModel.java
index 491e79a..2472fa3 100644
--- a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/CourseModel.java
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/CourseModel.java
@@ -1,47 +1,56 @@
 package apap.tutorial.belajarbelajar.model;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Setter
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Table(name = "course")
 public class CourseModel {
-    private  String code;
-    private  String nameCourse;
-    private  String description;
-    private  int  jumlahSks;
-
-    public CourseModel(String code, String nameCourse, String description, int jumlahSks) {
-        this.code = code;
-        this.nameCourse = nameCourse;
-        this.description = description;
-        this.jumlahSks = jumlahSks;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-
-    public void setNameCourse(String nameCourse) {
-        this.nameCourse = nameCourse;
-    }
-
-    public void setDescription(String description) {
-        this.description = description;
-    }
-
-    public void setJumlahSks(int jumlahSks) {
-        this.jumlahSks = jumlahSks;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public String getNameCourse() {
-        return nameCourse;
-    }
-
-    public String getDescription() {
-        return description;
-    }
-
-    public int getJumlahSks() {
-        return jumlahSks;
-    }
-}
+    @Id
+    @Size(max = 30)
+    private String code;
+
+    @NotNull
+    @Size(max = 30)
+    @Column(name = "name_course", nullable = false)
+    private String nameCourse;
+
+    @NotNull
+    @Size(max = 200)
+    @Column(name = "description", nullable = false)
+    private String description;
+
+    @NotNull
+    @Column(name = "jumlah_sks", nullable = false)
+    private Integer jumlahSks;
+
+    @NotNull
+    @Column(nullable = false)
+    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
+    private LocalDateTime tanggalDimulai;
+
+    @NotNull
+    @Column(nullable = false)
+    @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
+    private LocalDateTime tanggalBerakhir;
+
+    @OneToMany(mappedBy = "course", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    private List<PengajarModel> listPengajar;
+
+    @ManyToMany
+    @JoinTable(name = "penyelenggara_course", joinColumns = @JoinColumn(name = "code"), inverseJoinColumns = @JoinColumn(name = "no_penyelenggara"))
+    List<PenyelenggaraModel> listPenyelenggara;
+}
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PengajarModel.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PengajarModel.java
new file mode 100644
index 0000000..0564f2b
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PengajarModel.java
@@ -0,0 +1,40 @@
+package apap.tutorial.belajarbelajar.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.hibernate.annotations.OnDelete;
+import org.hibernate.annotations.OnDeleteAction;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.List;
+
+@Setter
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Table(name = "pengajar")
+public class PengajarModel implements Serializable{
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long noPengajar;
+
+    @NotNull
+    @Size(max = 30)
+    @Column(name = "nama_pengajar", nullable = false)
+    private String namaPengajar;
+
+    @NotNull
+    @Column(name = "is_pengajar_universitas", nullable = false)
+    private Boolean isPengajarUniversitas;
+
+    @ManyToOne(fetch = FetchType.EAGER, optional = false)
+    @JoinColumn(name = "code", referencedColumnName = "code", nullable = false)
+    @OnDelete(action = OnDeleteAction.CASCADE)
+    private CourseModel course;
+}
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PenyelenggaraModel.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PenyelenggaraModel.java
new file mode 100644
index 0000000..653cb4e
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/model/PenyelenggaraModel.java
@@ -0,0 +1,36 @@
+package apap.tutorial.belajarbelajar.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.List;
+
+@Setter
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@Table(name = "penyelenggara")
+public class PenyelenggaraModel implements Serializable{
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long noPenyelenggara;
+
+    @NotNull
+    @Size(max = 30)
+    @Column(name = "nama_penyelenggara", nullable = false)
+    private String namaPenyelenggara;
+
+    @NotNull
+    @Column(name = "jenis_lembaga", nullable = false)
+    private Integer jenisLembaga;
+
+    @ManyToMany(mappedBy = "listPenyelenggara")
+    List<CourseModel> listCourse;
+}
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/CourseDb.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/CourseDb.java
new file mode 100644
index 0000000..4c47749
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/CourseDb.java
@@ -0,0 +1,22 @@
+package apap.tutorial.belajarbelajar.repository;
+
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.*;
+
+import java.util.Optional;
+
+@Repository
+public interface CourseDb extends JpaRepository<CourseModel, String>{
+    Optional<CourseModel> findByCode(String code);
+
+    @Query("SELECT c FROM CourseModel c WHERE c.code = :code")
+    Optional<CourseModel> findByCodeUsingQuery(@Param("code") String code);
+
+//    @Query("SELECT c FROM CourseModel c WHERE c.code = :code ORDER BY c.nameCourse ASC")
+//    List<CourseModel> findByOrderName();
+}
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/PengajarDb.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/PengajarDb.java
new file mode 100644
index 0000000..7a0be51
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/PengajarDb.java
@@ -0,0 +1,15 @@
+package apap.tutorial.belajarbelajar.repository;
+
+import apap.tutorial.belajarbelajar.model.PengajarModel;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface PengajarDb extends JpaRepository<PengajarModel, Long>{
+    @Query("SELECT c FROM PengajarModel c WHERE c.noPengajar = :noPengajar")
+    Optional<PengajarModel> findByNoPengajarQuery(@Param("noPengajar") Long noPengajar);
+}
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/PenyelenggaraDb.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/PenyelenggaraDb.java
new file mode 100644
index 0000000..969ac8a
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/repository/PenyelenggaraDb.java
@@ -0,0 +1,9 @@
+package apap.tutorial.belajarbelajar.repository;
+
+import apap.tutorial.belajarbelajar.model.PenyelenggaraModel;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface PenyelenggaraDb extends JpaRepository<PenyelenggaraModel, Long>{
+}
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseService.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseService.java
index 421b62a..61804fc 100644
--- a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseService.java
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseService.java
@@ -1,15 +1,15 @@
 package apap.tutorial.belajarbelajar.service;
+
 import apap.tutorial.belajarbelajar.model.CourseModel;
-import java.util.List;
 
-public interface CourseService {
+import java.util.List;
 
+public interface CourseService{
     void addCourse(CourseModel course);
-
     List<CourseModel> getListCourse();
-
+    List<CourseModel> getCourseSort();
     CourseModel getCourseByCodeCourse(String code);
+    CourseModel getCourseByCodeCourseQuery(String code);
+    CourseModel updateCourse(CourseModel course);
 
-//    CourseModel deleteCourse(CourseModel course);
-}
-
+}
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseServiceImpl.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseServiceImpl.java
index 9589810..edfe44f 100644
--- a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseServiceImpl.java
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/CourseServiceImpl.java
@@ -1,38 +1,55 @@
 package apap.tutorial.belajarbelajar.service;
 
-import java.util.ArrayList;
-import java.util.List;
-
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import apap.tutorial.belajarbelajar.repository.CourseDb;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 
-import apap.tutorial.belajarbelajar.model.CourseModel;
+import javax.transaction.Transactional;
+import java.util.List;
+import java.util.Optional;
 
 @Service
+@Transactional
 public class CourseServiceImpl implements CourseService{
-    private List<CourseModel> listCourse;
-
-    public CourseServiceImpl(){
-        listCourse = new ArrayList<>();
-    }
+    @Autowired
+    CourseDb courseDb;
 
     @Override
     public void addCourse(CourseModel course) {
-        listCourse.add(course);
+        courseDb.save(course);
     }
 
     @Override
     public List<CourseModel> getListCourse() {
-        return listCourse;
+        return courseDb.findAll();
     }
 
     @Override
-    public CourseModel getCourseByCodeCourse(String code){
-        for (CourseModel course: listCourse) {
-            if (course.getCode().equals(code)) {
-                return course;
-            }
-        }
-        return null;
+    public CourseModel getCourseByCodeCourse(String code) {
+        Optional<CourseModel> course = courseDb.findByCode(code);
+        if (course.isPresent()) {
+            return course.get();
+        } else return null;
     }
-}
 
+    @Override
+    public CourseModel getCourseByCodeCourseQuery(String code) {
+        Optional<CourseModel> course = courseDb.findByCodeUsingQuery(code);
+        if (course.isPresent()) {
+            return course.get();
+        } else return null;
+    }
+
+    @Override
+    public List<CourseModel> getCourseSort() {
+        return courseDb.findAll(Sort.by(Sort.Direction.ASC, "nameCourse"));
+    }
+
+    @Override
+    public CourseModel updateCourse(CourseModel course) {
+        courseDb.save(course);
+        return course;
+    }
+}
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarService.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarService.java
new file mode 100644
index 0000000..e622435
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarService.java
@@ -0,0 +1,12 @@
+package apap.tutorial.belajarbelajar.service;
+
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import apap.tutorial.belajarbelajar.model.PengajarModel;
+
+
+public interface PengajarService {
+    void addPengajar(PengajarModel pengajar);
+    PengajarModel updatePengajar(PengajarModel pengajar);
+    PengajarModel getPengajarByNoPengajar(Long noPengajar);
+    String validateUpdate(PengajarModel pengajarModel);
+}
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarServiceImpl.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarServiceImpl.java
new file mode 100644
index 0000000..341bfeb
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PengajarServiceImpl.java
@@ -0,0 +1,47 @@
+package apap.tutorial.belajarbelajar.service;
+
+import apap.tutorial.belajarbelajar.model.CourseModel;
+import apap.tutorial.belajarbelajar.model.PengajarModel;
+import apap.tutorial.belajarbelajar.repository.PengajarDb;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.Optional;
+
+@Service
+@Transactional
+public class PengajarServiceImpl implements PengajarService{
+    @Autowired
+    PengajarDb pengajarDb;
+
+    @Override
+    public void addPengajar(PengajarModel pengajar) {
+        pengajarDb.save(pengajar);
+    }
+
+    @Override
+    public PengajarModel updatePengajar(PengajarModel pengajar) {
+        pengajarDb.save(pengajar);
+        return pengajar;
+    }
+    @Override
+    public PengajarModel getPengajarByNoPengajar(Long noPengajar) {
+        Optional<PengajarModel> pengajar = pengajarDb.findByNoPengajarQuery(noPengajar);
+        if (pengajar.isPresent()) {
+            return pengajar.get();
+        } else return null;
+    }
+
+    @Override
+    public String validateUpdate(PengajarModel pengajar) {
+        if (pengajar != null) {
+            if (pengajar.getCourse().getTanggalBerakhir().isBefore(LocalDateTime.now())) {
+//                pengajarDb.delete(pengajar);
+                return "form-update-pengajar";
+            }
+        }
+        return "error-update-pengajar";
+    }
+}
\ No newline at end of file
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PenyelenggaraService.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PenyelenggaraService.java
new file mode 100644
index 0000000..c3f2137
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PenyelenggaraService.java
@@ -0,0 +1,7 @@
+package apap.tutorial.belajarbelajar.service;
+
+import apap.tutorial.belajarbelajar.model.PenyelenggaraModel;
+
+public interface PenyelenggaraService {
+    void addPenyelenggara(PenyelenggaraModel penyelenggara);
+}
diff --git a/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PenyelenggaraServiceImpl.java b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PenyelenggaraServiceImpl.java
new file mode 100644
index 0000000..342e748
--- /dev/null
+++ b/belajarbelajar/src/main/java/apap/tutorial/belajarbelajar/service/PenyelenggaraServiceImpl.java
@@ -0,0 +1,20 @@
+package apap.tutorial.belajarbelajar.service;
+
+import apap.tutorial.belajarbelajar.model.PenyelenggaraModel;
+import apap.tutorial.belajarbelajar.repository.PenyelenggaraDb;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.transaction.Transactional;
+
+@Service
+@Transactional
+public class PenyelenggaraServiceImpl implements PenyelenggaraService{
+    @Autowired
+    PenyelenggaraDb penyelenggaraDb;
+
+    @Override
+    public void addPenyelenggara(PenyelenggaraModel penyelenggara) {
+        penyelenggaraDb.save(penyelenggara);
+    }
+}
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/application.properties b/belajarbelajar/src/main/resources/application.properties
index 8b13789..9be6051 100644
--- a/belajarbelajar/src/main/resources/application.properties
+++ b/belajarbelajar/src/main/resources/application.properties
@@ -1 +1,16 @@
+#konfigurasi untuk koneksi MySQL
+spring.sql.init.platform=mysql
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 
+#sesuaikan NAMA_DATABASE dengan nama database anda
+spring.datasource.url=jdbc:mysql://localhost:3306/belajarbelajar?useSSL=false&serverTimezone=Asia/Jakarta
+
+#sesuaikan dengan NAMA dan PASSWORD mysql anda
+spring.datasource.username=root
+spring.datasource.password=
+
+#optimize query untuk db MySQL
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
+
+#pembuatan database (create || create drop || validate || update)
+spring.jpa.hibernate.ddl-auto=update
diff --git a/belajarbelajar/src/main/resources/templates/add-course.html b/belajarbelajar/src/main/resources/templates/add-course.html
index e52f27e..a890d80 100644
--- a/belajarbelajar/src/main/resources/templates/add-course.html
+++ b/belajarbelajar/src/main/resources/templates/add-course.html
@@ -1,16 +1,20 @@
 <!DOCTYPE html>
 <html lang="en" xmlns:th="http://thymeleaf.org">
 <head>
-    <meta charset="UTF-8" />
-    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Add Course</title>
-</head>
+    <title>BelajarBelajar</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
 <body>
-<h2
-        th:text="'Course dengan code Course ' + ${code} + ' berhasil ditambahkan.'">
+<div class="container">
+    <div class="card m-4 p-4">
+        <div class="card-body">
+            <div class="justify-content-center">
+                <h2 th:text="'Course dengan code ' + ${code} + ' berhasil ditambahkan.'"></h2>
+                <br>
+                <a class="btn btn-primary" href="/">Home</a>
+            </div>
+        </div>
+    </div>
+</div>
 
-</h2>
-<a href="/course/viewAll">Kembali</a>
 </body>
 </html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/add-pengajar.html b/belajarbelajar/src/main/resources/templates/add-pengajar.html
new file mode 100644
index 0000000..ffc7fa1
--- /dev/null
+++ b/belajarbelajar/src/main/resources/templates/add-pengajar.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org">
+<head>
+  <title>BelajarBelajar</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <h2 th:text="'Pengajar dengan no pengajar ' + ${noPengajar} + ' berhasil ditambahkan.'"></h2>
+        <br>
+        <a class="btn btn-primary" href="/">Home</a>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/berhasil-ditambahkan.html b/belajarbelajar/src/main/resources/templates/berhasil-ditambahkan.html
deleted file mode 100644
index e9abc5b..0000000
--- a/belajarbelajar/src/main/resources/templates/berhasil-ditambahkan.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://thymeleaf.org">
-<head>
-  <meta charset="UTF-8" />
-  <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
-  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
-  <title>Notifikasi</title>
-</head>
-<body>
-<h2>Berhasil Ditambahkan</h2>
-
-<a href="/course/viewAll">Kembali</a>
-</body>
-</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/delete-course.html b/belajarbelajar/src/main/resources/templates/delete-course.html
index 43d0368..901b3a7 100644
--- a/belajarbelajar/src/main/resources/templates/delete-course.html
+++ b/belajarbelajar/src/main/resources/templates/delete-course.html
@@ -1,14 +1,15 @@
 <!DOCTYPE html>
 <html lang="en" xmlns:th="http://thymeleaf.org">
 <head>
-  <meta charset="UTF-8" />
-  <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
-  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
-  <title>Deleted</title>
+  <meta charset="UTF-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+  <title>Delete Course</title>
 </head>
 <body>
-<h2>Sudah berhasil di delete</h2>
-
+<h2
+        th:text="'Course dengan code Course ' + ${code} +' berhasil dihapus.'"
+></h2>
 <a href="/course/viewAll">Kembali</a>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/belajarbelajar/src/main/resources/templates/error-update.html b/belajarbelajar/src/main/resources/templates/error-update.html
new file mode 100644
index 0000000..9575855
--- /dev/null
+++ b/belajarbelajar/src/main/resources/templates/error-update.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org">
+<head>
+  <title>BelajarBelajar</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <h2 th:text="'Error terjadi saat mengupdate!'"></h2>
+        <br>
+        <a class="btn btn-primary" href="/">Home</a>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/form-add-course.html b/belajarbelajar/src/main/resources/templates/form-add-course.html
new file mode 100644
index 0000000..3c0cebf
--- /dev/null
+++ b/belajarbelajar/src/main/resources/templates/form-add-course.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org">
+<head>
+  <title>BelajarBelajar</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <h2>Tambah Course</h2>
+        <br>
+        <form th:action="@{/course/add}" th:object="${course}" method="POST">
+          Code Course: <br>
+          <input class="form-control" type="text" name="code"/>
+          <br><br>
+
+          Nama Course: <br>
+          <input class="form-control" type="text" name="nameCourse"/>
+          <br><br>
+
+          Description: <br>
+          <input class="form-control" type="text" name="description"/>
+          <br><br>
+
+          Jumlah SKS: <br>
+          <input required class="form-control" type="number" name="jumlahSks" />
+          <br><br>
+
+          Tanggal Dibuka: <br>
+          <input required class="form-control" type="datetime-local" name="tanggalDimulai" />
+          <br><br>
+
+          Tanggal Ditutup: <br>
+          <input required class="form-control" type="datetime-local" name="tanggalBerakhir" />
+          <br><br>
+
+          <button class="btn btn-primary" type="submit">Submit</button>
+          <a class="btn btn-primary" href="/">Home</a>
+        </form>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/form-add-pengajar.html b/belajarbelajar/src/main/resources/templates/form-add-pengajar.html
new file mode 100644
index 0000000..e873e27
--- /dev/null
+++ b/belajarbelajar/src/main/resources/templates/form-add-pengajar.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org">
+<head>
+  <title>BelajarBelajar</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <h2>Tambah Pengajar</h2>
+        <br>
+        <form th:action="@{/pengajar/add}" th:object="${pengajar}" method="POST">
+          <input type="hidden" th:field="*{course}" />
+
+          Nama Pengajar : <br>
+          <input class="form-control" type="text" name="namaPengajar"/>
+          <br>
+
+          Tipe Pengajar : <br>
+          <select name="isPengajarUniversitas">
+            <option value="0">Bukan Pengajar Universitas</option>
+            <option value="1">Pengajar Universitas</option>
+          </select>
+          <br><br>
+
+          <button class="btn btn-primary" type="submit">Submit</button>
+          <a class="btn btn-primary" href="/">Home</a>
+        </form>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/form-update-course.html b/belajarbelajar/src/main/resources/templates/form-update-course.html
new file mode 100644
index 0000000..d304860
--- /dev/null
+++ b/belajarbelajar/src/main/resources/templates/form-update-course.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org">
+<head>
+  <title>BelajarBelajar</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <h2>Update Course</h2>
+        <br>
+        <form th:action="@{/course/update}" th:object="${course}" method="POST">
+
+          <input type="hidden" th:field="*{code}" />
+
+
+          Nama Course: <br>
+          <input class="form-control" type="text" name="nameCourse" th:value="*{nameCourse}"/>
+          <br><br>
+
+          Description: <br>
+          <input class="form-control" type="text" name="description" th:value="*{description}"/>
+          <br><br>
+
+          Jumlah SKS: <br>
+          <input required class="form-control" type="number" name="jumlahSks" th:value="*{jumlahSks}" />
+          <br><br>
+
+          Tanggal Dibuka: <br>
+          <input required class="form-control" type="datetime-local" name="tanggalDimulai" th:value="*{tanggalDimulai}"/>
+          <br><br>
+
+          Tanggal Ditutup: <br>
+          <input required class="form-control" type="datetime-local" name="tanggalBerakhir" th:value="*{tanggalBerakhir}"/>
+          <br><br>
+
+
+
+          <button class="btn btn-primary" type="submit">Submit</button>
+          <a class="btn btn-primary" href="/course/viewall">Kembali</a>
+        </form>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/form-update-pengajar.html b/belajarbelajar/src/main/resources/templates/form-update-pengajar.html
new file mode 100644
index 0000000..205d403
--- /dev/null
+++ b/belajarbelajar/src/main/resources/templates/form-update-pengajar.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org">
+<head>
+    <title>BelajarBelajar</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+    <div class="card m-4 p-4">
+        <div class="card-body">
+            <div class="justify-content-center">
+                <h2>Update Pengajar</h2>
+                <br>
+                <form th:action="@{/pengajar/update}" th:object="${pengajar}" method="POST">
+
+                    <input type="hidden" th:field="*{course}" />
+
+
+                    Kode: <br>
+                    <input type="text"  th:value="*{noPengajar}" readonly th:field="*{noPengajar}" />
+
+
+                    Nama Pengajar: <br>
+                    <input class="form-control" type="text" name="namaPengajar" th:value="*{namaPengajar}"/>
+                    <br><br>
+
+
+                    Tipe Pengajar : <br>
+                    <select th:field="*{isPengajarUniversitas}">
+                        <option th:value="true" th:text="'Pengajar Universitas'"></option>
+                        <option th:value="false" th:text="'Bukan Pengajar Universitas'"></option>
+                    </select>
+
+
+
+                    <button class="btn btn-primary" type="submit">Submit</button>
+                    <a class="btn btn-primary" href="/course/viewall">Kembali</a>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/home.html b/belajarbelajar/src/main/resources/templates/home.html
new file mode 100644
index 0000000..2bd6145
--- /dev/null
+++ b/belajarbelajar/src/main/resources/templates/home.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org">
+<head>
+  <title>BelajarBelajar</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <h2>Welcome to BelajarBelajar!</h2>
+        <br>
+        <a class="btn btn-primary" href="/course/add">Add Course</a>
+        <a class="btn btn-primary" href="/course/viewall">View All Course</a>
+        <a class="btn btn-primary" href="/course/viewall-sort">View All Course Order By Name</a>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/notifikasi-delete.html b/belajarbelajar/src/main/resources/templates/notifikasi-delete.html
deleted file mode 100644
index 0cfc1c4..0000000
--- a/belajarbelajar/src/main/resources/templates/notifikasi-delete.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://thymeleaf.org">
-<head>
-  <meta charset="UTF-8" />
-  <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
-  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
-  <title>Failed</title>
-</head>
-<body>
-<h2>Tidak ditemukan, jadi tidak bisa di eksekusi</h2>
-
-<a href="/course/viewAll">Kembali</a>
-</body>
-</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/notifikasi-gagal-add.html b/belajarbelajar/src/main/resources/templates/notifikasi-gagal-add.html
deleted file mode 100644
index 4b6d040..0000000
--- a/belajarbelajar/src/main/resources/templates/notifikasi-gagal-add.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://thymeleaf.org">
-<head>
-  <meta charset="UTF-8" />
-  <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
-  <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
-  <title>Notifikasi</title>
-</head>
-<body>
-<h2>Gagal Ditambah</h2>
-
-<a href="/course/viewAll">Kembali</a>
-</body>
-</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/update-course.html b/belajarbelajar/src/main/resources/templates/update-course.html
new file mode 100644
index 0000000..2e58b04
--- /dev/null
+++ b/belajarbelajar/src/main/resources/templates/update-course.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org">
+<head>
+  <title>BelajarBelajar</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <h2 th:text="'Course dengan code ' + ${code} + ' berhasil diupdate.'"></h2>
+        <br>
+        <a class="btn btn-primary" href="/">Home</a>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/update-pengajar.html b/belajarbelajar/src/main/resources/templates/update-pengajar.html
new file mode 100644
index 0000000..abf380c
--- /dev/null
+++ b/belajarbelajar/src/main/resources/templates/update-pengajar.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://thymeleaf.org">
+<head>
+  <title>BelajarBelajar</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <h2 th:text="'Pengajar dengan nama ' + ${namaPengajar} + ' berhasil diupdate.'"></h2>
+        <br>
+        <a class="btn btn-primary" href="/">Home</a>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/view-course.html b/belajarbelajar/src/main/resources/templates/view-course.html
index 8eefe62..b36d779 100644
--- a/belajarbelajar/src/main/resources/templates/view-course.html
+++ b/belajarbelajar/src/main/resources/templates/view-course.html
@@ -1,17 +1,41 @@
 <!DOCTYPE html>
 <html lang="en" xmlns:th="http://thymeleaf.org">
-  <head>
-    <meta charset="UTF-8"/>
-    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>View Course</title>
-  </head>
-  <body>
-    <h2>Informasi Course</h2>
-    <h3 th:text="'Code Course  : ' + ${course.code}"></h3>
-    <h3 th:text="'Nama Course  : ' + ${course.nameCourse}"></h3>
-    <h3 th:text="'Deskripsi Course  : ' + ${course.description}"></h3>
-    <h3 th:text="'jumlah sks Course  : ' + ${course.jumlahSks}"></h3>
-    <a href="/course/viewAll">Kembali</a>
-  </body>
+<head>
+  <title>BelajarBelajar</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <h2>Detail Course</h2>
+        <br>
+        <p th:text="'Code Course: ' + ${course.code}"></p>
+        <p th:text="'Nama Course: ' + ${course.nameCourse}"></p>
+        <p th:text="'Description: ' + ${course.description}"></p>
+        <p th:text="'Jumlah SKS: ' + ${course.jumlahSks}"></p>
+        <p th:text="'Tanggal Dimulai: ' + ${#temporals.format(course.tanggalDimulai, 'dd MMMM yyyy HH:mm')}"></p>
+        <p th:text="'Tanggal Berakhir: ' + ${#temporals.format(course.tanggalBerakhir, 'dd MMMM yyyy HH:mm')}"></p>
+
+        <div class="col">
+          <br>
+          <h4>Pengajar </h4>
+          <hr>
+          <div th:each="pengajar : ${listPengajar}">
+            <p th:text="'Nama: ' + ${pengajar.namaPengajar}"></p>
+            <p th:if="${pengajar.isPengajarUniversitas == false}">Pekerjaan: Non-Dosen Universitas</p>
+            <p th:if="${pengajar.isPengajarUniversitas == true}">Pekerjaan: Dosen Universitas</p>
+            <hr>
+          </div>
+        </div>
+        <br>
+        <a class="btn btn-primary" href="/course/viewall">Kembali</a>
+        <a class="btn btn-primary" th:href="@{/pengajar/add/} + ${course.code}">Tambah Pengajar</a>
+        <a class="btn btn-primary" th:href="@{/pengajar/update/}">Update Pengajar</a>
+      </div>
+    </div>
+  </div>
+</div>
+
+</body>
 </html>
\ No newline at end of file
diff --git a/belajarbelajar/src/main/resources/templates/viewall-course.html b/belajarbelajar/src/main/resources/templates/viewall-course.html
index 1ae68ea..0f1b691 100644
--- a/belajarbelajar/src/main/resources/templates/viewall-course.html
+++ b/belajarbelajar/src/main/resources/templates/viewall-course.html
@@ -1,19 +1,37 @@
 <!DOCTYPE html>
 <html lang="en" xmlns:th="http://thymeleaf.org">
-  <head>
-    <meta charset="UTF-8" />
-    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
-    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"/>
-    <title>View All Course</title>
-  </head>
-  <body>
-    <h2>Daftar Seluruh Course</h2>
-    <div th:each="course: ${listCourse}">
-      <h3 th:text=" 'Code Course  : ' + ${course.code}"></h3>
-      <h3 th:text=" 'Nama Course  : ' + ${course.nameCourse}"></h3>
-      <h3 th:text=" 'Deskripsi Course  : ' + ${course.description}"></h3>
-      <h3 th:text=" 'jumlah sks Course  : ' + ${course.jumlahSks}"></h3>
+<head>
+  <title>BelajarBelajar</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous"></head>
+<body>
+<div class="container">
+  <div class="card m-4 p-4">
+    <div class="card-body">
+      <div class="justify-content-center">
+        <h2>List Course</h2>
+        <br>
+        <div th:each="course : ${listCourse}">
+          <p th:text="'Code Course: ' + ${course.code}"></p>
+          <p th:text="'Nama Course: ' + ${course.nameCourse}"></p>
+          <p th:text="'Description: ' + ${course.description}"></p>
+          <p th:text="'Jumlah SKS: ' + ${course.jumlahSks}"></p>
+          <p th:text="'Tanggal Dimulai: ' + ${#temporals.format(course.tanggalDimulai, 'dd MMMM yyyy HH:mm')}"></p>
+          <p th:text="'Tanggal Berakhir: ' + ${#temporals.format(course.tanggalBerakhir, 'dd MMMM yyyy HH:mm')}"></p>
+          <div class="col">
+            <a class="btn btn-primary" th:href="@{/course/view(code=${course.code})}">Detail
+              Course</a>
+            <a class="btn btn-primary" th:href="@{/course/view-query(code=${course.code})}">Detail
+              Course By Query</a>
+            <a class="btn btn-primary" th:href="@{/course/update/} + ${course.code}">Update Course</a>
+          </div>
+          <hr>
+        </div>
+        <br>
+        <a class="btn btn-primary" href="/">Home</a>
+      </div>
     </div>
-    <a href="/course/viewAll">Kembali</a>
-  </body>
+  </div>
+</div>
+
+</body>
 </html>
\ No newline at end of file
-- 
GitLab