Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
058b05c
Adds id field to Event
chrisbay Dec 12, 2019
8c587e9
Adds data layer for Event objects
chrisbay Dec 12, 2019
4cfd42d
Implements ability to delete events
chrisbay Dec 12, 2019
7a735e7
Adds model binding
chrisbay Dec 12, 2019
bf923da
Adds validation annotations to model
chrisbay Dec 16, 2019
c80100b
Displays custom validation errors
chrisbay Dec 16, 2019
4dbb115
Adds EventType enum
chrisbay Dec 16, 2019
65b4bdb
Configures app to connect to MySQL
chrisbay Jan 14, 2020
91fce26
Enables persistence on Event class
chrisbay Jan 14, 2020
2fdf1ab
Uses EventRepository in EventController
chrisbay Jan 14, 2020
34c1b4f
Adds persistent EventCategory model
chrisbay Jan 14, 2020
bf0c5fc
Creates AbstractEntity
chrisbay Jan 15, 2020
3a1e42f
Adds one-to-many relationship
chrisbay Jan 15, 2020
eeb70c5
Renames displayAllEvents > displayEvents
chrisbay Jan 22, 2020
5099d9b
Adds EventDetails class w/ one-to-one relationship to Event
chrisbay Jan 24, 2020
6e94b9e
Adds persistent Tag class
chrisbay Jan 24, 2020
9a27b17
Establishes many-to-many relationship
chrisbay Jan 24, 2020
ffeb8d9
Adds m2m features to UI
chrisbay Jan 24, 2020
978cca6
use spring boot 2.4.4, java 11, gradle 6.3
CarlyLanglois Apr 14, 2021
b496910
Merge branch 'starter2.4' into abstract-entity2.4
CarlyLanglois Apr 23, 2021
17ceddb
Merge branch 'abstract-entity2.4' into many-to-many-features2.4
CarlyLanglois May 3, 2021
e6e872e
Merge pull request #41 from LaunchCodeEducation/many-to-many-features2.4
CarlyLanglois May 3, 2021
bbf8320
Class 17 Exercise
wreed3 Mar 14, 2022
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,20 @@
package org.launchcode.codingevents.controllers;

import org.launchcode.codingevents.data.EventCategoryRepository;
import org.launchcode.codingevents.data.EventRepository;
import org.launchcode.codingevents.data.TagRepository;
import org.launchcode.codingevents.models.Event;
import org.launchcode.codingevents.models.EventCategory;
import org.launchcode.codingevents.models.Tag;
import org.launchcode.codingevents.models.dto.EventTagDTO;
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;
import java.util.Optional;

/**
* Created by Chris Bay
Expand All @@ -17,25 +23,127 @@
@RequestMapping("events")
public class EventController {

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

@Autowired
private EventCategoryRepository eventCategoryRepository;

@Autowired
private TagRepository tagRepository;

@GetMapping
public String displayAllEvents(Model model) {
model.addAttribute("title", "All Events");
model.addAttribute("events", events);
public String displayEvents(@RequestParam(required = false) Integer categoryId, Model model, @RequestParam(required = false) Integer tagId) {

if (categoryId == null & tagId == null) {
model.addAttribute("title", "All Events");
model.addAttribute("events", eventRepository.findAll());
} else {
Optional<Tag> output = tagRepository.findById(tagId);
if (output.isPresent()){
Tag tag = output.get();
model.addAttribute("title", "Events by Tag: " + tag.getName());
model.addAttribute("events", tag.getEvents());
} else {
Optional<EventCategory> result = eventCategoryRepository.findById(categoryId);
if (result.isEmpty()) {
model.addAttribute("title", "Invalid Category ID: " + categoryId);
} else {
EventCategory category = result.get();
model.addAttribute("title", "Events in category: " + category.getName());
model.addAttribute("events", category.getEvents());
}
}
}

return "events/index";
}

@GetMapping("create")
public String displayCreateEventForm(Model model) {
model.addAttribute("title", "Create Event");
model.addAttribute(new Event());
model.addAttribute("categories", eventCategoryRepository.findAll());
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:";
}

@GetMapping("detail")
public String displayEventDetails(@RequestParam Integer eventId, Model model) {

Optional<Event> result = eventRepository.findById(eventId);

if (result.isEmpty()) {
model.addAttribute("title", "Invalid Event ID: " + eventId);
} else {
Event event = result.get();
model.addAttribute("title", event.getName() + " Details");
model.addAttribute("event", event);
model.addAttribute("tags", event.getTags());
}

return "events/detail";
}

// responds to /events/add-tag?eventId=13
@GetMapping("add-tag")
public String displayAddTagForm(@RequestParam Integer eventId, Model model){
Optional<Event> result = eventRepository.findById(eventId);
Event event = result.get();
model.addAttribute("title", "Add Tag to: " + event.getName());
model.addAttribute("tags", tagRepository.findAll());
EventTagDTO eventTag = new EventTagDTO();
eventTag.setEvent(event);
model.addAttribute("eventTag", eventTag);
return "events/add-tag.html";
}

@PostMapping("add-tag")
public String processAddTagForm(@ModelAttribute @Valid EventTagDTO eventTag,
Errors errors,
Model model){

if (!errors.hasErrors()) {
Event event = eventTag.getEvent();
Tag tag = eventTag.getTag();
if (!event.getTags().contains(tag)){
event.addTag(tag);
eventRepository.save(event);
}
return "redirect:detail?eventId=" + event.getId();
}

return "redirect:add-tag";
}

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

import org.launchcode.codingevents.data.TagRepository;
import org.launchcode.codingevents.models.Tag;
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("tags")
public class TagController {

@Autowired
TagRepository tagRepository;

@GetMapping
public String displayTags(Model model) {
model.addAttribute("title", "All Tags");
model.addAttribute("tags", tagRepository.findAll());
return "tags/index";
}

@GetMapping("create")
public String displayCreateTagForm(Model model) {
model.addAttribute("title", "Create Tag");
model.addAttribute(new Tag());
return "tags/create";
}

@PostMapping("create")
public String processCreateTagForm(@ModelAttribute @Valid Tag tag,
Errors errors, Model model) {

if (errors.hasErrors()) {
model.addAttribute("title", "Create Tag");
model.addAttribute(tag);
return "tags/create";
}

tagRepository.save(tag);
return "redirect:";
}
}
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> {
}
12 changes: 12 additions & 0 deletions src/main/java/org/launchcode/codingevents/data/TagRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.launchcode.codingevents.data;

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

/**
* Created by Chris Bay
*/
@Repository
public interface TagRepository extends CrudRepository<Tag, 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);
}

}
Loading