Skip to content

Commit f95ecfc

Browse files
This next update consists of working on the member class, making a joint table memberclasses and setting up the many to many relationship with classes, the data type of date changed back to string as that was causing problems with data in the database previously there, and we discussed how to prevent cyclic dependencies through json backward and management annotations.
1 parent c9bc026 commit f95ecfc

File tree

9 files changed

+384
-4
lines changed

9 files changed

+384
-4
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.example.easynotes.constants;
2+
3+
public enum AppUser {
4+
ADMIN,
5+
EMPLOYEE,
6+
MEMBER
7+
}
8+
d
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package com.example.easynotes.controller;
2+
import com.example.easynotes.model.*;
3+
4+
import com.example.easynotes.repository.ClassesRepository;
5+
import com.example.easynotes.repository.MemberClassRepository;
6+
import com.example.easynotes.repository.MemberRepository;
7+
import com.example.easynotes.repository.FeedbackRepository;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.web.bind.annotation.*;
10+
import org.springframework.http.ResponseEntity;
11+
import org.springframework.http.HttpStatus;
12+
13+
import java.util.HashMap;
14+
import java.util.List;
15+
import java.util.Optional;
16+
import java.util.Map;
17+
@RestController
18+
@RequestMapping("/api/members")
19+
public class MemberController {
20+
21+
@Autowired
22+
private MemberRepository memberRepository;
23+
24+
@Autowired
25+
private ClassesRepository classesRepository;
26+
27+
@Autowired
28+
private MemberClassRepository memberClassRepository;
29+
30+
@Autowired
31+
private FeedbackRepository feedbackRepository;
32+
33+
34+
// GET all members
35+
@GetMapping
36+
public List<Member> getAllMembers() {
37+
return memberRepository.findAll();
38+
}
39+
40+
@GetMapping("/mapClass/{memberId}/{classId}")
41+
public HashMap getClassesById(@PathVariable Long memberId, @PathVariable Long classId) {
42+
Optional<Member> member = memberRepository.findById(memberId);
43+
Optional<Classes> classesData = classesRepository.findById(classId);
44+
if (classesData.isPresent() && member.isPresent()) {
45+
MemberClass memberClass = new MemberClass();
46+
memberClass.setMember(member.get());
47+
memberClass.setClasses(classesData.get());
48+
MemberClass memberClasses = memberClassRepository.save(memberClass);
49+
HashMap hashMap = new HashMap();
50+
hashMap.put("memberID", memberClasses.getMember().getMemberId());
51+
hashMap.put("classID", memberClasses.getClasses().getClassID());
52+
hashMap.put("mappingId", memberClasses.getId());
53+
return hashMap;
54+
}
55+
return null;
56+
}
57+
58+
@GetMapping("/{memberId}")
59+
public Optional<Member> getMemberById(@PathVariable Long memberId) {
60+
return memberRepository.findById(memberId);
61+
}
62+
63+
64+
// POST create a new member
65+
@PostMapping
66+
public Member createMember(@RequestBody Member member) {
67+
return memberRepository.save(member);
68+
}
69+
70+
// DELETE a member by ID, including associated MemberClass entries
71+
@DeleteMapping("/{memberId}")
72+
public void deleteMember(@PathVariable Long memberId) {
73+
memberRepository.deleteById(memberId);
74+
}
75+
// Endpoint to add feedback for a specific member
76+
77+
@PostMapping("/{memberId}/feedback")
78+
public Feedback addFeedback(@PathVariable Long memberId, @RequestBody Feedback feedback) {
79+
Member member = memberRepository.findById(memberId)
80+
.orElseThrow(() -> new RuntimeException("Member not found"));
81+
82+
feedback.setMember(member); // Link feedback to the member
83+
return feedbackRepository.save(feedback);
84+
}
85+
86+
// Endpoint to retrieve feedback for a specific member
87+
@GetMapping("/{memberId}/feedback")
88+
public List<Feedback> getMemberFeedback(@PathVariable Long memberId) {
89+
Member member = memberRepository.findById(memberId)
90+
.orElseThrow(() -> new RuntimeException("Member not found"));
91+
92+
return member.getFeedback(); // Assumes getFeedback() returns List<Feedback>
93+
}
94+
95+
// POST: Assign a member to a class
96+
// POST: Assign a member to a class
97+
@PostMapping("/classes")
98+
public ResponseEntity<?> assignClassToMember(@RequestBody Map<String, Long> body) {
99+
try {
100+
// Retrieve memberId and classId from the request body
101+
Long memberId = body.get("memberId");
102+
Long classId = body.get("classId");
103+
104+
// Check if either memberId or classId is missing in the request
105+
if (memberId == null || classId == null) {
106+
return ResponseEntity.badRequest().body("Error: 'memberId' and 'classId' are required.");
107+
}
108+
109+
// Find the Member by ID, throw an exception if not found
110+
Member member = memberRepository.findById(memberId)
111+
.orElseThrow(() -> new RuntimeException("Member with ID " + memberId + " not found."));
112+
113+
// Find the Class by ID, throw an exception if not found
114+
Classes classes = classesRepository.findById(classId)
115+
.orElseThrow(() -> new RuntimeException("Class with ID " + classId + " not found."));
116+
117+
// Create the MemberClass relationship and set Member and Class
118+
MemberClass memberClass = new MemberClass();
119+
memberClass.setMember(member);
120+
memberClass.setClasses(classes);
121+
122+
// Save the MemberClass relationship to the database
123+
MemberClass savedMemberClass = memberClassRepository.save(memberClass);
124+
125+
// Return a success response with the saved object
126+
return ResponseEntity.ok(savedMemberClass);
127+
128+
} catch (Exception e) {
129+
e.printStackTrace();
130+
// Handle unexpected errors, such as database issues
131+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("An unexpected error occurred: " + e.getMessage());
132+
}
133+
}
134+
135+
}

‎src/main/java/com/example/easynotes/model/Classes.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.time.LocalDate;
77
import java.util.ArrayList;
88
import java.util.List;
9+
import com.fasterxml.jackson.annotation.JsonIgnore;
910

1011
@Entity
1112
public class Classes {
@@ -20,15 +21,20 @@ public class Classes {
2021
@Column(columnDefinition = "TEXT")
2122
private String classDescription;
2223

23-
@JsonFormat(pattern = "yyyy-MM-dd")
24-
private LocalDate classSchedule;
24+
private String classSchedule;
2525

2626
private Integer maximumCapacity;
2727

2828
@OneToMany(mappedBy = "classes", cascade = CascadeType.ALL, orphanRemoval = true)
2929
private List<EmployeeClass> employeeClass = new ArrayList<>();
3030

3131

32+
@OneToMany(mappedBy = "classes", cascade = CascadeType.ALL, orphanRemoval = true)
33+
@JsonIgnore
34+
private List<MemberClass> memberClass = new ArrayList<>();
35+
36+
37+
3238
public long getClassID() {
3339
return classID;
3440
}
@@ -53,11 +59,11 @@ public void setClassDescription(String classDescription) {
5359
this.classDescription = classDescription;
5460
}
5561

56-
public LocalDate getClassSchedule() {
62+
public String getClassSchedule() {
5763
return classSchedule;
5864
}
5965

60-
public void setClassSchedule(LocalDate classSchedule) {
66+
public void setClassSchedule(String classSchedule) {
6167
this.classSchedule = classSchedule;
6268
}
6369

@@ -76,5 +82,9 @@ public List<EmployeeClass> getEmployeeClass() {
7682
public void setEmployeeClass(List<EmployeeClass> employeeClass) {
7783
this.employeeClass = employeeClass;
7884
}
85+
86+
public List<MemberClass> getMemberClass() {return memberClass;}
87+
88+
public void setMemberClass(List<MemberClass> memberClass) {this.memberClass = memberClass;}
7989
}
8090

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.example.easynotes.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonBackReference;
4+
import com.fasterxml.jackson.annotation.JsonIgnore;
5+
6+
import javax.persistence.Column;
7+
import javax.persistence.GeneratedValue;
8+
import javax.persistence.GenerationType;
9+
import javax.persistence.Id;
10+
11+
import javax.persistence.*;
12+
13+
@Entity
14+
public class Feedback {
15+
16+
@Id
17+
@GeneratedValue(strategy = GenerationType.IDENTITY)
18+
private Long feedbackID;
19+
20+
@Column(columnDefinition = "TEXT")
21+
private String feedbackText;
22+
23+
// Many feedbacks can be associated with one member
24+
@ManyToOne
25+
@JoinColumn(name = "member_id", nullable = false)
26+
@JsonBackReference
27+
private Member member;
28+
29+
// Getters and Setters
30+
public Long getFeedbackID() {
31+
return feedbackID;
32+
}
33+
34+
public void setFeedbackID(Long feedbackID) {
35+
this.feedbackID = feedbackID;
36+
}
37+
38+
public String getFeedbackText() {
39+
return feedbackText;
40+
}
41+
42+
public void setFeedbackText(String feedbackText) {
43+
this.feedbackText = feedbackText;
44+
}
45+
46+
public Member getMember() {
47+
return member;
48+
}
49+
50+
public void setMember(Member member) {
51+
this.member = member;
52+
}
53+
}
54+
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package com.example.easynotes.model;
2+
3+
import javax.persistence.*;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import com.example.easynotes.model.Feedback;
7+
import com.fasterxml.jackson.annotation.JsonIgnore;
8+
import com.fasterxml.jackson.annotation.JsonManagedReference;
9+
10+
11+
@Entity
12+
public class Member {
13+
14+
@Id
15+
@GeneratedValue(strategy = GenerationType.IDENTITY)
16+
private Long memberId;
17+
18+
private String name;
19+
private String contactNumber;
20+
private String emailAddress;
21+
private String address;
22+
private String membershipStatus;
23+
24+
25+
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL, orphanRemoval = true)
26+
@JsonManagedReference
27+
private List<Feedback> feedbacks;
28+
29+
public List<Feedback> getFeedback() {
30+
return feedbacks;
31+
}
32+
33+
public void setFeedbacks(List<Feedback> feedbacks) {
34+
this.feedbacks = feedbacks;
35+
}
36+
@OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
37+
@JsonManagedReference
38+
private List<MemberClass> memberClasses = new ArrayList<>();
39+
40+
// Getters and Setters
41+
public Long getMemberId() {
42+
return memberId;
43+
}
44+
45+
public void setMemberId(Long memberId) {
46+
this.memberId = memberId;
47+
}
48+
49+
public String getName() {
50+
return name;
51+
}
52+
53+
public void setName(String name) {
54+
this.name = name;
55+
}
56+
57+
public String getContactNumber() {
58+
return contactNumber;
59+
}
60+
61+
public void setContactNumber(String contactNumber) {
62+
this.contactNumber = contactNumber;
63+
}
64+
65+
public String getEmailAddress() {
66+
return emailAddress;
67+
}
68+
69+
public void setEmailAddress(String emailAddress) {
70+
this.emailAddress = emailAddress;
71+
}
72+
73+
public String getAddress() {
74+
return address;
75+
}
76+
77+
public void setAddress(String address) {
78+
this.address = address;
79+
}
80+
81+
public String getMembershipStatus() {
82+
return membershipStatus;
83+
}
84+
85+
public void setMembershipStatus(String membershipStatus) {
86+
this.membershipStatus = membershipStatus;
87+
}
88+
89+
public List<MemberClass> getMemberClasses() {
90+
return memberClasses;
91+
}
92+
93+
public void setMemberClasses(List<MemberClass> memberClasses) {
94+
this.memberClasses = memberClasses;
95+
}
96+
}

0 commit comments

Comments
 (0)