Index: ckend/src/main/java/com/shifterwebapp/shifter/GenericMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/GenericMapper.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package com.shifterwebapp.shifter;
-
-import com.shifterwebapp.shifter.review.Review;
-import com.shifterwebapp.shifter.review.ReviewDto;
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-
-import java.util.List;
-
-public interface GenericMapper<E, D> {
-
-    D toDto(E entity);
-    List<D> toDto(List<E> entities);
-
-    E toEntity(D dto);
-    List<E> toEntity(List<D> reviews);
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/Validate.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/Validate.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/Validate.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -3,7 +3,9 @@
 import com.shifterwebapp.shifter.course.CourseRepository;
 import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
+import com.shifterwebapp.shifter.exception.UnauthorizedException;
 import com.shifterwebapp.shifter.payment.PaymentRepository;
 import com.shifterwebapp.shifter.user.UserRepository;
 import lombok.RequiredArgsConstructor;
+import org.springframework.security.core.Authentication;
 import org.springframework.stereotype.Component;
 
@@ -28,4 +30,11 @@
     }
 
+    public void validateUserIsAuthenticated(Authentication authentication) {
+        if (authentication == null || !authentication.isAuthenticated() || authentication.getName() == null) {
+            throw new UnauthorizedException("User is not authenticated");
+        }
+    }
+
+
     public void validateCourseExists(Long courseId) {
         if (!courseRepository.existsById(courseId)) {
Index: backend/src/main/java/com/shifterwebapp/shifter/auth/AuthService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/AuthService.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/auth/AuthService.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -66,5 +66,5 @@
                 )
         );
-        User user = userService.getUserByEmail(request.getEmail());
+        User user = userService.getUserEntityByEmail(request.getEmail());
         sendTokens(response, user);
     }
@@ -86,5 +86,5 @@
 
         String userEmail = jwtService.extractUsername(refreshToken);
-        User user = userService.getUserByEmail(userEmail);
+        User user = userService.getUserEntityByEmail(userEmail);
 
         if (!jwtService.isTokenValid(refreshToken, user)) {
Index: backend/src/main/java/com/shifterwebapp/shifter/auth/CustomAuthDetails.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/CustomAuthDetails.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ backend/src/main/java/com/shifterwebapp/shifter/auth/CustomAuthDetails.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,17 @@
+package com.shifterwebapp.shifter.auth;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CustomAuthDetails {
+    private final Long userId;
+    private final Object webDetails;
+
+    public CustomAuthDetails(Long userId, Object webDetails) {
+        this.userId = userId;
+        this.webDetails = webDetails;
+    }
+
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/config/JwtAuthFilter.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/JwtAuthFilter.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/config/JwtAuthFilter.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -2,4 +2,5 @@
 
 
+import com.shifterwebapp.shifter.auth.CustomAuthDetails;
 import jakarta.servlet.FilterChain;
 import jakarta.servlet.ServletException;
@@ -43,8 +44,13 @@
             UserDetails userDetails = userDetailsService.loadUserByUsername(userEmail);
             if (jwtService.isTokenValid(jwt, userDetails)) {
+                Long userId = jwtService.extractUserId(jwt);
+
                 UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
-                authToken.setDetails(
-                        new WebAuthenticationDetailsSource().buildDetails(request)
-                );
+
+                Object webDetails = new WebAuthenticationDetailsSource().buildDetails(request);
+
+                CustomAuthDetails customDetails = new CustomAuthDetails(userId, webDetails);
+                authToken.setDetails(customDetails);
+
                 SecurityContextHolder.getContext().setAuthentication(authToken);
             }
Index: backend/src/main/java/com/shifterwebapp/shifter/config/JwtService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/config/JwtService.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/config/JwtService.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -1,4 +1,6 @@
 package com.shifterwebapp.shifter.config;
 
+import com.shifterwebapp.shifter.user.User;
+import com.shifterwebapp.shifter.user.UserRepository;
 import io.jsonwebtoken.*;
 import io.jsonwebtoken.security.Keys;
@@ -6,4 +8,5 @@
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
 
@@ -20,7 +23,9 @@
 
     private final String SECRET_KEY;
+    private final UserRepository userRepository;
 
-    public JwtService(@Value("${jwt.secret}") String secretKey) {
+    public JwtService(@Value("${jwt.secret}") String secretKey, UserRepository userRepository) {
         this.SECRET_KEY = secretKey;
+        this.userRepository = userRepository;
     }
 
@@ -32,5 +37,11 @@
     // Generate Access Token
     public String generateToken(UserDetails userDetails) {
-        return createToken(new HashMap<>(), userDetails.getUsername());
+        User user = userRepository.findByEmail(userDetails.getUsername())
+                .orElseThrow(() -> new UsernameNotFoundException("User not found"));
+
+        Map<String, Object> claims = new HashMap<>();
+        claims.put("userId", user.getId());
+
+        return createToken(claims, userDetails.getUsername());
     }
 
@@ -77,4 +88,9 @@
     }
 
+    public Long extractUserId(String token) {
+        Claims claims = extractAllClaims(token);
+        return claims.get("userId", Long.class);
+    }
+
     // Extract single claim
     public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -4,8 +4,12 @@
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.auth.CustomAuthDetails;
 import com.shifterwebapp.shifter.course.service.CourseService;
+import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
 import com.shifterwebapp.shifter.enums.Difficulty;
 import com.shifterwebapp.shifter.enums.Interests;
 import com.shifterwebapp.shifter.enums.Skills;
+import com.shifterwebapp.shifter.exception.ErrorResponse;
 import com.shifterwebapp.shifter.user.User;
 import com.shifterwebapp.shifter.user.service.UserService;
@@ -25,5 +29,5 @@
 
     private final CourseService courseService;
-    private final UserService userService;
+    private final EnrollmentService enrollmentService;
 
     @GetMapping
@@ -34,8 +38,8 @@
             @RequestParam(required = false, name = "duration") List<String> durations,
             @RequestParam(required = false, name = "skill") List<Skills> skills,
-            @RequestParam(required = false, name = "topic") List<Interests> topics
+            @RequestParam(required = false, name = "topic") List<Interests> topics,
+            Authentication authentication
             ) throws JsonProcessingException {
         Specification<Course> spec = null;
-
 
         if (search != null && !search.isEmpty()) {
@@ -63,4 +67,16 @@
         }
 
+        Object detailsObj = authentication.getDetails();
+        if (!(detailsObj instanceof CustomAuthDetails details)) {
+            return ResponseEntity.badRequest().body(new ErrorResponse("Invalid authentication details"));
+        }
+        Long userId = details.getUserId();
+
+        List<Long> enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
+
+        if (enrolledCourseIds != null && !enrolledCourseIds.isEmpty()) {
+            spec = (spec == null) ? CourseSpecification.idNotIn(enrolledCourseIds) : spec.and(CourseSpecification.idNotIn(enrolledCourseIds));
+        }
+
         List<CourseDtoPreview> courseDtos = courseService.getAllCourses(spec);
         return ResponseEntity.ok(courseDtos);
@@ -75,11 +91,11 @@
         }
 
-        String userEmail = authentication.getName();
-        User user = userService.getUserByEmail(userEmail);
+        Object detailsObj = authentication.getDetails();
+        if (!(detailsObj instanceof CustomAuthDetails details)) {
+            return ResponseEntity.badRequest().body(new ErrorResponse("Invalid authentication details"));
+        }
+        Long userId = details.getUserId();
 
-        List<Skills> userSkills = user.getSkills();
-        List<Interests> userInterests = user.getInterests();
-
-        List<CourseDtoPreview> recommendedCourses = courseService.getRecommendedCourses(userSkills, userInterests);
+        List<CourseDtoPreview> recommendedCourses = courseService.getRecommendedCourses(userId);
         return ResponseEntity.ok(recommendedCourses);
     }
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -103,3 +103,7 @@
         };
     }
+
+    public static Specification<Course> idNotIn(List<Long> enrolledCourseIds) {
+        return (root, query, cb) -> root.get("id").in(enrolledCourseIds).not();
+    }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -4,7 +4,11 @@
 import com.shifterwebapp.shifter.course.*;
 import com.shifterwebapp.shifter.coursecontent.CourseContentMapper;
+import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
 import com.shifterwebapp.shifter.enums.Difficulty;
 import com.shifterwebapp.shifter.enums.Interests;
 import com.shifterwebapp.shifter.enums.Skills;
+import com.shifterwebapp.shifter.user.User;
+import com.shifterwebapp.shifter.user.UserDto;
+import com.shifterwebapp.shifter.user.service.UserService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.data.jpa.domain.Specification;
@@ -21,5 +25,7 @@
     private final CourseMapperPreview courseMapperPreview;
     private final CourseMapperDetail courseMapperDetail;
+    private final UserService userService;
     private final Validate validate;
+    private final EnrollmentService enrollmentService;
 
     @Override
@@ -32,16 +38,27 @@
 
     @Override
-    public List<CourseDtoPreview> getRecommendedCourses(List<Skills> skills, List<Interests> interests) {
+    public List<CourseDtoPreview> getRecommendedCourses(Long userId) {
+        UserDto user = userService.getUserById(userId);
+        List<Skills> skills = user.getSkills();
+        List<Interests> interests = user.getInterests();
+
+        List<Long> enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
+
         List<Course> courses = courseRepository.findAll();
 
+        List<Course> filteredCourses = courses
+                .stream()
+                .filter(course -> !enrolledCourseIds.contains(course.getId()))
+                .toList();
+
         List<ScoredCourse> scoredCourses = new ArrayList<>();
-        for (Course course : courses) {
+        for (Course course : filteredCourses) {
             boolean matchesSkills = course.getSkillsGained().stream().anyMatch(skills::contains);
-            boolean matchesInterests = course.getWhatWillBeLearned().stream().anyMatch(interests::contains);
+            boolean matchesTopics = course.getTopicsCovered().stream().anyMatch(interests::contains);
 
             int score = 0;
-            if (matchesSkills && matchesInterests) {
+            if (matchesSkills && matchesTopics) {
                 score += 2;
-            } else if (matchesSkills || matchesInterests) {
+            } else if (matchesSkills || matchesTopics) {
                 score += 1;
             }
@@ -89,4 +106,10 @@
 
     @Override
+    public Course getCourseEntityById(Long courseId) {
+        validate.validateCourseExists(courseId);
+        return courseRepository.findById(courseId).orElseThrow();
+    }
+
+    @Override
     public List<Interests> getAllTopics() {
         return courseRepository.getCourseTopics();
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -13,8 +13,9 @@
 public interface ImplCourseService {
     List<CourseDtoPreview> getAllCourses(Specification<Course> specification);
-    List<CourseDtoPreview> getRecommendedCourses(List<Skills> skills, List<Interests> topics);
+    List<CourseDtoPreview> getRecommendedCourses(Long userId);
     List<CourseDtoPreview> getTopRatedCourses();
     List<CourseDtoPreview> getMostPopularCourses();
     CourseDtoDetail getCourseById(Long id);
+    Course getCourseEntityById(Long courseId);
 
     List<Interests> getAllTopics();
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentController.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentController.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,61 @@
+package com.shifterwebapp.shifter.enrollment;
+
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.auth.CustomAuthDetails;
+import com.shifterwebapp.shifter.course.CourseDtoPreview;
+import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
+import com.shifterwebapp.shifter.exception.ErrorResponse;
+import com.shifterwebapp.shifter.payment.service.PaymentService;
+import com.shifterwebapp.shifter.user.User;
+import com.shifterwebapp.shifter.user.UserRepository;
+import com.shifterwebapp.shifter.user.service.UserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Optional;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("${api.base.path}/enrollments")
+public class EnrollmentController {
+
+    private final EnrollmentService enrollmentService;
+    private final Validate validate;
+
+    @PostMapping("/create/{courseId}")
+    public ResponseEntity<?> enrollUserInCourse(@PathVariable Long courseId, Authentication authentication) {
+        validate.validateUserIsAuthenticated(authentication);
+
+        CustomAuthDetails details = (CustomAuthDetails) authentication.getDetails();
+        Long userId = details.getUserId();
+
+        EnrollmentDto enrollmentDto = enrollmentService.enrollUser(courseId, userId);
+        if (enrollmentDto == null) {
+            return ResponseEntity.badRequest().body(new ErrorResponse("Enrollment failed"));
+        }
+        return ResponseEntity.ok(enrollmentDto);
+    }
+
+    @GetMapping("/user")
+    public ResponseEntity<?> getEnrollmentsByUser(Authentication authentication) {
+        validate.validateUserIsAuthenticated(authentication);
+
+        Object detailsObj = authentication.getDetails();
+        if (!(detailsObj instanceof CustomAuthDetails details)) {
+            return ResponseEntity.badRequest().body(new ErrorResponse("Invalid authentication details"));
+        }
+        Long userId = details.getUserId();
+
+        List<EnrollmentDto> enrollmentDtos = enrollmentService.getEnrollmentsByUser(userId);
+        return ResponseEntity.ok(enrollmentDtos);
+    }
+
+    @GetMapping("/{enrollmentId}")
+    public ResponseEntity<?> getEnrollmentById(@PathVariable Long enrollmentId) {
+        EnrollmentDto enrollmentDto = enrollmentService.getEnrollmentById(enrollmentId);
+        return ResponseEntity.ok(enrollmentDto);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -13,6 +13,4 @@
 public class EnrollmentDto {
 
-    private Long id;
-
     private EnrollmentStatus enrollmentStatus;
 
@@ -20,4 +18,6 @@
 
     private Date date;
+
+    private Long courseId;
 }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentMapper.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentMapper.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -3,4 +3,5 @@
 import org.mapstruct.InheritInverseConfiguration;
 import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
 
 import java.util.List;
@@ -9,4 +10,5 @@
 public interface EnrollmentMapper {
 
+    @Mapping(source = "course.id", target = "courseId")
     EnrollmentDto toDto(Enrollment enrollment);
     List<EnrollmentDto> toDto(List<Enrollment> enrollment);
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -12,4 +12,7 @@
     List<Enrollment> findEnrollmentsByUser(@Param("userId") Long userId);
 
+    @Query("select e.course.id from Enrollment e where e.payment.user.id = :userId")
+    List<Long> getCourseIdsByUserEnrollments(@Param("userId") Long userId);
+
     @Query("select e from Enrollment e where e.course.id = :courseId")
     List<Enrollment> findEnrollmentsByCourse(@Param("courseId") Long courseId);
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -4,14 +4,15 @@
 import com.shifterwebapp.shifter.course.Course;
 import com.shifterwebapp.shifter.course.CourseRepository;
+import com.shifterwebapp.shifter.course.service.CourseService;
 import com.shifterwebapp.shifter.enrollment.Enrollment;
 import com.shifterwebapp.shifter.enrollment.EnrollmentDto;
 import com.shifterwebapp.shifter.enrollment.EnrollmentMapper;
 import com.shifterwebapp.shifter.enrollment.EnrollmentRepository;
-import com.shifterwebapp.shifter.enums.EnrollmentStatus;
-import com.shifterwebapp.shifter.enums.PointsConstants;
-import com.shifterwebapp.shifter.enums.Skills;
+import com.shifterwebapp.shifter.enums.*;
+import com.shifterwebapp.shifter.exception.AlreadyEnrolledException;
+import com.shifterwebapp.shifter.exception.PaymentNotCompleteException;
 import com.shifterwebapp.shifter.payment.Payment;
 import com.shifterwebapp.shifter.payment.PaymentRepository;
-import com.shifterwebapp.shifter.enums.PaymentStatus;
+import com.shifterwebapp.shifter.payment.service.PaymentService;
 import com.shifterwebapp.shifter.user.service.UserService;
 import lombok.RequiredArgsConstructor;
@@ -27,6 +28,6 @@
     private final EnrollmentRepository enrollmentRepository;
     private final CourseRepository courseRepository;
-    private final PaymentRepository paymentRepository;
     private final UserService userService;
+    private final PaymentService paymentService;
     private final EnrollmentMapper enrollmentMapper;
     private final Validate validate;
@@ -44,4 +45,10 @@
         List<Enrollment> enrollment = enrollmentRepository.findEnrollmentsByUser(userId);
         return enrollmentMapper.toDto(enrollment);
+    }
+
+    @Override
+    public List<Long> getCourseIdsByUserEnrollments(Long userId) {
+        validate.validateCourseExists(userId);
+        return enrollmentRepository.getCourseIdsByUserEnrollments(userId);
     }
 
@@ -64,19 +71,17 @@
 
     @Override
-    public EnrollmentDto enrollUser(Long courseId, Long paymentId) {
+    public EnrollmentDto enrollUser(Long courseId, Long userId) {
         validate.validateCourseExists(courseId);
-        validate.validatePaymentExists(paymentId);
+        validate.validateUserExists(userId);
 
-        Payment payment = paymentRepository.findById(paymentId).orElseThrow();
+        boolean isAlreadyEnrolled = enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId);
+        if (isAlreadyEnrolled) {
+            throw new AlreadyEnrolledException("User with ID " + userId + " is already enrolled in course with ID " + courseId + "!");
+        }
+
+        Payment payment = paymentService.initiatePayment(userId, courseId, PaymentMethod.CASYS);
 
         if (payment.getPaymentStatus() != PaymentStatus.COMPLETED) {
-            throw new RuntimeException("Payment with ID " + paymentId + " is not completed successfully!");
-        }
-
-        Long userId = payment.getUser().getId();
-        validate.validateUserExists(userId);
-        boolean isAlreadyEnrolled = enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId);
-        if (isAlreadyEnrolled) {
-            throw new RuntimeException("user with ID " + userId + " is already enrolled in course with ID " + courseId + "!");
+            throw new PaymentNotCompleteException("Payment with ID " + payment.getId() + " is not completed successfully!");
         }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -1,4 +1,5 @@
 package com.shifterwebapp.shifter.enrollment.service;
 
+import com.shifterwebapp.shifter.enrollment.Enrollment;
 import com.shifterwebapp.shifter.enrollment.EnrollmentDto;
 import com.shifterwebapp.shifter.enums.EnrollmentStatus;
@@ -9,8 +10,9 @@
     EnrollmentDto getEnrollmentById(Long enrollmentId);
     List<EnrollmentDto> getEnrollmentsByUser(Long userId);
+    List<Long> getCourseIdsByUserEnrollments(Long userId);
     List<EnrollmentDto> getEnrollmentsByCourse(Long courseId);
     EnrollmentDto getEnrollmentByUserAndCourse(Long userId, Long courseId);
 
-    EnrollmentDto enrollUser(Long courseId, Long paymentId);
+    EnrollmentDto enrollUser(Long courseId, Long userId);
 
     Boolean isUserEnrolledInCourse(Long userId, Long courseId);
Index: backend/src/main/java/com/shifterwebapp/shifter/exception/AlreadyEnrolledException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/AlreadyEnrolledException.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ backend/src/main/java/com/shifterwebapp/shifter/exception/AlreadyEnrolledException.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,7 @@
+package com.shifterwebapp.shifter.exception;
+
+public class AlreadyEnrolledException extends RuntimeException {
+    public AlreadyEnrolledException(String message) {
+        super(message);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/exception/ErrorResponse.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/ErrorResponse.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ backend/src/main/java/com/shifterwebapp/shifter/exception/ErrorResponse.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,10 @@
+package com.shifterwebapp.shifter.exception;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ErrorResponse {
+    private String message;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ backend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,18 @@
+package com.shifterwebapp.shifter.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+
+@ControllerAdvice
+public class GlobalExceptionHandler {
+
+    @ExceptionHandler(RuntimeException.class)
+    public ResponseEntity<ErrorResponse> handleRuntimeException(RuntimeException ex) {
+        // You can customize based on exception message or type
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ErrorResponse(ex.getMessage()));
+    }
+
+    // You can add more handlers for different exception types if needed
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/exception/PaymentNotCompleteException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/PaymentNotCompleteException.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ backend/src/main/java/com/shifterwebapp/shifter/exception/PaymentNotCompleteException.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,7 @@
+package com.shifterwebapp.shifter.exception;
+
+public class PaymentNotCompleteException extends RuntimeException {
+    public PaymentNotCompleteException(String message) {
+        super(message);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/exception/UnauthorizedException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/UnauthorizedException.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ backend/src/main/java/com/shifterwebapp/shifter/exception/UnauthorizedException.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,7 @@
+package com.shifterwebapp.shifter.exception;
+
+public class UnauthorizedException extends RuntimeException {
+    public UnauthorizedException(String message) {
+        super(message);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -1,4 +1,5 @@
 package com.shifterwebapp.shifter.payment.service;
 
+import com.shifterwebapp.shifter.payment.Payment;
 import com.shifterwebapp.shifter.payment.PaymentDto;
 import com.shifterwebapp.shifter.enums.PaymentMethod;
@@ -16,5 +17,5 @@
     Boolean hasUserPaidForCourse(Long userId, Long courseId);
 
-    PaymentDto initiatePayment(Long userId, Long courseId, PaymentMethod paymentMethod);
+    Payment initiatePayment(Long userId, Long courseId, PaymentMethod paymentMethod);
     PaymentDto completePayment(Long paymentId);
     PaymentDto failPayment(Long paymentId);
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -19,4 +19,5 @@
 import java.util.Date;
 import java.util.List;
+import java.util.NoSuchElementException;
 
 @Service
@@ -71,29 +72,19 @@
 
     @Override
-    public PaymentDto initiatePayment(Long userId, Long courseId, PaymentMethod paymentMethod) {
-        validate.validateUserExists(userId);
-        validate.validateCourseExists(courseId);
-
+    public Payment initiatePayment(Long userId, Long courseId, PaymentMethod paymentMethod) {
         User user = userRepository.findById(userId).orElseThrow();
         Course course = courseRepository.findById(courseId).orElseThrow();
 
-        boolean isAlreadyEnrolled = enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId);
-        if (isAlreadyEnrolled) {
-            throw new RuntimeException("User with ID " + userId + " is already enrolled in course with ID " + courseId + " and cannot initiate payment!");
-        }
+        // PAYMENT CODE (CASYS) HERE !!!!!!!!!
 
-        // PAYMENT CODE (CASYS) HERE !!!!!!!!!
         Payment payment = Payment.builder()
-                .paymentStatus(PaymentStatus.PENDING)
+                .amount(course.getPrice())
+                .date(new Date())
                 .paymentMethod(paymentMethod)
-                .date(new Date())
+                .paymentStatus(PaymentStatus.COMPLETED)
                 .user(user)
-                .enrollment(new Enrollment())
-                .amount(course.getPrice())
                 .build();
 
-        paymentRepository.save(payment);
-
-        return paymentMapper.toDto(payment);
+        return paymentRepository.save(payment);
     }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/user/User.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -32,4 +32,5 @@
     private String name;
 
+    @Column(unique = true, nullable = false)
     private String email;
     
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -1,7 +1,10 @@
 package com.shifterwebapp.shifter.user;
 
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.auth.CustomAuthDetails;
 import com.shifterwebapp.shifter.enums.CompanyType;
 import com.shifterwebapp.shifter.enums.Interests;
 import com.shifterwebapp.shifter.enums.Skills;
+import com.shifterwebapp.shifter.exception.ErrorResponse;
 import com.shifterwebapp.shifter.user.service.UserService;
 import lombok.RequiredArgsConstructor;
@@ -12,8 +15,22 @@
 @RequiredArgsConstructor
 @RestController
-@RequestMapping("${api.base.path}/user")
+@RequestMapping("${api.base.path}/users")
 public class UserController {
 
     private final UserService userService;
+    private final Validate validate;
+
+    @PutMapping("/favorite-course/{courseId}")
+    public ResponseEntity<?> toggleFavoriteCourse(@PathVariable Integer courseId, Authentication authentication) {
+        validate.validateUserIsAuthenticated(authentication);
+        Object detailsObj = authentication.getDetails();
+        if (!(detailsObj instanceof CustomAuthDetails details)) {
+            return ResponseEntity.badRequest().body(new ErrorResponse("Invalid authentication details"));
+        }
+        Long userId = details.getUserId();
+
+        UserDto userDto = userService.toggleFavoriteCourse(userId, courseId);
+        return ResponseEntity.ok(userDto);
+    }
 
     @GetMapping("/{userId}")
@@ -77,11 +94,4 @@
     }
 
-    @PutMapping("/favorite-course/{courseId}")
-    public ResponseEntity<?> toggleFavoriteCourse(@PathVariable Integer courseId, Authentication authentication) {
-        System.out.println("im here");
-        UserDto userDto = userService.toggleFavoriteCourse(authentication, courseId);
-        return ResponseEntity.ok(userDto);
-    }
-
     @PutMapping("/{userId}/remove/interest")
     public ResponseEntity<?> removeInterest(@PathVariable Long userId, @RequestParam Interests oldInterest) {
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -2,4 +2,6 @@
 
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 
 import java.util.Optional;
@@ -10,3 +12,6 @@
 
     Optional<User> findByEmail(String email);
+
+    @Query("select u.id from User u where u.email = :email")
+    Optional<Long> findUserIdByEmail(@Param("email") String email);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -15,5 +15,6 @@
     List<UserDto> getAllUsers();
     UserDto getUserById(Long id);
-    User getUserByEmail(String email);
+    User getUserEntityById(Long userId);
+    User getUserEntityByEmail(String email);
     Boolean existsUserByEmail(String email);
 
@@ -31,5 +32,5 @@
     UserDto addSkills(Long id, List<Skills> newSkills);
     UserDto addSkillGap(Long id, Skills newSkillGap);
-    UserDto toggleFavoriteCourse(Authentication authentication, Integer newFavoriteCourseId);
+    UserDto toggleFavoriteCourse(Long userId, Integer newFavoriteCourseId);
     UserDto addPoints(Long id, Integer newPointsAchieved);
     UserDto addPayment(Long id, Payment newPayment);
Index: backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -31,15 +31,20 @@
 
     @Override
-    public UserDto getUserById(Long accountId) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
-        return userMapper.toDto(user);
-    }
-
-    @Override
-    public User getUserByEmail(String email) {
+    public UserDto getUserById(Long userId) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public User getUserEntityById(Long userId) {
+        validate.validateUserExists(userId);
+        return userRepository.findById(userId).orElseThrow();
+    }
+
+    @Override
+    public User getUserEntityByEmail(String email) {
         validate.validateUserExists(email);
-        User user = userRepository.findByEmail(email).orElseThrow();
-        return user;
+        return userRepository.findByEmail(email).orElseThrow();
     }
 
@@ -73,13 +78,13 @@
 
     @Override
-    public void deleteUser(Long accountId) {
-        validate.validateUserExists(accountId);
-        userRepository.deleteById(accountId);
-    }
-
-    @Override
-    public UserDto updateName(Long accountId, String newName) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public void deleteUser(Long userId) {
+        validate.validateUserExists(userId);
+        userRepository.deleteById(userId);
+    }
+
+    @Override
+    public UserDto updateName(Long userId, String newName) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         user.setName(newName);
         userRepository.save(user);
@@ -88,7 +93,7 @@
 
     @Override
-    public UserDto updateMail(Long accountId, String newMail) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto updateMail(Long userId, String newMail) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         user.setEmail(newMail);
         userRepository.save(user);
@@ -97,7 +102,7 @@
 
     @Override
-    public UserDto updatePassword(Long accountId, String newPass) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto updatePassword(Long userId, String newPass) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         user.setPasswordHash(passwordEncoder.encode(newPass));
         userRepository.save(user);
@@ -106,7 +111,7 @@
 
     @Override
-    public UserDto updateWorkPosition(Long accountId, String newWorkPosition) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto updateWorkPosition(Long userId, String newWorkPosition) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         user.setWorkPosition(newWorkPosition);
         userRepository.save(user);
@@ -115,7 +120,7 @@
 
     @Override
-    public UserDto updateCompanyType(Long accountId, CompanyType newCompanyType) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto updateCompanyType(Long userId, CompanyType newCompanyType) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         user.setCompanyType(newCompanyType);
         userRepository.save(user);
@@ -124,7 +129,7 @@
 
     @Override
-    public UserDto addInterest(Long accountId, Interests newInterest) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto addInterest(Long userId, Interests newInterest) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         if (!user.getInterests().contains(newInterest)) {
             user.getInterests().add(newInterest);
@@ -135,7 +140,7 @@
 
     @Override
-    public UserDto addSkill(Long accountId, Skills newSkill) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto addSkill(Long userId, Skills newSkill) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         if (!user.getSkills().contains(newSkill)) {
             user.getSkills().add(newSkill);
@@ -146,7 +151,7 @@
 
     @Override
-    public UserDto addSkills(Long accountId, List<Skills> newSkills) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto addSkills(Long userId, List<Skills> newSkills) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         for (Skills skill : newSkills) {
             if (!user.getSkills().contains(skill)) {
@@ -159,7 +164,7 @@
 
     @Override
-    public UserDto addSkillGap(Long accountId, Skills newSkillGap) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto addSkillGap(Long userId, Skills newSkillGap) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         if (!user.getSkillGap().contains(newSkillGap)) {
             user.getSkillGap().add(newSkillGap);
@@ -170,8 +175,6 @@
 
     @Override
-    public UserDto toggleFavoriteCourse(Authentication authentication, Integer newFavoriteCourseId) {
-        String email = authentication.getName();
-        User user = userRepository.findByEmail(email)
-                .orElseThrow(() -> new RuntimeException("User not found"));
+    public UserDto toggleFavoriteCourse(Long userId, Integer newFavoriteCourseId) {
+        User user = getUserEntityById(userId);
 
         if (user.getFavoriteCourses().contains(newFavoriteCourseId)) {
@@ -185,7 +188,7 @@
 
     @Override
-    public UserDto addPoints(Long accountId, Integer newPointsAchieved) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto addPoints(Long userId, Integer newPointsAchieved) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         Integer newPoints = user.getPoints() + newPointsAchieved;
         user.setPoints(newPoints);
@@ -195,7 +198,7 @@
 
     @Override
-    public UserDto addPayment(Long accountId, Payment newPayment) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto addPayment(Long userId, Payment newPayment) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         if (!user.getPayments().contains(newPayment)) {
             user.getPayments().add(newPayment);
@@ -206,7 +209,7 @@
 
     @Override
-    public UserDto removeInterest(Long accountId, Interests removeInterest) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto removeInterest(Long userId, Interests removeInterest) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         if (!user.getInterests().contains(removeInterest)) {
             user.getInterests().remove(removeInterest);
@@ -217,7 +220,7 @@
 
     @Override
-    public UserDto removeSkill(Long accountId, Skills removeSkill) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto removeSkill(Long userId, Skills removeSkill) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         if (!user.getSkills().contains(removeSkill)) {
             user.getSkills().remove(removeSkill);
@@ -228,7 +231,7 @@
 
     @Override
-    public UserDto removeSkillGap(Long accountId, Skills removeSkillGap) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto removeSkillGap(Long userId, Skills removeSkillGap) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         if (!user.getSkillGap().contains(removeSkillGap)) {
             user.getSkillGap().remove(removeSkillGap);
@@ -239,7 +242,7 @@
 
     @Override
-    public UserDto removeSkillGaps(Long accountId, List<Skills> removeSkillGaps) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto removeSkillGaps(Long userId, List<Skills> removeSkillGaps) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         for (Skills skill : removeSkillGaps) {
             if (!user.getSkillGap().contains(skill)) {
@@ -252,7 +255,7 @@
 
     @Override
-    public UserDto removeFavoriteCourse(Long accountId, Integer removeFavoriteCourseId) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto removeFavoriteCourse(Long userId, Integer removeFavoriteCourseId) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         if (!user.getFavoriteCourses().contains(removeFavoriteCourseId)) {
             user.getFavoriteCourses().remove(removeFavoriteCourseId);
@@ -263,7 +266,7 @@
 
     @Override
-    public UserDto removePoints(Long accountId, Integer removePointsAchieved) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto removePoints(Long userId, Integer removePointsAchieved) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         Integer newPoints = user.getPoints() - removePointsAchieved;
         user.setPoints(newPoints);
@@ -273,7 +276,7 @@
 
     @Override
-    public UserDto removePayment(Long accountId, Payment removePayment) {
-        validate.validateUserExists(accountId);
-        User user = userRepository.findById(accountId).orElseThrow();
+    public UserDto removePayment(Long userId, Payment removePayment) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
         if (!user.getPayments().contains(removePayment)) {
             user.getPayments().remove(removePayment);
Index: frontend/src/App.tsx
===================================================================
--- frontend/src/App.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/App.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -11,4 +11,5 @@
 import { ToastContainer } from 'react-toastify';
 import 'react-toastify/dist/ReactToastify.css';
+import AppLoader from "./AppLoader.tsx";
 
 function LayoutWrapper() {
@@ -55,4 +56,5 @@
     return (
         <Router>
+            <AppLoader />
             <ScrollToTop />
             <ToastContainer
Index: frontend/src/AppLoader.tsx
===================================================================
--- frontend/src/AppLoader.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/AppLoader.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,104 @@
+import {useGlobalContext} from "./context/GlobalContext.tsx";
+import {useCourseStorage} from "./context/CourseStorage.ts";
+import {
+    fetchCoursesApi,
+    fetchCoursesSkillsApi,
+    fetchCoursesTopicsApi,
+    fetchRecommendedCoursesApi
+} from "./api/courseApi.ts";
+import {useEffect} from "react";
+import {fetchUserEnrollmentsApi} from "./api/enrollmentApi.ts";
+
+function AppLoader() {
+    const {accessToken} = useGlobalContext();
+    const {
+        setEnrollments,
+        setAllCourses,
+        setRecommendedCourses,
+        setTopics,
+        setSkills
+    } = useCourseStorage();
+
+    useEffect(() => {
+        const load = async () => {
+            try {
+                // Topics
+                try {
+                    const topicsStored = sessionStorage.getItem("courseTopics");
+                    if (topicsStored) {
+                        setTopics(JSON.parse(topicsStored));
+                    } else {
+                        const topics = await fetchCoursesTopicsApi();
+                        setTopics(topics);
+                        sessionStorage.setItem("courseTopics", JSON.stringify(topics));
+                    }
+                } catch (err) {
+                    console.error("Failed to fetch topics:", err);
+                }
+
+                // Skills
+                try {
+                    const skillsStored = sessionStorage.getItem("courseSkills");
+                    if (skillsStored) {
+                        setSkills(JSON.parse(skillsStored));
+                    } else {
+                        const skills = await fetchCoursesSkillsApi();
+                        setSkills(skills);
+                        sessionStorage.setItem("courseSkills", JSON.stringify(skills));
+                    }
+                } catch (err) {
+                    console.error("Failed to fetch skills:", err);
+                }
+
+                // Courses
+                try {
+                    const allCoursesStored = sessionStorage.getItem("allCourses");
+                    if (allCoursesStored) {
+                        setAllCourses(JSON.parse(allCoursesStored));
+                    } else {
+                        const courses = await fetchCoursesApi(accessToken || "");
+                        setAllCourses(courses);
+                        sessionStorage.setItem("allCourses", JSON.stringify(courses));
+                    }
+                } catch (err) {
+                    console.error("Failed to fetch courses:", err);
+                }
+
+                // Enrollments
+                try {
+                    if (accessToken) {
+                        const enrollments = await fetchUserEnrollmentsApi(accessToken);
+                        setEnrollments(enrollments);
+                    }
+                } catch (err) {
+                    console.error("Failed to fetch enrollments:", err);
+                }
+
+                // Recommended Courses
+                try {
+                    const recommendedStored = sessionStorage.getItem("recommendedCourses");
+                    if (recommendedStored) {
+                        setRecommendedCourses(JSON.parse(recommendedStored));
+                    } else {
+                        const recommended = await fetchRecommendedCoursesApi(accessToken || "");
+                        setRecommendedCourses(recommended);
+                        sessionStorage.setItem("recommendedCourses", JSON.stringify(recommended));
+                    }
+                } catch (err) {
+                    console.error("Failed to fetch recommended courses:", err);
+                }
+
+            } catch (err) {
+                console.error("Unexpected error in AppLoader:", err);
+            }
+        };
+
+
+        load();
+    }, [accessToken]);
+
+
+    return null
+}
+
+export default AppLoader;
Index: frontend/src/api/courseApi.ts
===================================================================
--- frontend/src/api/courseApi.ts	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/api/courseApi.ts	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,53 @@
+import type {FilterParams} from "../types/FilterParams.tsx";
+import axios from "axios";
+import qs from 'qs';
+import type {CoursePreview} from "../types/CoursePreview.tsx";
+import type {CourseDetail} from "../types/CourseDetail.tsx";
+
+const backendUrl = import.meta.env.VITE_BACKEND_URL;
+
+export const fetchCoursesApi = async (accessToken?: string, params?: FilterParams, signal?: AbortSignal): Promise<CoursePreview[]> => {
+    const res = await axios.get(
+        `${backendUrl}/api/courses`,
+        {
+            params,
+            paramsSerializer: params => qs.stringify(params, {arrayFormat: 'repeat'}),
+            signal,
+            headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : undefined
+
+        }
+    )
+
+    return res.data;
+}
+
+export const fetchRecommendedCoursesApi = async (accessToken: string): Promise<CoursePreview[]> => {
+    const res = await axios.get(`${backendUrl}/api/courses/recommended`, {
+        headers: {
+            Authorization: `Bearer ${accessToken}`
+        }
+    });
+
+    return res.data;
+}
+
+export const fetchCourseDetailsApi = async (courseId: number, signal?: AbortSignal): Promise<CourseDetail> => {
+    const res = await axios.get(
+        `${backendUrl}/api/courses/${courseId}`,
+        { signal }
+    );
+
+    return res.data;
+}
+
+export const fetchCoursesTopicsApi = async (): Promise<string[]> => {
+    const res = await axios.get(`${backendUrl}/api/courses/topics`);
+    return res.data;
+}
+
+export const fetchCoursesSkillsApi = async (): Promise<string[]> => {
+    const res = await axios.get(`${backendUrl}/api/courses/skills`);
+    return res.data;
+}
+
+
Index: ontend/src/api/courses.ts
===================================================================
--- frontend/src/api/courses.ts	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ 	(revision )
@@ -1,51 +1,0 @@
-import type {FilterParams} from "../types/FilterParams.tsx";
-import axios from "axios";
-import qs from 'qs';
-import type {CoursePreview} from "../types/CoursePreview.tsx";
-import type {CourseDetail} from "../types/CourseDetail.tsx";
-
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const fetchCoursesApi = async (params?: FilterParams, signal?: AbortSignal): Promise<CoursePreview[]> => {
-    const res = await axios.get(
-        `${backendUrl}/api/courses`,
-        {
-            params,
-            paramsSerializer: params => qs.stringify(params, {arrayFormat: 'repeat'}),
-            signal
-        }
-    )
-
-    return res.data;
-}
-
-export const fetchRecommendedCoursesApi = async (accessToken: string): Promise<CoursePreview[]> => {
-    const res = await axios.get(`${backendUrl}/api/courses/recommended`, {
-        headers: {
-            Authorization: `Bearer ${accessToken}`
-        }
-    });
-
-    return res.data;
-}
-
-export const fetchCourseDetailsApi = async (courseId: number, signal?: AbortSignal): Promise<CourseDetail> => {
-    const res = await axios.get(
-        `${backendUrl}/api/courses/${courseId}`,
-        { signal }
-    );
-
-    return res.data;
-}
-
-export const fetchCoursesTopicsApi = async (): Promise<string[]> => {
-    const res = await axios.get(`${backendUrl}/api/courses/topics`);
-    return res.data;
-}
-
-export const fetchCoursesSkillsApi = async (): Promise<string[]> => {
-    const res = await axios.get(`${backendUrl}/api/courses/skills`);
-    return res.data;
-}
-
-
Index: frontend/src/api/enrollmentApi.ts
===================================================================
--- frontend/src/api/enrollmentApi.ts	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/api/enrollmentApi.ts	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,30 @@
+import axios from "axios";
+import type {Enrollment} from "../types/Enrollment.tsx";
+
+const backendUrl = import.meta.env.VITE_BACKEND_URL;
+
+export const enrollUserApi = async (courseId: number, accessToken: string): Promise<void> => {
+    await axios.post(
+        `${backendUrl}/api/enrollments/create/${courseId}`,
+        {},
+        {
+            headers: {
+                Authorization: `Bearer ${accessToken}`,
+            }
+        }
+    )
+
+}
+
+export const fetchUserEnrollmentsApi = async (accessToken: string): Promise<Enrollment[]> => {
+    const res = await axios.get(
+        `${backendUrl}/api/enrollments/user`,
+        {
+            headers: {
+                Authorization: `Bearer ${accessToken}`,
+            }
+        }
+    )
+
+    return res.data;
+}
Index: ontend/src/api/user.ts
===================================================================
--- frontend/src/api/user.ts	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ 	(revision )
@@ -1,16 +1,0 @@
-import axios from "axios";
-
-const backendUrl = import.meta.env.VITE_BACKEND_URL;
-
-export const toggleFavoriteCourseApi = async (courseId: number, accessToken: string): Promise<void> => {
-    await axios.put(
-        `${backendUrl}/api/user/favorite-course/${courseId}`,
-        {},
-        {
-            headers: {
-                Authorization: `Bearer ${accessToken}`,
-            },
-            withCredentials: true
-        }
-    )
-}
Index: frontend/src/api/userApi.ts
===================================================================
--- frontend/src/api/userApi.ts	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/api/userApi.ts	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,15 @@
+import axios from "axios";
+
+const backendUrl = import.meta.env.VITE_BACKEND_URL;
+
+export const toggleFavoriteCourseApi = async (courseId: number, accessToken: string): Promise<void> => {
+    await axios.put(
+        `${backendUrl}/api/users/favorite-course/${courseId}`,
+        {},
+        {
+            headers: {
+                Authorization: `Bearer ${accessToken}`,
+            }
+        }
+    )
+}
Index: frontend/src/assets/icons/HeartOutline.tsx
===================================================================
--- frontend/src/assets/icons/HeartOutline.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/assets/icons/HeartOutline.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -6,6 +6,6 @@
              className={className}
              stroke="currentColor"
-             stroke-width={strokeWidth}
-             stroke-linecap="round" stroke-linejoin="round"
+             strokeWidth={strokeWidth}
+             strokeLinecap="round" strokeLinejoin="round"
         >
             <path stroke="none" d="M0 0h24v24H0z" fill="none"/>
Index: frontend/src/components/CourseCard.tsx
===================================================================
--- frontend/src/components/CourseCard.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/components/CourseCard.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -8,10 +8,7 @@
 import HeartFill from "../assets/icons/HeartFill.tsx";
 import {useGlobalContext} from "../context/GlobalContext.tsx";
-import {toggleFavoriteCourseApi} from "../api/user.ts";
-import { toast } from "react-toastify";
+import {toggleFavoriteCourseApi} from "../api/userApi.ts";
+import {showInfoToast} from "../utils/showInfoToast.ts";
 
-const showLoginTooltip = () => {
-    toast.info("Please log in to save favorite courses.");
-};
 
 
@@ -26,6 +23,5 @@
         setUser(prevUser => {
             if (!prevUser) {
-                // Show a tooltip or toast here
-                showLoginTooltip();
+                showInfoToast("Please log in to save favorite courses.");
                 return prevUser; // Exit early
             }
@@ -62,5 +58,4 @@
         }
     };
-
 
     return (
Index: frontend/src/components/CoursesCarouselCourseDetails.tsx
===================================================================
--- frontend/src/components/CoursesCarouselCourseDetails.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/components/CoursesCarouselCourseDetails.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -4,5 +4,5 @@
 import {useGlobalContext} from "../context/GlobalContext.tsx";
 import {useEffect} from "react";
-import {fetchRecommendedCoursesApi} from "../api/courses.ts";
+import {fetchRecommendedCoursesApi} from "../api/courseApi.ts";
 
 function CoursesCarouselCourseDetails() {
Index: frontend/src/components/HeroCourseDetails.tsx
===================================================================
--- frontend/src/components/HeroCourseDetails.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/components/HeroCourseDetails.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -2,8 +2,9 @@
 import React from "react";
 
-function HeroCourseDetails({course} : { course: CourseDetail | null}) {
+function HeroCourseDetails({course, enrollUser}: { course: CourseDetail | null, enrollUser: () => Promise<void> }) {
+    const [isLoading, setIsLoading] = React.useState<boolean>(false);
     const tripleInfo = [
         {
-            header: `0 Modules Total`,
+            header: `${course?.courseContents && course.courseContents.length} Modules Total`,
             description: course?.descriptionShort
         },
@@ -26,16 +27,35 @@
             className="bg-dark-blue py-4">
             {/*HEADER AND DESCRIPTION*/}
-            <section className="flex flex-col items-center gap-8 bg-white mx-6 px-horizontal-lg pb-12 pt-40 rounded-xl shadow-lg shadow-black/20">
+            <section
+                className="flex flex-col items-center gap-8 bg-white mx-6 px-horizontal-lg pb-12 pt-40 rounded-xl shadow-lg shadow-black/20">
                 <h1 className="text-5xl">{course?.title}</h1>
                 <p>{course?.description}</p>
-                <div className="flex mt-12 gap-4 items-center bg-gray/60 backdrop-blur-lg border-3 border-black/5 px-2 py-1 w-fit rounded-full">
+                <div
+                    className="flex mt-12 gap-4 items-center bg-gray/60 backdrop-blur-lg border-3 border-black/5 px-2 py-1 w-fit rounded-full">
                     <span className="font-semibold text-xl px-8">{
                         course?.price && course.price > 0 ? `$${course?.price}` : 'Free'
                     }</span>
-                    <button className={`
-                        ${bgColor}
-                        hover:shadow-lg hover:shadow-deep-green/50 transition-all duration-300 ease-in-out cursor-pointer
-                        shadow-md shadow-deep-green/30 text-white font-medium text-xl border-3 border-white/50 rounded-full px-14 py-2
-                    `}>Enroll Now</button>
+                    {
+                        isLoading ? (
+                            <div className="w-8 loader"></div>
+                        ) : (
+                            <button className={`
+                                ${bgColor}
+                                hover:shadow-lg hover:shadow-deep-green/50 transition-all duration-300 ease-in-out cursor-pointer
+                                shadow-md shadow-deep-green/30 text-white font-medium text-xl border-3 border-white/50 rounded-full px-14 py-2
+                            `}
+                                    onClick={() => {
+                                        setIsLoading(true)
+                                        enrollUser()
+                                            .catch((error) => {
+                                                console.error("Error enrolling user in course:", error);
+                                            })
+                                            .finally(() => {
+                                                setIsLoading(false)
+                                            })
+                                    }}
+                            >Enroll Now</button>
+                        )
+                    }
                 </div>
             </section>
Index: frontend/src/components/steps/RegisterStepFive.tsx
===================================================================
--- frontend/src/components/steps/RegisterStepFive.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/components/steps/RegisterStepFive.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -2,5 +2,5 @@
 import type {UserRegister} from "../../types/UserRegister.tsx";
 import RegisterSlider from "../inputs/RegisterSlider.tsx";
-import {fetchCoursesSkillsApi} from "../../api/courses.ts";
+import {fetchCoursesSkillsApi} from "../../api/courseApi.ts";
 
 function RegisterStepFive({setUser, user, setError}: {
Index: frontend/src/components/steps/RegisterStepFour.tsx
===================================================================
--- frontend/src/components/steps/RegisterStepFour.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/components/steps/RegisterStepFour.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -2,5 +2,5 @@
 import type {UserRegister} from "../../types/UserRegister.tsx";
 import RegisterSlider from "../inputs/RegisterSlider.tsx";
-import {fetchCoursesSkillsApi} from "../../api/courses.ts";
+import {fetchCoursesSkillsApi} from "../../api/courseApi.ts";
 
 function RegisterStepFour({setUser, user, setError}: {
Index: frontend/src/components/steps/RegisterStepThree.tsx
===================================================================
--- frontend/src/components/steps/RegisterStepThree.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/components/steps/RegisterStepThree.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -2,5 +2,5 @@
 import type {UserRegister} from "../../types/UserRegister.tsx";
 import RegisterSlider from "../inputs/RegisterSlider.tsx";
-import {fetchCoursesTopicsApi} from "../../api/courses.ts";
+import {fetchCoursesTopicsApi} from "../../api/courseApi.ts";
 
 function RegisterStepThree({setUser, user, setError}: {
Index: frontend/src/context/CourseStorage.ts
===================================================================
--- frontend/src/context/CourseStorage.ts	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/context/CourseStorage.ts	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -1,7 +1,9 @@
 import { create } from "zustand";
 import type {CoursePreview} from "../types/CoursePreview.tsx";
+import type {Enrollment} from "../types/Enrollment.tsx";
 
 
 interface CourseStorage {
+    enrollments: Enrollment[] | null;
     recommendedCourses: CoursePreview[] | null;
     favoriteCourses: number[] | null;
@@ -10,4 +12,5 @@
     skills: string[] | null;
 
+    setEnrollments: (enrollments: Enrollment[] | null) => void;
     setRecommendedCourses: (courses: CoursePreview[]) => void;
     setFavoriteCourses: (courses: number[] | null) => void;
@@ -18,4 +21,5 @@
 
 export const useCourseStorage = create<CourseStorage>((set) => ({
+    enrollments: null,
     recommendedCourses: null,
     favoriteCourses: null,
@@ -24,4 +28,5 @@
     skills: null,
 
+    setEnrollments: (enrollments) => set({ enrollments: enrollments }),
     setRecommendedCourses: (courses) => set({ recommendedCourses: courses }),
     setFavoriteCourses: (courses) => set({ favoriteCourses: courses }),
Index: frontend/src/pages/CourseDetails.tsx
===================================================================
--- frontend/src/pages/CourseDetails.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/pages/CourseDetails.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -1,4 +1,4 @@
 import {useParams} from "react-router-dom";
-import { fetchCourseDetailsApi } from "../api/courses.ts";
+import { fetchCourseDetailsApi } from "../api/courseApi.ts";
 import {useEffect, useState} from "react";
 import HeroCourseDetails from "../components/HeroCourseDetails.tsx";
@@ -6,9 +6,28 @@
 import CoursesCarouselCourseDetails from "../components/CoursesCarouselCourseDetails.tsx";
 import type {CourseDetail} from "../types/CourseDetail.tsx";
+import {enrollUserApi} from "../api/enrollmentApi.ts";
+import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {showInfoToast} from "../utils/showInfoToast.ts";
 
 function CourseDetails() {
+    const { user, accessToken } = useGlobalContext();
     const [loading, setLoading] = useState<boolean>(true);
     const { courseId } = useParams<{ courseId: string; courseTitle: string }>();
     const [course, setCourse] = useState<CourseDetail | null>(null);
+
+    const handleBuyCourse = () => {
+        if (!user) {
+            showInfoToast("Please log in to enroll in the course.");
+            return Promise.reject("No user logged in");
+        }
+
+        return enrollUserApi(Number(courseId), accessToken || "")
+            .then(() => {
+                console.log("User enrolled in course successfully");
+            })
+            .catch((error) => {
+                console.error("Error enrolling user in course:", error);
+            })
+    }
 
     useEffect(() => {
@@ -18,5 +37,4 @@
             .then(data => {
                 setCourse(data);
-                console.log(data)
             })
             .catch(err => {
@@ -38,5 +56,5 @@
                     </div> :
                     <>
-                        <HeroCourseDetails course={course}/>
+                        <HeroCourseDetails course={course} enrollUser={handleBuyCourse}/>
                         <CourseDetailsInfo course={course}/>
                         <CoursesCarouselCourseDetails/>
Index: frontend/src/pages/Courses.tsx
===================================================================
--- frontend/src/pages/Courses.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/pages/Courses.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -4,8 +4,9 @@
 import type {FilterParams} from "../types/FilterParams.tsx";
 import {useLocation, useNavigate} from "react-router-dom";
-import {fetchCoursesApi, fetchCoursesSkillsApi, fetchCoursesTopicsApi,} from "../api/courses.ts";
+import {fetchCoursesApi} from "../api/courseApi.ts";
 import ShifterRocket from "../../public/Rocket-Blue-Fire.png"
 import {useCourseStorage} from "../context/CourseStorage.ts";
 import type {CoursePreview} from "../types/CoursePreview.tsx";
+import {useGlobalContext} from "../context/GlobalContext.tsx";
 
 function getInitialFiltersFromSearch(): FilterParams {
@@ -37,12 +38,9 @@
     const navigate = useNavigate();
     const location = useLocation();
-    const {allCourses, setAllCourses} = useCourseStorage();
+    const { accessToken } = useGlobalContext();
+    const {allCourses, topics, skills} = useCourseStorage();
 
     const [showOnlyFavorites, setShowOnlyFavorites] = React.useState<boolean>(false);
     const [filteredCourses, setFilteredCourses] = React.useState<CoursePreview[] | null>(null);
-    const sessionTopics = sessionStorage.getItem("courseTopics");
-    const [topics, setTopics] = React.useState<string[] | null>(sessionTopics ? JSON.parse(sessionTopics) : null);
-    const sessionsSkills = sessionStorage.getItem("courseSkills");
-    const [skills, setSkills] = React.useState<string[] | null>(sessionsSkills ? JSON.parse(sessionsSkills) : null);
 
     const [filters, setFilters] = React.useState<FilterParams>(getInitialFiltersFromSearch());
@@ -51,30 +49,4 @@
     const abortControllerRef = useRef<AbortController | null>(null);
     const debounceTimeoutRef = useRef<number | null>(null);
-
-    // Initial fetch of all courses, topics, skills if not loaded
-    useEffect(() => {
-        if (!topics) {
-            fetchCoursesTopicsApi().then(data => {
-                setTopics(data);
-                sessionStorage.setItem("courseTopics", JSON.stringify(data));
-            }).catch(console.error);
-        }
-
-        if (!skills) {
-            fetchCoursesSkillsApi().then(data => {
-                setSkills(data);
-                sessionStorage.setItem("courseSkills", JSON.stringify(data));
-            }).catch(console.error);
-        }
-
-        if (!allCourses || allCourses.length === 0) {
-            fetchCoursesApi()
-                .then(data => {
-                    setAllCourses(data);
-                    sessionStorage.setItem("allCourses", JSON.stringify(data));
-                })
-                .catch(console.error);
-        }
-    }, []);
 
     // Effect to fetch filtered courses on filters change
@@ -108,5 +80,5 @@
             setLoading(true);
 
-            fetchCoursesApi(filters, abortControllerRef.current?.signal)
+            fetchCoursesApi(accessToken || "", filters, abortControllerRef.current?.signal)
                 .then(data => {
                     setFilteredCourses(data);
Index: frontend/src/pages/Home.tsx
===================================================================
--- frontend/src/pages/Home.tsx	(revision 4f654cd20d3ada13e934fbcd263f09a30f194969)
+++ frontend/src/pages/Home.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -4,112 +4,6 @@
 import ShifterValues from "../components/ShifterValues.tsx";
 import CoursesCarouselHome from "../components/CoursesCarouselHome.tsx";
-import {useCourseStorage} from "../context/CourseStorage.ts";
-import {useEffect} from "react";
-import {
-    fetchCoursesApi,
-    fetchCoursesSkillsApi,
-    fetchCoursesTopicsApi,
-    fetchRecommendedCoursesApi
-} from "../api/courses.ts";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
 
 function Home() {
-    const {accessToken} = useGlobalContext();
-    const {
-        recommendedCourses,
-        setRecommendedCourses,
-        allCourses,
-        setAllCourses,
-        topics,
-        setTopics,
-        skills,
-        setSkills
-    } = useCourseStorage();
-
-    const fetchRecommendedCourses = async () => {
-        const stored = sessionStorage.getItem("recommendedCourses");
-        if (stored) {
-            setRecommendedCourses(JSON.parse(stored));
-            return;
-        }
-
-        fetchRecommendedCoursesApi(accessToken || "")
-            .then(data => {
-                setRecommendedCourses(data);
-                sessionStorage.setItem("recommendedCourses", JSON.stringify(data));
-            })
-            .catch(err => {
-                console.error("Error fetching recommended courses:", err);
-                throw err;
-            });
-    }
-
-    const fetchAllCourses = async () => {
-        const stored = sessionStorage.getItem("allCourses");
-        if (stored) {
-            setAllCourses(JSON.parse(stored));
-            return;
-        }
-
-        fetchCoursesApi()
-            .then(data => {
-                setAllCourses(data);
-                sessionStorage.setItem("allCourses", JSON.stringify(data));
-            })
-            .catch(err => {
-                console.error("Error fetching all courses:", err);
-                throw err;
-            });
-    }
-
-    const fetchCoursesTopics = async () => {
-        const stored = sessionStorage.getItem("courseTopics");
-        if (stored) {
-            setTopics(JSON.parse(stored));
-            return;
-        }
-
-        fetchCoursesTopicsApi()
-            .then(data => {
-                setTopics(data);
-                sessionStorage.setItem("courseTopics", JSON.stringify(data));
-            })
-            .catch(err => {
-                console.error("Error fetching course topics:", err);
-                throw err;
-            });
-    }
-
-    const fetchCoursesSkills = async () => {
-        const stored = sessionStorage.getItem("courseSkills");
-        if (stored) {
-            setSkills(JSON.parse(stored));
-            return;
-        }
-
-        fetchCoursesSkillsApi()
-            .then(data => {
-                setSkills(data);
-                sessionStorage.setItem("courseSkills", JSON.stringify(data));
-            })
-            .catch(err => {
-                console.error("Error fetching course skills:", err);
-                throw err;
-            });
-    }
-
-    useEffect(() => {
-        if (!recommendedCourses)
-            fetchRecommendedCourses()
-
-        if (!allCourses)
-            fetchAllCourses()
-
-        if (!topics)
-            fetchCoursesTopics()
-
-        if (!skills)
-            fetchCoursesSkills()
-    }, []);
 
     return (
Index: frontend/src/types/Enrollment.tsx
===================================================================
--- frontend/src/types/Enrollment.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/types/Enrollment.tsx	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,7 @@
+
+export interface Enrollment {
+    enrollmentStatus: "PENDING" | "ACTIVE" | "COMPLETED";
+    percentCompleted: number;
+    date: Date;
+    courseId: number;
+}
Index: frontend/src/utils/showInfoToast.ts
===================================================================
--- frontend/src/utils/showInfoToast.ts	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
+++ frontend/src/utils/showInfoToast.ts	(revision 4e141b3cf2db7ded0bc6d5ef1fc36fcecaef109f)
@@ -0,0 +1,14 @@
+import { toast } from "react-toastify";
+
+export const showInfoToast = (message: string) => {
+    toast.info(message, {
+        position: "top-right",
+        autoClose: 3000,
+        hideProgressBar: false,
+        closeOnClick: true,
+        pauseOnHover: true,
+        draggable: true,
+        progress: undefined,
+        theme: "light",
+    });
+};
