New Backend Code1
===========================================Model Layer==================================================
//package com.example.OepAchievers.Model;
//
//import com.fasterxml.jackson.annotation.JsonIgnore;
//import jakarta.persistence.*;
//import java.math.BigDecimal;
//import java.util.HashSet;
//import java.util.List;
//import java.util.Set;
//import java.util.Objects;
//
//@Entity
//@Table(name = "courses")
//public class Course {
// @Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
// private Long id;
//
// @Column(nullable = false)
// private String title;
//
// @Column(length = 1000)
// private String description;
//
// private BigDecimal price;
//
// @ManyToMany(fetch = FetchType.EAGER)
// @JoinColumn(name = "instructor_id")
// private Set<User> instructor ;
//
// @Enumerated(EnumType.STRING)
// private CourseStatus status = CourseStatus.DRAFT;
//
// @OneToMany(mappedBy = "course", cascade = CascadeType.ALL)
// @JsonIgnore
// private Set<Enrollment> enrollments = new HashSet<>();
//
// public enum CourseStatus {
// DRAFT, PUBLISHED, ARCHIVED
// }
//
// // Getters
// public Long getId() {
// return id;
// }
//
// public String getTitle() {
// return title;
// }
//
// public String getDescription() {
// return description;
// }
//
// public BigDecimal getPrice() {
// return price;
// }
//
// public Set<User> getInstructor() {
// return instructor;
// }
//
// public CourseStatus getStatus() {
// return status;
// }
//
// public Set<Enrollment> getEnrollments() {
// return enrollments;
// }
//
// // Setters
// public void setId(Long id) {
// this.id = id;
// }
//
// public void setTitle(String title) {
// this.title = title;
// }
//
// public void setDescription(String description) {
// this.description = description;
// }
//
// public void setPrice(BigDecimal price) {
// this.price = price;
// }
//
// public void setInstructor(Set<User> instructor) {
// this.instructor = instructor;
// }
//
// public void setStatus(CourseStatus status) {
// this.status = status;
// }
//
// public void setEnrollments(Set<Enrollment> enrollments) {
// this.enrollments = enrollments;
// }
//
//// @Override
//// public boolean equals(Object o) {
//// if (this == o) return true;
//// if (!(o instanceof Course)) return false;
//// Course course = (Course) o;
//// return Objects.equals(id, course.id);
//// }
////
//// @Override
//// public int hashCode() {
//// return Objects.hash(id);
//// }
//}
package com.example.OepAchievers.Model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;
import java.util.Objects;
@Entity
@Table(name = "courses")
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Column(length = 1000)
private String description;
private BigDecimal price;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "instructor_id")
@JsonIgnoreProperties({"coursesTeaching", "enrollments", "hibernateLazyInitializer", "handler"})
private User instructor;
@Enumerated(EnumType.STRING)
private CourseStatus status = CourseStatus.DRAFT;
@OneToMany(mappedBy = "course", cascade = CascadeType.ALL)
@JsonIgnoreProperties("course")
private Set<Enrollment> enrollments = new HashSet<>();
public enum CourseStatus {
DRAFT, PUBLISHED, ARCHIVED
}
// Constructors
public Course() {}
public Course(String title, String description, BigDecimal price, User instructor) {
this.title = title;
this.description = description;
this.price = price;
this.instructor = instructor;
}
// Getters
public Long getId() {
return id;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
public BigDecimal getPrice() {
return price;
}
public User getInstructor() {
return instructor;
}
public CourseStatus getStatus() {
return status;
}
public Set<Enrollment> getEnrollments() {
return enrollments;
}
// Setters
public void setId(Long id) {
this.id = id;
}
public void setTitle(String title) {
this.title = title;
}
public void setDescription(String description) {
this.description = description;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public void setInstructor(User instructor) {
this.instructor = instructor;
}
public void setStatus(CourseStatus status) {
this.status = status;
}
public void setEnrollments(Set<Enrollment> enrollments) {
this.enrollments = enrollments;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Course)) return false;
Course course = (Course) o;
return Objects.equals(id, course.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
package com.example.OepAchievers.Model;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.List;
//@Entity
//@Table(name="security")
public class CustomUsers implements UserDetails {
private final User user;
public final List<GrantedAuthority> authorities;
public CustomUsers(User user) {
this.user = user;
this.authorities = List.of(new SimpleGrantedAuthority(user.getRole().name()));
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getUsername();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
// @Id
// private String username;
// private String password;
//
// public String getUsername() {
// return username;
// }
//
// public void setUsername(String username) {
// this.username = username;
// }
//
// public String getPassword() {
// return password;
// }
//
// public void setPassword(String password) {
// this.password = password;
// }
}
//package com.example.OepAchievers.Model;
//
//import com.fasterxml.jackson.annotation.JsonIgnore;
//import jakarta.persistence.*;
//import java.time.LocalDateTime;
//import java.util.Objects;
//
//@Entity
//@Table(name = "enrollments")
//public class Enrollment {
// @Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
// private Long id;
//
//
// @ManyToOne(fetch = FetchType.LAZY)
// @JoinColumn(name = "student_id")
// private User student;
//
// @ManyToOne(fetch = FetchType.LAZY)
// @JoinColumn(name = "course_id")
// private Course course;
//
// @Column(nullable = false)
// private LocalDateTime enrollmentDate = LocalDateTime.now();
//
// @Enumerated(EnumType.STRING)
// private EnrollmentStatus status = EnrollmentStatus.ACTIVE;
//
// private Double progress = 0.0;
//
// public enum EnrollmentStatus {
// ACTIVE, COMPLETED, DROPPED
// }
//
// // Getters
// public Long getId() {
// return id;
// }
//
// public User getStudent() {
// return student;
// }
//
// public Course getCourse() {
// return course;
// }
//
// public LocalDateTime getEnrollmentDate() {
// return enrollmentDate;
// }
//
// public EnrollmentStatus getStatus() {
// return status;
// }
//
// public Double getProgress() {
// return progress;
// }
//
// // Setters
// public void setId(Long id) {
// this.id = id;
// }
//
// public void setStudent(User student) {
// this.student = student;
// }
//
// public void setCourse(Course course) {
// this.course = course;
// }
//
// public void setEnrollmentDate(LocalDateTime enrollmentDate) {
// this.enrollmentDate = enrollmentDate;
// }
//
// public void setStatus(EnrollmentStatus status) {
// this.status = status;
// }
//
// public void setProgress(Double progress) {
// this.progress = progress;
// }
//
// @Override
// public boolean equals(Object o) {
// if (this == o) return true;
// if (!(o instanceof Enrollment)) return false;
// Enrollment that = (Enrollment) o;
// return Objects.equals(id, that.id);
// }
//
// @Override
// public int hashCode() {
// return Objects.hash(id);
// }
//}
package com.example.OepAchievers.Model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import java.time.LocalDateTime;
import java.util.Objects;
@Entity
@Table(name = "enrollments")
public class Enrollment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "student_id")
@JsonIgnoreProperties({"enrollments", "coursesTeaching", "hibernateLazyInitializer", "handler"})
private User student;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "course_id")
@JsonIgnoreProperties({"enrollments", "instructor", "hibernateLazyInitializer", "handler"})
private Course course;
@Column(nullable = false)
private LocalDateTime enrollmentDate = LocalDateTime.now();
@Enumerated(EnumType.STRING)
private EnrollmentStatus status = EnrollmentStatus.ACTIVE;
private Double progress = 0.0;
public enum EnrollmentStatus {
ACTIVE, COMPLETED, DROPPED
}
// Constructors
public Enrollment() {}
public Enrollment(User student, Course course) {
this.student = student;
this.course = course;
}
// Getters
public Long getId() {
return id;
}
public User getStudent() {
return student;
}
public Course getCourse() {
return course;
}
public LocalDateTime getEnrollmentDate() {
return enrollmentDate;
}
public EnrollmentStatus getStatus() {
return status;
}
public Double getProgress() {
return progress;
}
// Setters
public void setId(Long id) {
this.id = id;
}
public void setStudent(User student) {
this.student = student;
}
public void setCourse(Course course) {
this.course = course;
}
public void setEnrollmentDate(LocalDateTime enrollmentDate) {
this.enrollmentDate = enrollmentDate;
}
public void setStatus(EnrollmentStatus status) {
this.status = status;
}
public void setProgress(Double progress) {
this.progress = progress;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Enrollment)) return false;
Enrollment that = (Enrollment) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
//package com.example.OepAchievers.Model;
//
//import com.fasterxml.jackson.annotation.JsonIgnore;
//import jakarta.persistence.Embeddable;
//import java.io.Serializable;
//import java.util.Objects;
//
//@Embeddable
//public class EnrollmentId implements Serializable {
// private Long studentId;
// private String courseId;
//
// public EnrollmentId() {}
//
// public EnrollmentId(Long studentId, String courseId) {
// this.studentId = studentId;
// this.courseId = courseId;
// }
//
// // Getters
// public Long getStudentId() {
// return studentId;
// }
//
// public String getCourseId() {
// return courseId;
// }
//
// // Setters
// public void setStudentId(Long studentId) {
// this.studentId = studentId;
// }
//
// public void setCourseId(String courseId) {
// this.courseId = courseId;
// }
//
// @Override
// public boolean equals(Object o) {
// if (this == o) return true;
// if (!(o instanceof EnrollmentId)) return false;
// EnrollmentId that = (EnrollmentId) o;
// return Objects.equals(studentId, that.studentId) &&
// Objects.equals(courseId, that.courseId);
// }
//
// @Override
// public int hashCode() {
// return Objects.hash(studentId, courseId);
// }
//}
package com.example.OepAchievers.Model;
import jakarta.persistence.Embeddable;
import java.io.Serializable;
import java.util.Objects;
@Embeddable
public class EnrollmentId implements Serializable {
private Long studentId;
private String courseId;
// Constructors
public EnrollmentId() {}
public EnrollmentId(Long studentId, String courseId) {
this.studentId = studentId;
this.courseId = courseId;
}
// Getters
public Long getStudentId() {
return studentId;
}
public String getCourseId() {
return courseId;
}
// Setters
public void setStudentId(Long studentId) {
this.studentId = studentId;
}
public void setCourseId(String courseId) {
this.courseId = courseId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof EnrollmentId)) return false;
EnrollmentId that = (EnrollmentId) o;
return Objects.equals(studentId, that.studentId) &&
Objects.equals(courseId, that.courseId);
}
@Override
public int hashCode() {
return Objects.hash(studentId, courseId);
}
}
//package com.example.OepAchievers.Model;
//
//import com.fasterxml.jackson.annotation.JsonIgnore;
//import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
//import jakarta.persistence.*;
//import java.util.HashSet;
//import java.util.Set;
//import java.util.Objects;
//
//@Entity
//@Table(name = "users")
//public class User {
// @Id
// @GeneratedValue(strategy = GenerationType.IDENTITY)
// private Long id;
//
// @Column(nullable = false, unique = true)
// private String email;
//
// @Column(nullable = false)
// private String password;
//
// @Column(nullable = false)
// private String username;
//
// @Enumerated(EnumType.STRING)
// private Role role;
//
// private boolean active = true;
//
//
//// @OneToMany(mappedBy = "instructor")
//// @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
// private Set<Course> coursesTeaching = new HashSet<>();
//
// @OneToMany(mappedBy = "student")
// @JsonIgnore
// private Set<Enrollment> enrollments = new HashSet<>();
//
//
// public enum Role {
// STUDENT, INSTRUCTOR, ADMIN,
// }
//
// // Getters
// public Long getId() {
// return id;
// }
//
// public String getEmail() {
// return email;
// }
//
// public String getPassword() {
// return password;
// }
//
// public String getusername() {
// return username;
// }
//
// public Role getRole() {
// return role;
// }
//
// public boolean isActive() {
// return active;
// }
//
// public Set<Course> getCoursesTeaching() {
// return coursesTeaching;
// }
//
// public Set<Enrollment> getEnrollments() {
// return enrollments;
// }
//
// // Setters
// public void setId(Long id) {
// this.id = id;
// }
//
// public void setEmail(String email) {
// this.email = email;
// }
//
// public void setPassword(String password) {
// this.password = password;
// }
//
// public void setusername(String username) {
// this.username = username;
// }
//
// public void setRole(Role role) {
// this.role = role;
// }
//
// public void setActive(boolean active) {
// this.active = active;
// }
//
// public void setCoursesTeaching(Set<Course> coursesTeaching) {
// this.coursesTeaching = coursesTeaching;
// }
//
// public void setEnrollments(Set<Enrollment> enrollments) {
// this.enrollments = enrollments;
// }
//
// @Override
// public boolean equals(Object o) {
// if (this == o) return true;
// if (!(o instanceof User)) return false;
// User user = (User) o;
// return Objects.equals(id, user.id);
// }
//
// @Override
// public int hashCode() {
// return Objects.hash(id);
// }
//}
package com.example.OepAchievers.Model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import java.util.HashSet;
import java.util.Set;
import java.util.Objects;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String email;
private String password;
private String username;
@Enumerated(EnumType.STRING)
private Role role;
private boolean active = true;
@OneToMany(mappedBy = "instructor")
// @JsonIgnoreProperties({"instructor", "enrollments"})
private Set<Course> coursesTeaching = new HashSet<>();
@OneToMany(mappedBy = "student")
// @JsonIgnoreProperties("student")
private Set<Enrollment> enrollments = new HashSet<>();
public enum Role {
STUDENT, INSTRUCTOR, ADMIN
}
// Constructors
public User() {}
public User(String email, String password, String username, Role role) {
this.email = email;
this.password = password;
this.username = username;
this.role = role;
}
// Getters
public Long getId() {
return id;
}
public String getEmail() {
return email;
}
public String getPassword() {
return password;
}
public String getUsername() {
return username;
}
public Role getRole() {
return role;
}
public boolean isActive() {
return active;
}
public Set<Course> getCoursesTeaching() {
return coursesTeaching;
}
public Set<Enrollment> getEnrollments() {
return enrollments;
}
// Setters
public void setId(Long id) {
this.id = id;
}
public void setEmail(String email) {
this.email = email;
}
public void setPassword(String password) {
this.password = password;
}
public void setUsername(String username) {
this.username = username;
}
public void setRole(Role role) {
this.role = role;
}
public void setActive(boolean active) {
this.active = active;
}
public void setCoursesTeaching(Set<Course> coursesTeaching) {
this.coursesTeaching = coursesTeaching;
}
public void setEnrollments(Set<Enrollment> enrollments) {
this.enrollments = enrollments;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return Objects.equals(id, user.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", email='" + email + '\'' +
", password='" + password + '\'' +
", username='" + username + '\'' +
", role=" + role +
", active=" + active +
", coursesTeaching=" + coursesTeaching +
", enrollments=" + enrollments +
'}';
}
}
============================================Request Layer============================================
package com.example.OepAchievers.Request;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Positive;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class CourseRequest {
@NotBlank
private String title;
private String description;
@Positive
private BigDecimal price;
}
package com.example.OepAchievers.Request;
import lombok.Data;
import org.antlr.v4.runtime.misc.NotNull;
@Data
public class EnrollmentRequest {
@NotNull
private Long studentId;
@NotNull
private Long courseId;
}
package com.example.OepAchievers.Request;
import com.example.OepAchievers.Model.User;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class RegisterUserRequest {
@NotBlank
private String fullName;
@Email
@NotBlank
private String email;
@NotBlank
private String password;
private User.Role role = User.Role.STUDENT;
private User.Role rule = User.Role.INSTRUCTOR;
private User.Role rle = User.Role.ADMIN;
}
=======================================Controller Layer=============================================
package com.example.OepAchievers.Controller;
import com.example.OepAchievers.Model.Course;
import com.example.OepAchievers.Service.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/courses")
public class CourseController {
@Autowired
private CourseService courseService;
@PostMapping
public ResponseEntity<Course> createCourse(@RequestBody Course course) {
return ResponseEntity.ok(courseService.createCourse(course));
}
@GetMapping("/{id}")
public ResponseEntity<Course> getCourse(@PathVariable Long id) {
return ResponseEntity.ok(courseService.getCourseById(id));
}
@GetMapping("/published")
public ResponseEntity<List<Course>> getPublishedCourses() {
return ResponseEntity.ok(courseService.getPublishedCourses());
}
@PutMapping("/{id}/status")
public ResponseEntity<Course> updateCourseStatus(
@PathVariable Long id,
@RequestParam Course.CourseStatus status) {
Course course = courseService.getCourseById(id);
course.setStatus(status);
return ResponseEntity.ok(courseService.createCourse(course));
}
}
package com.example.OepAchievers.Controller;
import com.example.OepAchievers.Model.Enrollment;
import com.example.OepAchievers.Service.EnrollmentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/enrollments")
public class EnrollmentController {
@Autowired
private EnrollmentService enrollmentService;
@PostMapping
public ResponseEntity<Enrollment> enrollInCourse(@RequestBody Enrollment enrollment) {
return ResponseEntity.ok(enrollmentService.enroll(enrollment));
}
@GetMapping("/student/{studentId}")
public ResponseEntity<List<Enrollment>> getStudentEnrollments (Long studentId) {
return ResponseEntity.ok(enrollmentService.getStudentEnrollments(studentId));
}
@PutMapping("/{id}/progress")
public ResponseEntity<Void> updateProgress(
@PathVariable Long id,
@RequestParam Double progress) {
enrollmentService.updateProgress(id, progress);
return ResponseEntity.ok().build();
}
}
package com.example.OepAchievers.Controller;
import com.example.OepAchievers.Model.User;
import com.example.OepAchievers.Service.UserServ;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserServ userService;
@PostMapping("/register")
public ResponseEntity<User> registerUser(@RequestBody User user) {
return ResponseEntity.ok(userService.createUser(user));
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
}
====================================================Service==========================================
package com.example.OepAchievers.Service;
import com.example.OepAchievers.Model.Course;
import com.example.OepAchievers.Repository.CourseRepository;
import jakarta.persistence.EntityNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CourseService {
@Autowired
private CourseRepository courseRepository;
public Course createCourse(Course course) {
return courseRepository.save(course);
}
public Course getCourseById(Long id) {
return courseRepository.findById(id).get();
// .orElseThrow(() -> new EntityNotFoundException("Course not found"));
}
public List<Course> getPublishedCourses() {
return courseRepository.findByStatus(Course.CourseStatus.PUBLISHED);
}
}
package com.example.OepAchievers.Service;
import com.example.OepAchievers.Model.CustomUsers;
import com.example.OepAchievers.Model.User;
import com.example.OepAchievers.Repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class CustomUserDetailsService implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Optional<User> user=userRepository.findByUsername(username);
return new CustomUsers(user.get());
}
// @Autowired
// private UsersRepository userRepository;
//
// @Override
// public UserDetails loadUserByUsername(String username,CustomUsers customUsers) throws UsernameNotFoundException {
// System.out.println("Attempting to load user: " + username);
//
// Optional<User> user = Optional.ofNullable(userRepository.findByUsername(username)
// .orElseThrow(() -> new UsernameNotFoundException("User not found: " + username)));
//
//
//
// return new CustomUsers(user);
// }
}
package com.example.OepAchievers.Service;
import com.example.OepAchievers.Model.Enrollment;
import com.example.OepAchievers.Repository.EnrollmentRepository;
import jakarta.persistence.EntityNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EnrollmentService {
@Autowired
private EnrollmentRepository enrollmentRepository;
public Enrollment enroll(Enrollment enrollment) {
if (enrollmentRepository.existsByStudentIdAndCourseId(
enrollment.getStudent().getId(),
enrollment.getCourse().getId())) {
throw new RuntimeException("Student already enrolled in this course");
}
return enrollmentRepository.save(enrollment);
}
public List<Enrollment> getStudentEnrollments(Long studentId) {
return enrollmentRepository.findByStudentId(studentId);
}
public void updateProgress(Long enrollmentId, Double progress) {
Enrollment enrollment = enrollmentRepository.findById(enrollmentId)
.orElseThrow(() -> new EntityNotFoundException("Enrollment not found"));
enrollment.setProgress(progress);
if (progress >= 100.0) {
enrollment.setStatus(Enrollment.EnrollmentStatus.COMPLETED);
}
enrollmentRepository.save(enrollment);
}
}
package com.example.OepAchievers.Service;
import com.example.OepAchievers.Model.User;
import com.example.OepAchievers.Repository.UserRepository;
import jakarta.persistence.EntityNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@Service
public class UserServ {
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
public User createUser(User user) {
if (userRepository.existsByEmail(user.getEmail())) {
throw new RuntimeException("Email already exists");
}
user.setPassword(passwordEncoder.encode(user.getPassword()));
userRepository.save(user);
return user;
}
public User getUserById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new EntityNotFoundException("User not found"));
}
// @Bean
// public PasswordEncoder passwordEncoder() {
// return new BCryptPasswordEncoder();
// }
}
======================================Security Config================================================
package com.example.OepAchievers;
import com.example.OepAchievers.Service.CustomUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Autowired
private CustomUserDetailsService userDetailsService;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http,CustomUserDetailsService customUserDetailsService) throws Exception {
http
.csrf(csrf -> csrf.disable())
//.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.authorizeHttpRequests(auth -> auth
//.requestMatchers("/api/auth/**").permitAll()
.requestMatchers("/api/users/**").permitAll()
// .requestMatchers("/api/users/register").permitAll()
.anyRequest().authenticated()
)
// .formLogin(form -> form
// .loginProcessingUrl("/api/auth/login")
// .successHandler((request, response, authentication) -> {
// System.out.println("Login successful for user: " + authentication.getName());
// response.setContentType("application/json");
// response.getWriter().write("{"message":"Login successful", "role":"" +
// authentication.getAuthorities().iterator().next().getAuthority() + ""}");
// })
// .failureHandler((request, response, exception) -> {
// System.out.println("Login failed: " + exception.getMessage());
// response.setContentType("application/json");
// response.setStatus(401);
// response.getWriter().write("{"error":"" + exception.getMessage() + ""}");
// })
// )
.userDetailsService(customUserDetailsService)
.httpBasic(Customizer.withDefaults());
return http.build();
}
// @Bean
// public CorsConfigurationSource corsConfigurationSource() {
// CorsConfiguration configuration = new CorsConfiguration();
// configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
// configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
// configuration.setAllowedHeaders(Arrays.asList(""));
// configuration.setExposedHeaders(Arrays.asList(""));
// configuration.setAllowCredentials(true);
//
// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// source.registerCorsConfiguration("/**", configuration);
// return source;
// }
// @Bean
// public DaoAuthenticationProvider authenticationProvider() {
// DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
// authProvider.setUserDetailsService(userDetailsService);
// authProvider.setPasswordEncoder(passwordEncoder());
// return authProvider;
// }
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
===========================================Repository================================================
package com.example.OepAchievers.Repository;
import com.example.OepAchievers.Model.Course;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface CourseRepository extends JpaRepository<Course, Long> {
List<Course> findByInstructorId(Long instructorId);
List<Course> findByStatus(Course.CourseStatus status);
}
package com.example.OepAchievers.Repository;
import com.example.OepAchievers.Model.Enrollment;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface EnrollmentRepository extends JpaRepository<Enrollment, Long> {
List<Enrollment> findByStudentId(Long studentId);
List<Enrollment> findByCourseId(Long courseId);
boolean existsByStudentIdAndCourseId(Long studentId, Long courseId);
}
package com.example.OepAchievers.Repository;
import com.example.OepAchievers.Model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
boolean existsByEmail(String email);
}
=========================================Application Layer===========================================
package com.example.OepAchievers;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class OepAchieversApplication {
public static void main(String[] args) {
SpringApplication.run(OepAchieversApplication.class, args);
}
}
====================================Application Properties===========================================
spring.application.name=OepAchievers
spring.datasource.driver-class-name = org.postgresql.Driver
spring.security.user.name=jagadish
spring.security.user.password=939273
spring.datasource.url=jdbc:postgresql://localhost:5432/newdb
spring.datasource.username=postgres
spring.datasource.password=Anand@201
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
server.port=8081
spring.main.allow-circular-references=true
========================================poxml========================================================
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>OepAchievers</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>OepAchievers</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>23</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>3.4.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>