OneCompiler

New Backend Code1

162

===========================================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>