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

Persistent model controller eh exercises #57

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
Open
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,48 @@
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;
@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 "eventCategories/create";
}

}
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,54 @@
@RequestMapping("events")
public class EventController {

private static List<String> events = new ArrayList<>();
@Autowired //wants spring to manage this class for us -- dependency injection
private EventRepository eventRepository;

// findAl, save, findById -- a part of CRUD Repo can be access by the object of event repo

@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,9 @@
package org.launchcode.codingevents.data;

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

@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;

@Repository
public interface EventRepository extends CrudRepository<Event, Integer> {
}

//crud repo allows you to interact with database in intelliJ
//Integer is the primary key we have to specify
98 changes: 98 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,98 @@
package org.launchcode.codingevents.models;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.Objects;

/**
* Created by Chris Bay
*/

@Entity
public class Event {

@Id
@GeneratedValue
private int id;

@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;
}

public int getId() {
return id;
}

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

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

@Override
public int hashCode() {
return Objects.hash(id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package org.launchcode.codingevents.models;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.Size;
import java.util.Objects;

@Entity
public class EventCategory {

@Id
@GeneratedValue
private int id;

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

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

public EventCategory() {

}

public int getId() {
return id;
}

public String getName() {
return name;
}

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

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof EventCategory)) return false;
EventCategory that = (EventCategory) o;
return id == that.id && Objects.equals(name, that.name);
}

@Override
public int hashCode() {
return Objects.hash(id, 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;
}
Loading