Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Abstract entity class lecture #64

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'org.springframework.boot' version '2.2.1.RELEASE'
id 'org.springframework.boot' version '2.4.4'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
Expand All @@ -22,6 +22,9 @@ repositories {
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'mysql:mysql-connector-java'
implementation 'org.springframework.boot:spring-boot-starter-validation'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.launchcode.codingevents.controllers;

import org.launchcode.codingevents.data.EventCategoryRepository;
import org.launchcode.codingevents.models.EventCategory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
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 javax.validation.Valid;

/**
* Created by Chris Bay
*/
@Controller
@RequestMapping("eventCategories")
public class EventCategoryController {

@Autowired
private EventCategoryRepository eventCategoryRepository;

@GetMapping
public String displayAllCategories(Model model) {
model.addAttribute("title", "All Categories");
model.addAttribute("categories", eventCategoryRepository.findAll());
return "eventCategories/index";
}

@GetMapping("create")
public String renderCreateEventCategoryForm(Model model) {
model.addAttribute("title", "Create Category");
model.addAttribute(new EventCategory());
return "eventCategories/create";
}

@PostMapping("create")
public String processCreateEventCategoryForm(@Valid @ModelAttribute EventCategory eventCategory,
Errors errors, Model model) {

if (errors.hasErrors()) {
model.addAttribute("title", "Create Category");
model.addAttribute(new EventCategory());
return "eventCategories/create";
}

eventCategoryRepository.save(eventCategory);
return "redirect:";
}

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package org.launchcode.codingevents.controllers;

import org.launchcode.codingevents.data.EventRepository;
import org.launchcode.codingevents.models.Event;
import org.launchcode.codingevents.models.EventType;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import javax.validation.Valid;

/**
* Created by Chris Bay
Expand All @@ -17,24 +18,52 @@
@RequestMapping("events")
public class EventController {

private static List<String> events = new ArrayList<>();
@Autowired
private EventRepository eventRepository;

@GetMapping
public String displayAllEvents(Model model) {
model.addAttribute("title", "All Events");
model.addAttribute("events", events);
model.addAttribute("events", eventRepository.findAll());
return "events/index";
}

@GetMapping("create")
public String displayCreateEventForm(Model model) {
model.addAttribute("title", "Create Event");
model.addAttribute(new Event());
model.addAttribute("types", EventType.values());
return "events/create";
}

@PostMapping("create")
public String processCreateEventForm(@RequestParam String eventName) {
events.add(eventName);
public String processCreateEventForm(@ModelAttribute @Valid Event newEvent,
Errors errors, Model model) {
if(errors.hasErrors()) {
model.addAttribute("title", "Create Event");
return "events/create";
}

eventRepository.save(newEvent);
return "redirect:";
}

@GetMapping("delete")
public String displayDeleteEventForm(Model model) {
model.addAttribute("title", "Delete Events");
model.addAttribute("events", eventRepository.findAll());
return "events/delete";
}

@PostMapping("delete")
public String processDeleteEventsForm(@RequestParam(required = false) int[] eventIds) {

if (eventIds != null) {
for (int id : eventIds) {
eventRepository.deleteById(id);
}
}

return "redirect:";
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.launchcode.codingevents.data;

import org.launchcode.codingevents.models.EventCategory;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

/**
* Created by Chris Bay
*/
@Repository
public interface EventCategoryRepository extends CrudRepository<EventCategory, Integer> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.launchcode.codingevents.data;

import org.launchcode.codingevents.models.Event;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

/**
* Created by Chris Bay
*/
@Repository
public interface EventRepository extends CrudRepository<Event, Integer> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.launchcode.codingevents.models;

import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.util.Objects;

/**
* Created by Chris Bay
*/
@MappedSuperclass
public abstract class AbstractEntity {

@Id
@GeneratedValue
private int id;

public int getId() {
return id;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AbstractEntity entity = (AbstractEntity) o;
return id == entity.id;
}

@Override
public int hashCode() {
return Objects.hash(id);
}

}
73 changes: 73 additions & 0 deletions src/main/java/org/launchcode/codingevents/models/Event.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.launchcode.codingevents.models;

import javax.persistence.Entity;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

/**
* Created by Chris Bay
*/
@Entity
public class Event extends AbstractEntity {

@NotBlank(message = "Name is required")
@Size(min = 3, max = 50, message = "Name must be between 3 and 50 characters")
private String name;

@Size(max = 500, message = "Description too long!")
private String description;

@NotBlank(message = "Email is required")
@Email(message = "Invalid email. Try again.")
private String contactEmail;

private EventType type;

public Event(String name, String description, String contactEmail, EventType type) {
this.name = name;
this.description = description;
this.contactEmail = contactEmail;
this.type = type;
}

public Event() {}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public String getContactEmail() {
return contactEmail;
}

public void setContactEmail(String contactEmail) {
this.contactEmail = contactEmail;
}

public EventType getType() {
return type;
}

public void setType(EventType type) {
this.type = type;
}

@Override
public String toString() {
return name;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.launchcode.codingevents.models;

import javax.persistence.Entity;
import javax.validation.constraints.Size;

/**
* Created by Chris Bay
*/
@Entity
public class EventCategory extends AbstractEntity {

@Size(min=3, message="Name must be at least 3 characters long")
private String name;

public EventCategory(@Size(min = 3, message = "Name must be at least 3 characters long") String name) {
this.name = name;
}

public EventCategory() {}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return name;
}

}
22 changes: 22 additions & 0 deletions src/main/java/org/launchcode/codingevents/models/EventType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.launchcode.codingevents.models;

/**
* Created by Chris Bay
*/
public enum EventType {

CONFERENCE("Conference"),
MEETUP("Meetup"),
WORKSHOP("Workshop"),
SOCIAL("Social");

private final String displayName;

EventType(String displayName) {
this.displayName = displayName;
}

public String getDisplayName() {
return displayName;
}
}
16 changes: 16 additions & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1 +1,17 @@
spring.datasource.url=jdbc:mysql://localhost:3306/coding_events_demo
spring.datasource.username=coding_events_demo
spring.datasource.password=Learn2code!

# Specify the DBMS
spring.jpa.database = MYSQL

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update

# Use spring.jpa.properties.* for Hibernate native properties (the prefix is
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect

5 changes: 4 additions & 1 deletion src/main/resources/static/styles.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
body {
font-size: 18px;
font-size: 14px;
}
.error {
color: red;
}
19 changes: 19 additions & 0 deletions src/main/resources/templates/eventCategories/create.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head th:replace="fragments :: head"></head>
<body class="container">

<header th:replace="fragments :: header"></header>

<form method="post">
<div class="form-group">
<label>Name
<input th:field="${eventCategory.name}" class="form-control">
</label>
<span th:errors="${eventCategory.name}" class="error"></span>
</div>
<input type="submit" value="Create" class="btn btn-primary">
</form>

</body>
</html>
Loading