Skip to content

Commit 84c2f98

Browse files
committed
added data relationships & tags
1 parent 3663665 commit 84c2f98

18 files changed

Lines changed: 393 additions & 131 deletions

File tree

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ dependencies {
2121
implementation 'org.springframework.boot:spring-boot-starter-validation'
2222
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2323
implementation 'mysql:mysql-connector-java:8.0.32'
24-
developmentOnly 'org.springframework.boot:spring-boot-devtools'
24+
implementation 'org.jetbrains:annotations:24.0.0'
25+
developmentOnly 'org.springframework.boot:spring-boot-devtools'
2526
testImplementation 'org.springframework.boot:spring-boot-starter-test'
2627
}
2728

Lines changed: 59 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
package org.launchcode.codingevents.controllers;
22

33
import jakarta.validation.Valid;
4-
import org.launchcode.codingevents.data.EventData;
4+
import org.launchcode.codingevents.data.EventCategoryRepository;
55
import org.launchcode.codingevents.data.EventRepository;
66
import org.launchcode.codingevents.models.Event;
7-
import org.launchcode.codingevents.models.EventType;
7+
import org.launchcode.codingevents.models.EventCategory;
8+
import org.launchcode.codingevents.models.dto.EventTagDTO;
89
import org.springframework.beans.factory.annotation.Autowired;
910
import org.springframework.stereotype.Controller;
10-
import org.springframework.validation.Errors;
1111
import org.springframework.web.bind.annotation.*;
1212
import org.springframework.ui.Model;
13+
import org.springframework.validation.Errors;
1314

14-
import java.util.ArrayList;
15-
import java.util.List;
15+
import java.util.Optional;
1616

1717
/**
1818
* Created by Chris Bay
@@ -24,51 +24,52 @@ public class EventController {
2424
@Autowired
2525
private EventRepository eventRepository;
2626

27+
@Autowired
28+
private EventCategoryRepository eventCategoryRepository;
29+
2730
@GetMapping
28-
public String displayAllEvents(Model model) {
29-
model.addAttribute("title", "All Events");
30-
model.addAttribute("events", eventRepository.findAll());
31+
public String displayEvents(@RequestParam(required = false) Integer categoryId, Model model) {
32+
33+
if (categoryId == null) {
34+
model.addAttribute("title", "All Events");
35+
model.addAttribute("events", eventRepository.findAll());
36+
} else {
37+
Optional<EventCategory> result = eventCategoryRepository.findById(categoryId);
38+
if (result.isEmpty()) {
39+
model.addAttribute("title", "Invalid Category ID: " + categoryId);
40+
} else {
41+
EventCategory category = result.get();
42+
model.addAttribute("title", "Events in category: " + category.getName());
43+
model.addAttribute("events", category.getEvents());
44+
}
45+
}
46+
3147
return "events/index";
3248
}
3349

3450
@GetMapping("create")
3551
public String displayCreateEventForm(Model model) {
3652
model.addAttribute("title", "Create Event");
3753
model.addAttribute(new Event());
38-
model.addAttribute("types", EventType.values());
54+
model.addAttribute("categories", eventCategoryRepository.findAll());
3955
return "events/create";
4056
}
4157

4258
@PostMapping("create")
43-
public String processCreateEventForm(@ModelAttribute @Valid Event newEvent, Errors errors, Model model) {
59+
public String processCreateEventForm(@ModelAttribute @Valid Event newEvent,
60+
Errors errors, Model model) {
4461
if(errors.hasErrors()) {
4562
model.addAttribute("title", "Create Event");
4663
return "events/create";
4764
}
48-
eventRepository.save(newEvent);
49-
return "redirect:/events";
50-
}
5165

52-
@GetMapping("edit/{eventId}")
53-
public String displayEditForm(Model model, @PathVariable int eventId){
54-
Event eventToEdit = EventData.getById(eventId);
55-
model.addAttribute("event", eventToEdit);
56-
String title = "Edit Event " + eventToEdit.getName() + " (id=" + eventToEdit.getId() + ")";
57-
model.addAttribute("title", title );
58-
return "events/edit";
59-
}
60-
61-
@PostMapping("edit")
62-
public String processEditForm(int eventId, String name, String description) {
63-
Event eventToEdit = EventData.getById(eventId);
64-
eventToEdit.setName(name);
65-
eventToEdit.setDescription(description);
66+
eventRepository.save(newEvent);
6667
return "redirect:/events";
6768
}
6869

6970
@GetMapping("delete")
70-
public String renderDeleteEventForm(Model model) {
71-
model.addAttribute("title", "Delete Event");
71+
public String displayDeleteEventForm(Model model) {
72+
model.addAttribute("title", "Delete Events");
7273
model.addAttribute("events", eventRepository.findAll());
7374
return "events/delete";
7475
}
@@ -82,7 +83,35 @@ public String processDeleteEventsForm(@RequestParam(required = false) int[] even
8283
}
8384
}
8485

85-
return "redirect:";
86+
return "redirect:/events";
87+
}
88+
89+
@GetMapping("detail")
90+
public String displayEventDetails(@RequestParam Integer eventId, Model model) {
91+
92+
Optional<Event> result = eventRepository.findById(eventId);
93+
94+
if (result.isEmpty()) {
95+
model.addAttribute("title", "Invalid Event ID: " + eventId);
96+
} else {
97+
Event event = result.get();
98+
model.addAttribute("title", event.getName() + " Details");
99+
model.addAttribute("event", event);
100+
}
101+
102+
return "events/detail";
103+
}
104+
@GetMapping("add-tag")
105+
public String displayAddTagForm(@RequestParam Integer eventId, Model model){
106+
Optional<Event> result = eventRepository.findById(eventId);
107+
Event event = result.get();
108+
model.addAttribute("title", "Add Tag to: " + event.getName());
109+
model.addAttribute("tags", tagRepository.findAll());
110+
EventTagDTO eventTag = new EventTagDTO();
111+
eventTag.setEvent(event);
112+
model.addAttribute("eventTag", eventTag);
113+
return "events/add-tag.html";
86114
}
87115

116+
88117
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.launchcode.codingevents.controllers;
2+
3+
import jakarta.validation.Valid;
4+
import org.launchcode.codingevents.data.TagRepository;
5+
import org.launchcode.codingevents.models.Tag;
6+
import org.springframework.beans.factory.annotation.Autowired;
7+
import org.springframework.stereotype.Controller;
8+
import org.springframework.validation.Errors;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.ModelAttribute;
11+
import org.springframework.web.bind.annotation.PostMapping;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.ui.Model;
14+
15+
/**
16+
* Created by Chris Bay
17+
*/
18+
@Controller
19+
@RequestMapping("tags")
20+
public class TagController {
21+
22+
@Autowired
23+
TagRepository tagRepository;
24+
25+
@GetMapping
26+
public String displayTags(Model model) {
27+
model.addAttribute("title", "All Tags");
28+
model.addAttribute("tags", tagRepository.findAll());
29+
return "tags/index";
30+
}
31+
32+
@GetMapping("create")
33+
public String displayCreateTagForm(Model model) {
34+
model.addAttribute("title", "Create Tag");
35+
model.addAttribute(new Tag());
36+
return "tags/create";
37+
}
38+
39+
@PostMapping("create")
40+
public String processCreateTagForm(@ModelAttribute @Valid Tag tag,
41+
Errors errors, Model model) {
42+
43+
if (errors.hasErrors()) {
44+
model.addAttribute("title", "Create Tag");
45+
model.addAttribute(tag);
46+
return "tags/create";
47+
}
48+
49+
tagRepository.save(tag);
50+
return "redirect:/tags";
51+
}
52+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.launchcode.codingevents.data;
2+
3+
import org.launchcode.codingevents.models.Tag;
4+
import org.springframework.data.repository.CrudRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
/**
8+
* Created by Chris Bay
9+
*/
10+
@Repository
11+
public interface TagRepository extends CrudRepository<Tag, Integer> {
12+
}

src/main/java/org/launchcode/codingevents/models/AbstractEntity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@
88
import java.util.Objects;
99

1010
@MappedSuperclass
11+
//fields need to be available to tables
1112
public abstract class AbstractEntity {
1213

1314
@Id
1415
@GeneratedValue
1516
private int id;
1617

17-
public int getId() {
18+
public int getId() {
1819
return id;
1920
}
2021

21-
2222
@Override
2323
public boolean equals(Object o) {
2424
if (this == o) return true;

src/main/java/org/launchcode/codingevents/models/Event.java

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package org.launchcode.codingevents.models;
22

3-
import jakarta.persistence.Entity;
4-
import jakarta.persistence.GeneratedValue;
5-
import jakarta.persistence.Id;
3+
import jakarta.persistence.*;
4+
import jakarta.validation.Valid;
65
import jakarta.validation.constraints.Email;
76
import jakarta.validation.constraints.NotBlank;
7+
import jakarta.validation.constraints.NotNull;
88
import jakarta.validation.constraints.Size;
9-
import java.util.Objects;
9+
10+
import java.util.ArrayList;
11+
import java.util.List;
1012

1113
@Entity
1214
public class Event extends AbstractEntity{
@@ -15,23 +17,24 @@ public class Event extends AbstractEntity{
1517
@Size(min = 3, max = 50, message = "Name must be more than 3 characters and less than 50 characters.")
1618
private String name;
1719

18-
@Size(max = 100, message ="Description too long.")
19-
private String description;
20+
@OneToOne(cascade = CascadeType.ALL)
21+
@Valid
22+
@NotNull
23+
private EventDetails eventDetails;
2024

21-
@NotBlank(message ="Contact email is required.")
22-
@Email(message = "Not a valid email.")
23-
private String contactEmail;
25+
@ManyToOne
26+
@NotNull(message = "Category is required")
27+
private EventCategory eventCategory;
2428

25-
private EventType type;
29+
@ManyToMany
30+
private final List<Tag> tags = new ArrayList<>();
2631

2732
public Event() {
2833
}
2934

30-
public Event(String name, String description, String contactEmail, EventType type) {
35+
public Event(String name, EventCategory eventCategory) {
3136
this.name = name;
32-
this.description = description;
33-
this.contactEmail = contactEmail;
34-
this.type = type;
37+
this.eventCategory = eventCategory;
3538
}
3639

3740
public String getName() {
@@ -42,28 +45,28 @@ public void setName(String name) {
4245
this.name = name;
4346
}
4447

45-
public String getDescription() {
46-
return description;
48+
public EventCategory getEventCategory() {
49+
return eventCategory;
4750
}
4851

49-
public void setDescription(String description) {
50-
this.description = description;
52+
public void setEventCategory(EventCategory eventCategory) {
53+
this.eventCategory = eventCategory;
5154
}
5255

53-
public String getContactEmail() {
54-
return contactEmail;
56+
public EventDetails getEventDetails() {
57+
return eventDetails;
5558
}
5659

57-
public void setContactEmail(String contactEmail) {
58-
this.contactEmail = contactEmail;
60+
public void setEventDetails(EventDetails eventDetails) {
61+
this.eventDetails = eventDetails;
5962
}
6063

61-
public EventType getType() {
62-
return type;
64+
public List<Tag> getTags() {
65+
return tags;
6366
}
6467

65-
public void setType(EventType type) {
66-
this.type = type;
68+
public void addTag(Tag tag) {
69+
this.tags.add(tag);
6770
}
6871

6972
@Override

src/main/java/org/launchcode/codingevents/models/EventCategory.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
package org.launchcode.codingevents.models;
22

33
import jakarta.persistence.Entity;
4-
import jakarta.persistence.GeneratedValue;
5-
import jakarta.persistence.Id;
4+
import jakarta.persistence.OneToMany;
65
import jakarta.validation.constraints.Size;
76

8-
import java.util.Objects;
7+
import java.util.ArrayList;
8+
import java.util.List;
99

1010

1111
@Entity
1212
public class EventCategory extends AbstractEntity{
1313

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

17+
@OneToMany(mappedBy = "eventCategory")
18+
private final List<Event> events = new ArrayList<>();
19+
1720
public EventCategory(@Size(min = 3, message = "Name must be at least 3 characters long") String name) {
1821
this.name = name;
1922
}
@@ -28,6 +31,10 @@ public void setName(String name) {
2831
this.name = name;
2932
}
3033

34+
public List<Event> getEvents() {
35+
return events;
36+
}
37+
3138
@Override
3239
public String toString() {
3340
return name;

0 commit comments

Comments
 (0)