Index: backend/pom.xml
===================================================================
--- backend/pom.xml	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/pom.xml	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -35,9 +35,9 @@
 			<artifactId>spring-boot-starter-web</artifactId>
 		</dependency>
-
 		<dependency>
 			<groupId>org.projectlombok</groupId>
 			<artifactId>lombok</artifactId>
-			<optional>true</optional>
+			<version>1.18.38</version>
+			<scope>provided</scope>
 		</dependency>
 		<dependency>
@@ -47,12 +47,34 @@
 		</dependency>
 		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-data-jpa</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.mapstruct</groupId>
+			<artifactId>mapstruct</artifactId>
+			<version>1.5.5.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>org.mapstruct</groupId>
+			<artifactId>mapstruct-processor</artifactId>
+			<version>1.5.5.Final</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
 			<groupId>org.postgresql</groupId>
 			<artifactId>postgresql</artifactId>
+			<version>42.7.7</version>
 			<scope>runtime</scope>
 		</dependency>
 		<dependency>
 			<groupId>org.springframework.boot</groupId>
-			<artifactId>spring-boot-starter-data-jpa</artifactId>
+			<artifactId>spring-boot-starter-security</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.security</groupId>
+			<artifactId>spring-security-test</artifactId>
+			<scope>test</scope>
+		</dependency>
+
 	</dependencies>
 
@@ -62,9 +84,16 @@
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.11.0</version>
 				<configuration>
 					<annotationProcessorPaths>
 						<path>
+							<groupId>org.mapstruct</groupId>
+							<artifactId>mapstruct-processor</artifactId>
+							<version>1.5.5.Final</version>
+						</path>
+						<path>
 							<groupId>org.projectlombok</groupId>
 							<artifactId>lombok</artifactId>
+							<version>1.18.38</version>
 						</path>
 					</annotationProcessorPaths>
@@ -83,4 +112,5 @@
 				</configuration>
 			</plugin>
+
 		</plugins>
 	</build>
Index: backend/src/main/java/com/shifterwebapp/shifter/GenericMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/GenericMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/GenericMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,17 @@
+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 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/Validate.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,41 @@
+package com.shifterwebapp.shifter;
+
+import com.shifterwebapp.shifter.course.CourseRepository;
+import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
+import com.shifterwebapp.shifter.payment.PaymentRepository;
+import com.shifterwebapp.shifter.user.UserRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class Validate {
+
+    private final UserRepository userRepository;
+    private final CourseRepository courseRepository;
+    private final PaymentRepository paymentRepository;
+
+    public void validateUserExists(Long userId) {
+        if (!userRepository.existsById(userId)) {
+            throw new ResourceNotFoundException("User with ID " + userId + " not found!");
+        }
+    }
+
+    public void validateCourseExists(Long courseId) {
+        if (!courseRepository.existsById(courseId)) {
+            throw new ResourceNotFoundException("Course with ID " + courseId + " not found!");
+        }
+    }
+
+    public void validatePaymentExists(Long paymentId) {
+        if (!paymentRepository.existsById(paymentId)) {
+            throw new ResourceNotFoundException("Payment with ID " + paymentId + " not found!");
+        }
+    }
+
+    public void validateEnrollmentExists(Long enrollmentId) {
+        if (!paymentRepository.existsById(enrollmentId)) {
+            throw new ResourceNotFoundException("Enrollment with ID " + enrollmentId + " not found!");
+        }
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/Course.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/Course.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/Course.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,7 +1,8 @@
 package com.shifterwebapp.shifter.course;
 
-import com.shifterwebapp.shifter.course.enums.Difficulty;
+import com.shifterwebapp.shifter.enums.Difficulty;
 import com.shifterwebapp.shifter.coursecontent.CourseContent;
 import com.shifterwebapp.shifter.enrollment.Enrollment;
+import com.shifterwebapp.shifter.enums.Skills;
 import jakarta.persistence.*;
 import lombok.*;
@@ -24,5 +25,6 @@
     
     private String topic;
-    
+
+    @Enumerated(EnumType.STRING)
     private Difficulty difficulty;
     
@@ -43,11 +45,12 @@
     private String descriptionLong;
     
-    @ElementCollection
-    private List<String> skillsGained;
+    @ElementCollection(targetClass = Skills.class)
+    @Enumerated(EnumType.STRING)
+    private List<Skills> skillsGained;
 
     @ElementCollection
     private List<String> whatWillBeLearned;
     
-    @OneToMany(mappedBy = "course", cascade = CascadeType.ALL, orphanRemoval = true)
+    @OneToMany(mappedBy = "course", orphanRemoval = true)        // IS THIS GOOD BUSINESS LOGIC? SHOULD I HAVE CASCADES?
     private List<Enrollment> enrollments;
 
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,69 @@
+package com.shifterwebapp.shifter.course;
+
+import com.shifterwebapp.shifter.course.service.CourseService;
+import com.shifterwebapp.shifter.enums.Difficulty;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
+import lombok.RequiredArgsConstructor;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("${api.base.path}/course")
+public class CourseController {
+
+    private final CourseService courseService;
+
+    @GetMapping
+    public ResponseEntity<?> getCourses(
+            @RequestParam(required = false) String title,
+            @RequestParam(required = false) String topic,
+            @RequestParam(required = false) List<Difficulty> difficulties,
+            @RequestParam(required = false) Float floorPrice,
+            @RequestParam(required = false) Float ceilPrice,
+            @RequestParam(required = false) Float floorHours,
+            @RequestParam(required = false) Float ceilHours,
+            @RequestParam(required = false) List<Skills> skills
+            ) {
+        Specification<Course> spec = null;
+
+        if (title != null && !title.isEmpty()) {
+            spec = (spec == null) ? CourseSpecification.hasTitleLike(title) : spec.and(CourseSpecification.hasTitleLike(title));
+        }
+
+        if (topic != null && !topic.isEmpty()) {
+            spec = (spec == null) ? CourseSpecification.hasTopicLike(topic) : spec.and(CourseSpecification.hasTopicLike(topic));
+        }
+
+        if (difficulties != null && !difficulties.isEmpty()) {
+            spec = (spec == null) ? CourseSpecification.hasDifficulties(difficulties) : spec.and(CourseSpecification.hasDifficulties(difficulties));
+        }
+
+        if (floorPrice != null || ceilPrice != null) {
+            spec = (spec == null) ? CourseSpecification.hasPriceBetween(floorPrice, ceilPrice) : spec.and(CourseSpecification.hasPriceBetween(floorPrice, ceilPrice));
+        }
+
+        if (floorHours != null || ceilHours != null) {
+            spec = (spec == null) ? CourseSpecification.hasHoursBetween(floorHours, ceilHours) : spec.and(CourseSpecification.hasHoursBetween(floorHours, ceilHours));
+        }
+
+        if (skills != null && !skills.isEmpty()) {
+            spec = (spec == null) ? CourseSpecification.hasSkills(skills) : spec.and(CourseSpecification.hasSkills(skills));
+        }
+
+        List<CourseDto> courseDtos = courseService.getAllCourses(spec);
+
+        return ResponseEntity.ok(courseDtos);
+    }
+
+    @GetMapping("/{courseId}")
+    public ResponseEntity<?> getCourseById(@PathVariable("courseId") Long courseId) {
+        CourseDto courseDto = courseService.getCourseById(courseId);
+        return ResponseEntity.ok(courseDto);
+    }
+
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseDto.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseDto.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,6 +1,7 @@
 package com.shifterwebapp.shifter.course;
 
-import com.shifterwebapp.shifter.course.enums.Difficulty;
+import com.shifterwebapp.shifter.enums.Difficulty;
 import com.shifterwebapp.shifter.coursecontent.CourseContentDto;
+import com.shifterwebapp.shifter.enums.Skills;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -36,8 +37,9 @@
     private String descriptionLong;
 
-    private List<String> skillsGained;
+    private List<Skills> skillsGained;
 
     private List<String> whatWillBeLearned;
 
+    // DO I NEED THIS ???
     private List<CourseContentDto> courseContents;
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,17 @@
+package com.shifterwebapp.shifter.course;
+
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface CourseMapper {
+
+    CourseDto toDto(Course course);
+    List<CourseDto> toDto(List<Course> courses);
+
+    @InheritInverseConfiguration
+    Course toEntity(CourseDto courseDto);
+    @InheritInverseConfiguration
+    List<Course> toEntity(List<CourseDto> courseDtos);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,6 +1,28 @@
 package com.shifterwebapp.shifter.course;
 
+import com.shifterwebapp.shifter.enums.Difficulty;
+import com.shifterwebapp.shifter.enums.Skills;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 
-public interface CourseRepository extends JpaRepository<Course, Long> {
+import java.util.List;
+
+public interface CourseRepository extends JpaRepository<Course, Long>, JpaSpecificationExecutor<Course> {
+    List<Course> findCoursesByTitle(String searchTitle);
+
+    List<Course> findCoursesByTopic(String searchTopic);
+
+    List<Course> findCoursesByDifficulty(Difficulty searchDifficulty);
+
+    @Query("select c from Course c where c.price >= :floorPrice and c.price <= :ceilPrice")
+    List<Course> findCoursesByPriceRange(@Param("floorPrice") Float floorPrice,@Param("ceilPrice") Float ceilPrice);
+
+    @Query("select c from Course c where c.durationHours >= :floorDuration and c.durationHours <= :ceilDuration")
+    List<Course> findCoursesByDurationHoursRange(@Param("floorDuration") Float floorDuration, @Param("ceilDuration") Float ceilDuration);
+
+    List<Course> findCoursesBySkillsGainedIn(List<Skills> searchSkills);
+
+    List<Course> findCoursesByDifficultyIn(List<Difficulty> searchDifficulties);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,50 @@
+package com.shifterwebapp.shifter.course;
+
+import com.shifterwebapp.shifter.enums.Difficulty;
+import com.shifterwebapp.shifter.enums.Skills;
+import org.springframework.data.jpa.domain.Specification;
+
+import java.util.List;
+
+public class CourseSpecification {
+
+    public static Specification<Course> hasTitleLike(String title) {
+        return (root, query, cb) ->
+                cb.like(cb.lower(root.get("title")), "%" + title.toLowerCase() + "%");
+    }
+
+    public static Specification<Course> hasTopicLike(String topic) {
+        return (root, query, cb) ->
+                cb.like(cb.lower(root.get("topic")), "%" + topic.toLowerCase() + "%");
+    }
+
+    public static Specification<Course> hasDifficulties(List<Difficulty> difficulties) {
+        return (root, query, cb) -> difficulties == null || difficulties.isEmpty()
+                ? null
+                : root.get("difficulty").in(difficulties);
+    }
+
+    public static Specification<Course> hasSkills(List<Skills> skills) {
+        return (root, query, cb) -> skills == null || skills.isEmpty()
+                ? null
+                : root.join("skillsGained").in(skills);
+    }
+
+    public static Specification<Course> hasPriceBetween(Float min, Float max) {
+        return (root, query, cb) -> {
+            if (min == null && max == null) return null;
+            if (min != null && max != null) return cb.between(root.get("price"), min, max);
+            if (min != null) return cb.greaterThanOrEqualTo(root.get("price"), min);
+            return cb.lessThanOrEqualTo(root.get("price"), max);
+        };
+    }
+
+    public static Specification<Course> hasHoursBetween(Float min, Float max) {
+        return (root, query, cb) -> {
+            if (min == null && max == null) return null;
+            if (min != null && max != null) return cb.between(root.get("durationInHours"), min, max);
+            if (min != null) return cb.greaterThanOrEqualTo(root.get("durationInHours"), min);
+            return cb.lessThanOrEqualTo(root.get("durationInHours"), max);
+        };
+    }
+}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/enums/Difficulty.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/enums/Difficulty.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ 	(revision )
@@ -1,8 +1,0 @@
-package com.shifterwebapp.shifter.course.enums;
-
-public enum Difficulty {
-    BEGINNER,
-    INTERMEDIATE,
-    ADVANCED,
-    EXPERT
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,4 +1,97 @@
 package com.shifterwebapp.shifter.course.service;
 
-public class CourseService {
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.course.Course;
+import com.shifterwebapp.shifter.course.CourseDto;
+import com.shifterwebapp.shifter.course.CourseMapper;
+import com.shifterwebapp.shifter.course.CourseRepository;
+import com.shifterwebapp.shifter.coursecontent.CourseContentMapper;
+import com.shifterwebapp.shifter.enums.Difficulty;
+import com.shifterwebapp.shifter.enums.Skills;
+import lombok.RequiredArgsConstructor;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class CourseService implements ImplCourseService {
+
+    private final CourseRepository courseRepository;
+    private final CourseMapper courseMapper;
+    private final CourseContentMapper courseContentMapper;
+    private final Validate validate;
+
+    @Override
+    public List<CourseDto> getAllCourses(Specification<Course> specification) {
+        List<Course> courses = specification == null ?
+                courseRepository.findAll() :
+                courseRepository.findAll(specification);
+        return courseMapper.toDto(courses);
+    }
+
+    @Override
+    public CourseDto getCourseById(Long courseId) {
+        validate.validateCourseExists(courseId);
+        Course course = courseRepository.findById(courseId).orElseThrow();
+        return courseMapper.toDto(course);
+    }
+
+    @Override
+    public CourseDto createCourse(CourseDto request) {
+        Course course = Course.builder()
+                .title(request.getTitle())
+                .topic(request.getTopic())
+                .difficulty(request.getDifficulty())
+                .durationHours(request.getDurationHours())
+                .price(request.getPrice())
+                .rating(request.getRating())
+                .ratingCount(request.getRatingCount())
+                .descriptionShort(request.getDescriptionShort())
+                .description(request.getDescription())
+                .descriptionLong(request.getDescriptionLong())
+                .skillsGained(request.getSkillsGained())
+                .whatWillBeLearned(request.getWhatWillBeLearned())
+                .courseContents(courseContentMapper.toEntity(request.getCourseContents()))      // ??????
+                .build();
+
+        return courseMapper.toDto(course);
+    }
+
+    @Override
+    public List<CourseDto> searchCoursesByTitle(String searchTitle) {
+        List<Course> courses = courseRepository.findCoursesByTitle(searchTitle);
+        return courseMapper.toDto(courses);
+    }
+
+    @Override
+    public List<CourseDto> searchCoursesByTopic(String searchTopic) {
+        List<Course> courses = courseRepository.findCoursesByTopic(searchTopic);
+        return courseMapper.toDto(courses);
+    }
+
+    @Override
+    public List<CourseDto> searchCoursesByDifficulties(List<Difficulty> searchDifficulties) {
+        List<Course> courses = courseRepository.findCoursesByDifficultyIn(searchDifficulties);
+        return courseMapper.toDto(courses);
+    }
+
+    @Override
+    public List<CourseDto> searchCoursesByPrice(Float floorPrice, Float ceilPrice) {
+        List<Course> courses = courseRepository.findCoursesByPriceRange(floorPrice, ceilPrice);
+        return courseMapper.toDto(courses);
+    }
+
+    @Override
+    public List<CourseDto> searchCoursesByDurationHours(Float floorHours, Float ceilHours) {
+        List<Course> courses = courseRepository.findCoursesByDurationHoursRange(floorHours, ceilHours);
+        return courseMapper.toDto(courses);
+    }
+
+    @Override
+    public List<CourseDto> searchCoursesBySkillsGained(List<Skills> searchSkills) {
+        List<Course> courses = courseRepository.findCoursesBySkillsGainedIn(searchSkills);
+        return courseMapper.toDto(courses);
+    }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,17 +1,21 @@
 package com.shifterwebapp.shifter.course.service;
 
+import com.shifterwebapp.shifter.course.Course;
 import com.shifterwebapp.shifter.course.CourseDto;
-import com.shifterwebapp.shifter.course.enums.Difficulty;
-import com.shifterwebapp.shifter.user.enums.Skills;
+import com.shifterwebapp.shifter.enums.Difficulty;
+import com.shifterwebapp.shifter.enums.Skills;
+import org.springframework.data.jpa.domain.Specification;
 
 import java.util.List;
 
 public interface ImplCourseService {
-    List<CourseDto> getAllCourses();
+    List<CourseDto> getAllCourses(Specification<Course> specification);
     CourseDto getCourseById(Long id);
+
+    CourseDto createCourse(CourseDto request);
 
     List<CourseDto> searchCoursesByTitle(String searchTitle);
     List<CourseDto> searchCoursesByTopic(String searchTopic);
-    List<CourseDto> searchCoursesByDifficulty(Difficulty searchDifficulty);
+    List<CourseDto> searchCoursesByDifficulties(List<Difficulty> searchDifficulty);
     List<CourseDto> searchCoursesByPrice(Float floorPrice, Float ceilPrice);
     List<CourseDto> searchCoursesByDurationHours(Float floorHours, Float ceilHours);
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContent.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContent.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContent.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -3,5 +3,5 @@
 import com.shifterwebapp.shifter.course.Course;
 import jakarta.persistence.*;
-import com.shifterwebapp.shifter.coursecontent.enums.ContentType;
+import com.shifterwebapp.shifter.enums.ContentType;
 import lombok.*;
 
@@ -25,4 +25,5 @@
     private String contentURL;
 
+    @Enumerated(EnumType.STRING)
     private ContentType contentType;
 
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDto.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDto.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,5 +1,5 @@
 package com.shifterwebapp.shifter.coursecontent;
 
-import com.shifterwebapp.shifter.coursecontent.enums.ContentType;
+import com.shifterwebapp.shifter.enums.ContentType;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -10,4 +10,6 @@
 @NoArgsConstructor
 public class CourseContentDto {
+
+    private Long id;
 
     private String title;
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,20 @@
+package com.shifterwebapp.shifter.coursecontent;
+
+import com.shifterwebapp.shifter.course.Course;
+import com.shifterwebapp.shifter.course.CourseDto;
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface CourseContentMapper {
+
+    CourseContentDto toDto(CourseContent courseContent);
+    List<CourseContentDto> toDto(List<CourseContent> courseContents);
+
+    @InheritInverseConfiguration
+    CourseContent toEntity(CourseContentDto courseContentDto);
+    @InheritInverseConfiguration
+    List<CourseContent> toEntity(List<CourseContentDto> courseContentDtos);
+}
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/enums/ContentType.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/enums/ContentType.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ 	(revision )
@@ -1,8 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent.enums;
-
-public enum ContentType {
-    VIDEO,
-    TEXT,
-    FILE,
-    QUIZ
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/CourseContentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/CourseContentService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/CourseContentService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,4 +1,9 @@
 package com.shifterwebapp.shifter.coursecontent.service;
 
-public class CourseContentService {
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CourseContentService implements ImplCourseContentService {
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -2,5 +2,5 @@
 
 import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.enrollment.enums.EnrollmentStatus;
+import com.shifterwebapp.shifter.enums.EnrollmentStatus;
 import com.shifterwebapp.shifter.payment.Payment;
 import com.shifterwebapp.shifter.review.Review;
@@ -22,4 +22,5 @@
     private Long id;
 
+    @Enumerated(EnumType.STRING)
     private EnrollmentStatus enrollmentStatus;
 
@@ -28,5 +29,5 @@
     private Date date;
 
-    @OneToOne
+    @OneToOne(cascade = CascadeType.PERSIST, orphanRemoval = true)  // Persist ???? Orphan removal ????
     @JoinColumn(name = "payment_id")
     private Payment payment;
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentDto.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -2,5 +2,5 @@
 
 import com.shifterwebapp.shifter.course.CourseDto;
-import com.shifterwebapp.shifter.enrollment.enums.EnrollmentStatus;
+import com.shifterwebapp.shifter.enums.EnrollmentStatus;
 import com.shifterwebapp.shifter.payment.PaymentDto;
 import com.shifterwebapp.shifter.review.ReviewDto;
@@ -16,4 +16,6 @@
 public class EnrollmentDto {
 
+    private Long id;
+
     private EnrollmentStatus enrollmentStatus;
 
@@ -21,10 +23,4 @@
 
     private Date date;
-
-    private PaymentDto payment;
-
-    private ReviewDto review;
-
-    private CourseDto course;
 }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,18 @@
+package com.shifterwebapp.shifter.enrollment;
+
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface EnrollmentMapper {
+
+    EnrollmentDto toDto(Enrollment enrollment);
+    List<EnrollmentDto> toDto(List<Enrollment> enrollment);
+
+    @InheritInverseConfiguration
+    Enrollment toEntity(EnrollmentDto enrollmentDto);
+    @InheritInverseConfiguration
+    List<Enrollment> toEntity(List<EnrollmentDto> enrollmentDtos);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentRepository.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -2,5 +2,22 @@
 
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
 
 public interface EnrollmentRepository extends JpaRepository<Enrollment, Long> {
+
+    @Query("select e from Enrollment e where e.payment.user.id = :userId")
+    List<Enrollment> findEnrollmentsByUser(@Param("userId") Long userId);
+
+    @Query("select e from Enrollment e where e.course.id = :courseId")
+    List<Enrollment> findEnrollmentsByCourse(@Param("courseId") Long courseId);
+
+    @Query("select case when count(e) > 0 then true else false end" +
+            " from Enrollment e where e.payment.user.id = :userId and e.course.id = :courseId")
+    Boolean findIsUserEnrolledInCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
+
+    @Query("select e from Enrollment e where e.payment.user.id = :userId and e.course.id = :courseId")
+    Enrollment findEnrollmentByUserAndCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
 }
Index: ckend/src/main/java/com/shifterwebapp/shifter/enrollment/enums/EnrollmentStatus.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/enums/EnrollmentStatus.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.enrollment.enums;
-
-public enum EnrollmentStatus {
-    PENDING,
-    ACTIVE,
-    COMPLETED
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,4 +1,138 @@
 package com.shifterwebapp.shifter.enrollment.service;
 
-public class EnrollmentService {
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.course.Course;
+import com.shifterwebapp.shifter.course.CourseRepository;
+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.exception.ResourceNotFoundException;
+import com.shifterwebapp.shifter.payment.Payment;
+import com.shifterwebapp.shifter.payment.PaymentRepository;
+import com.shifterwebapp.shifter.enums.PaymentStatus;
+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.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class EnrollmentService implements ImplEnrollmentService{
+
+    private final EnrollmentRepository enrollmentRepository;
+    private final CourseRepository courseRepository;
+    private final PaymentRepository paymentRepository;
+    private final UserService userService;
+    private final EnrollmentMapper enrollmentMapper;
+    private final Validate validate;
+
+    @Override
+    public EnrollmentDto getEnrollmentById(Long enrollmentId) {
+        validate.validateEnrollmentExists(enrollmentId);
+        Enrollment enrollment = enrollmentRepository.findById(enrollmentId).orElseThrow();
+        return enrollmentMapper.toDto(enrollment);
+    }
+
+    @Override
+    public List<EnrollmentDto> getEnrollmentsByUser(Long userId) {
+        validate.validateUserExists(userId);
+        List<Enrollment> enrollment = enrollmentRepository.findEnrollmentsByUser(userId);
+        return enrollmentMapper.toDto(enrollment);
+    }
+
+    @Override
+    public List<EnrollmentDto> getEnrollmentsByCourse(Long courseId) {
+        validate.validateCourseExists(courseId);
+        List<Enrollment> enrollment = enrollmentRepository.findEnrollmentsByCourse(courseId);
+        return enrollmentMapper.toDto(enrollment);
+    }
+
+    @Override
+    public EnrollmentDto getEnrollmentByUserAndCourse(Long userId, Long courseId) {
+        validate.validateUserExists(userId);
+        validate.validateCourseExists(courseId);
+
+        Enrollment enrollment = enrollmentRepository.findEnrollmentByUserAndCourse(userId, courseId);
+        return enrollmentMapper.toDto(enrollment);
+    }
+
+
+    @Override
+    public EnrollmentDto enrollUser(Long courseId, Long paymentId) {
+        validate.validateCourseExists(courseId);
+        validate.validatePaymentExists(paymentId);
+
+        Payment payment = paymentRepository.findById(paymentId).orElseThrow();
+
+        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 + "!");
+        }
+
+        Course course = courseRepository.findById(courseId).orElseThrow();
+
+        Enrollment enrollment = Enrollment.builder()
+                .enrollmentStatus(EnrollmentStatus.PENDING)
+                .percentCompleted(0)
+                .date(new Date())
+                .payment(payment)
+                .review(null)
+                .course(course)
+                .build();
+
+
+        return enrollmentMapper.toDto(enrollment);
+    }
+
+    @Override
+    public Boolean isUserEnrolledInCourse(Long userId, Long courseId) {
+        validate.validateUserExists(userId);
+        validate.validateCourseExists(courseId);
+
+        return enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId);
+    }
+
+    @Override
+    public EnrollmentDto updateEnrollmentStatusActive(Long enrollmentId) {
+        validate.validateEnrollmentExists(enrollmentId);
+
+        Enrollment enrollment = enrollmentRepository.findById(enrollmentId).orElseThrow();
+        enrollment.setEnrollmentStatus(EnrollmentStatus.ACTIVE);
+        enrollmentRepository.save(enrollment);
+
+        return enrollmentMapper.toDto(enrollment);
+    }
+
+    // CALLING USER SERVICE HERE. IS THERE A BETTER WAY FOR THIS ???
+    @Override
+    public EnrollmentDto updateEnrollmentStatusToCompleted(Long enrollmentId) {
+        validate.validateEnrollmentExists(enrollmentId);
+
+        Enrollment enrollment = enrollmentRepository.findById(enrollmentId).orElseThrow();
+        enrollment.setEnrollmentStatus(EnrollmentStatus.COMPLETED);
+
+        Long userId = enrollment.getPayment().getUser().getId();
+        List<Skills> skillsGained = enrollment.getCourse().getSkillsGained();
+        userService.addPoints(userId, PointsConstants.BUY_COURSE);
+        userService.addSkills(userId, skillsGained);
+        userService.removeSkillGaps(userId, skillsGained);
+
+        enrollmentRepository.save(enrollment);
+
+        return enrollmentMapper.toDto(enrollment);
+    }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/ImplEnrollmentService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -2,15 +2,19 @@
 
 import com.shifterwebapp.shifter.enrollment.EnrollmentDto;
-import com.shifterwebapp.shifter.enrollment.enums.EnrollmentStatus;
+import com.shifterwebapp.shifter.enums.EnrollmentStatus;
+
+import java.util.List;
 
 public interface ImplEnrollmentService {
-    EnrollmentDto getEnrollmentsByUser(Long userId);
-    EnrollmentDto getEnrollmentsByCourse(Long courseId);
+    EnrollmentDto getEnrollmentById(Long enrollmentId);
+    List<EnrollmentDto> getEnrollmentsByUser(Long userId);
+    List<EnrollmentDto> getEnrollmentsByCourse(Long courseId);
+    EnrollmentDto getEnrollmentByUserAndCourse(Long userId, Long courseId);
 
-    EnrollmentDto enrollUser(Long userId, Long courseId);
+    EnrollmentDto enrollUser(Long courseId, Long paymentId);
 
-    Boolean isUserEnrolled(Long userId, Long courseId);
+    Boolean isUserEnrolledInCourse(Long userId, Long courseId);
 
-    EnrollmentDto updateEnrollmentsStatus(Long userId, Long courseId, EnrollmentStatus newStatus);
-
+    EnrollmentDto updateEnrollmentStatusActive(Long enrollmentId);
+    EnrollmentDto updateEnrollmentStatusToCompleted(Long enrollmentId);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/CompanyType.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/CompanyType.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/CompanyType.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,10 @@
+package com.shifterwebapp.shifter.enums;
+
+public enum CompanyType {
+    FREELANCE,
+    STARTUP,
+    SME,
+    MIDMARKET,
+    ENTERPRISE,
+    OTHER
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/ContentType.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/ContentType.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/ContentType.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,8 @@
+package com.shifterwebapp.shifter.enums;
+
+public enum ContentType {
+    VIDEO,
+    TEXT,
+    FILE,
+    QUIZ
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/Difficulty.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/Difficulty.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/Difficulty.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,8 @@
+package com.shifterwebapp.shifter.enums;
+
+public enum Difficulty {
+    BEGINNER,
+    INTERMEDIATE,
+    ADVANCED,
+    EXPERT
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/EnrollmentStatus.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/EnrollmentStatus.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/EnrollmentStatus.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,7 @@
+package com.shifterwebapp.shifter.enums;
+
+public enum EnrollmentStatus {
+    PENDING,
+    ACTIVE,
+    COMPLETED
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/Interests.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/Interests.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/Interests.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,15 @@
+package com.shifterwebapp.shifter.enums;
+
+public enum Interests {
+    SALES_STRATEGIES,
+    MARKETING,
+    LEADERSHIP,
+    MANAGEMENT,
+    DIGITAL_TRANSFORMATION,
+    BUSINESS_TRANSFORMATION,
+    ENTREPRENEURSHIP,
+    STARTUP,
+    SALES,
+    NEGOTIATION,
+    FINANCE_FOR_BUSINESS
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/PaymentMethod.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/PaymentMethod.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/PaymentMethod.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,7 @@
+package com.shifterwebapp.shifter.enums;
+
+public enum PaymentMethod {
+    CARD,
+    PAYPAL,
+    CASYS
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/PaymentStatus.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/PaymentStatus.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/PaymentStatus.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,7 @@
+package com.shifterwebapp.shifter.enums;
+
+public enum PaymentStatus {
+    PENDING,
+    COMPLETED,
+    FAILED
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/PointsConstants.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/PointsConstants.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/PointsConstants.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,6 @@
+package com.shifterwebapp.shifter.enums;
+
+public class PointsConstants {
+    public static final int BUY_COURSE = 3;
+    public static final int REVIEW_COURSE = 1;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/Skills.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/Skills.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/Skills.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,59 @@
+package com.shifterwebapp.shifter.enums;
+
+public enum Skills {
+
+    // CORE BUSINESS SKILLS
+    STRATEGIC_THINKING,
+    STRATEGIC_PLANNING,
+    BUSINESS_DEVELOPMENT,
+    PROJECT_MANAGEMENT,
+    OPERATION_MANAGEMENT,
+    LOGISTICS,
+    BUSINESS_MODEL_CREATION,
+    RISK_MANAGEMENT,
+    STARTUP_METHODOLOGIES,
+
+    // MARKETING & SALES
+    MARKETING,
+    DIGITAL_MARKETING,
+    TRADITIONAL_MARKETING,
+    BRANDING,
+    SALES,
+    SALES_TECHNIQUES,
+    B2B_TACTICS,
+    B2C_TACTICS,
+    SEO,
+    GOOGLE_ANALYTICS,
+    ECOMMERCE_PLATFORMS,
+
+    // LEADERSHIP & MANAGEMENT
+    LEADERSHIP,
+    PEOPLE_MANAGEMENT,
+    TEAM_BUILDING,
+    DELEGATION,
+    CONFLICT_RESOLUTION,
+    DECISION_MAKING,
+    PERFORMANCE_EVALUATION,
+    CHANGE_MANAGEMENT,
+
+    // SOFT SKILLS / PERSONAL EFFECTIVENESS
+    COMMUNICATION,
+    EMOTIONAL_INTELLIGENCE,
+    TIME_MANAGEMENT,
+    ADAPTABILITY,
+    CRITICAL_THINKING,
+    CREATIVITY,
+    PROBLEM_SOLVING,
+
+    // ENTREPRENEURSHIP
+    OPPORTUNITY_IDENTIFICATION,
+    FUNDRAISING_CAPITAL,
+    INNOVATION_MANAGEMENT,
+
+    // TECH & DIGITAL TOOLS
+    AI_TOOLS,
+
+    // LEGAL & ETHICS
+    BUSINESS_LAW,
+    BUSINESS_ETHICS
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/exception/ResourceAlreadyExistsException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/ResourceAlreadyExistsException.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/exception/ResourceAlreadyExistsException.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,7 @@
+package com.shifterwebapp.shifter.exception;
+
+public class ResourceAlreadyExistsException extends RuntimeException {
+    public ResourceAlreadyExistsException(String message) {
+        super(message);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/exception/ResourceNotFoundException.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/ResourceNotFoundException.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/exception/ResourceNotFoundException.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,7 @@
+package com.shifterwebapp.shifter.exception;
+
+public class ResourceNotFoundException extends RuntimeException {
+    public ResourceNotFoundException(String message) {
+        super(message);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -2,6 +2,6 @@
 
 import com.shifterwebapp.shifter.enrollment.Enrollment;
-import com.shifterwebapp.shifter.payment.enums.PaymentMethod;
-import com.shifterwebapp.shifter.payment.enums.PaymentStatus;
+import com.shifterwebapp.shifter.enums.PaymentMethod;
+import com.shifterwebapp.shifter.enums.PaymentStatus;
 import com.shifterwebapp.shifter.user.User;
 import jakarta.persistence.*;
@@ -26,6 +26,8 @@
     private Date date;
 
+    @Enumerated(EnumType.STRING)
     private PaymentMethod paymentMethod;
 
+    @Enumerated(EnumType.STRING)
     private PaymentStatus paymentStatus;
 
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentController.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentController.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,22 @@
+package com.shifterwebapp.shifter.payment;
+
+import com.shifterwebapp.shifter.payment.service.PaymentService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("${api.base.path}/payment")
+public class PaymentController {
+
+    private final PaymentService paymentService;
+
+    @GetMapping
+    public ResponseEntity<?> getPaymentsByUser(@RequestParam("userId") Long userId) {
+        List<PaymentDto> paymentDtos = paymentService.getPaymentsByUser(userId);
+        return ResponseEntity.ok(paymentDtos);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentDto.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentDto.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,6 +1,6 @@
 package com.shifterwebapp.shifter.payment;
 
-import com.shifterwebapp.shifter.payment.enums.PaymentMethod;
-import com.shifterwebapp.shifter.payment.enums.PaymentStatus;
+import com.shifterwebapp.shifter.enums.PaymentMethod;
+import com.shifterwebapp.shifter.enums.PaymentStatus;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -14,4 +14,6 @@
 public class PaymentDto {
 
+    private Long id;
+
     private Float amount;
 
@@ -21,6 +23,4 @@
 
     private PaymentStatus paymentStatus;
-
-    private Integer enrollmentId;
 }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,18 @@
+package com.shifterwebapp.shifter.payment;
+
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface PaymentMapper {
+
+    PaymentDto toDto(Payment payment);
+    List<PaymentDto> toDto(List<Payment> payments);
+
+    @InheritInverseConfiguration
+    Payment toEntity(PaymentDto paymentDto);
+    @InheritInverseConfiguration
+    List<Payment> toEntity(List<PaymentDto> paymentDtos);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentRepository.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/PaymentRepository.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -2,5 +2,26 @@
 
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
 
 public interface PaymentRepository extends JpaRepository<Payment, Long> {
+
+    List<Payment> findPaymentByUser_Id(Long userId);
+
+    @Query("select p from Payment p where p.enrollment.course.id = :courseId")
+    List<Payment> findPaymentByCourse(@Param("courseId") Long courseId);
+
+    @Query("select sum(p.amount) from Payment p where p.enrollment.course.id = :courseId")
+    Double findTotalRevenueByCourse(@Param("courseId") Long courseId);
+
+    @Query("select sum(p.amount) from Payment p where p.enrollment.course.id = :courseId and function('month', p.date) = :month and function('year', p.date) = :year")
+    Double findTotalMonthlyRevenueByCourse(@Param("courseId") Long courseId, @Param("month") Integer month, @Param("year") Integer year);
+
+    @Query("select sum(p.amount) from Payment p where p.enrollment.course.id = :courseId and function('year', p.date) = :year")
+    Double findTotalYearlyRevenueByCourse(@Param("courseId") Long courseId, @Param("year") Integer year);
+
+    @Query("select case when p.paymentStatus = 'COMPLETED' then true else false end from Payment p where p.user.id = :userId and p.enrollment.course.id = :courseId")
+    Boolean findHasUserPaidForCourse(@Param("userId") Long userId, @Param("courseId") Long courseId);
 }
Index: ckend/src/main/java/com/shifterwebapp/shifter/payment/enums/PaymentMethod.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/enums/PaymentMethod.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.payment.enums;
-
-public enum PaymentMethod {
-    CARD,
-    PAYPAL,
-    CASYS
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/payment/enums/PaymentStatus.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/enums/PaymentStatus.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package com.shifterwebapp.shifter.payment.enums;
-
-public enum PaymentStatus {
-    PENDING,
-    COMPLETED,
-    FAILED
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/service/ImplPaymentService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -2,5 +2,5 @@
 
 import com.shifterwebapp.shifter.payment.PaymentDto;
-import com.shifterwebapp.shifter.payment.enums.PaymentMethod;
+import com.shifterwebapp.shifter.enums.PaymentMethod;
 
 import java.util.List;
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/service/PaymentService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,4 +1,119 @@
 package com.shifterwebapp.shifter.payment.service;
 
-public class PaymentService {
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.course.Course;
+import com.shifterwebapp.shifter.course.CourseRepository;
+import com.shifterwebapp.shifter.enrollment.Enrollment;
+import com.shifterwebapp.shifter.enrollment.EnrollmentRepository;
+import com.shifterwebapp.shifter.payment.Payment;
+import com.shifterwebapp.shifter.payment.PaymentDto;
+import com.shifterwebapp.shifter.payment.PaymentMapper;
+import com.shifterwebapp.shifter.payment.PaymentRepository;
+import com.shifterwebapp.shifter.enums.PaymentMethod;
+import com.shifterwebapp.shifter.enums.PaymentStatus;
+import com.shifterwebapp.shifter.user.User;
+import com.shifterwebapp.shifter.user.UserRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class PaymentService implements ImplPaymentService {
+
+    private final PaymentRepository paymentRepository;
+    private final PaymentMapper paymentMapper;
+    private final UserRepository userRepository;
+    private final EnrollmentRepository enrollmentRepository;
+    private final CourseRepository courseRepository;
+    private final Validate validate;
+
+    @Override
+    public List<PaymentDto> getPaymentsByUser(Long userId) {
+        validate.validateUserExists(userId);
+        List<Payment> payments = paymentRepository.findPaymentByUser_Id(userId);
+        return paymentMapper.toDto(payments);
+    }
+
+    @Override
+    public List<PaymentDto> getPaymentsByCourse(Long courseId) {
+        validate.validateCourseExists(courseId);
+        List<Payment> payments = paymentRepository.findPaymentByCourse(courseId);
+        return paymentMapper.toDto(payments);
+    }
+
+    @Override
+    public Double getTotalRevenueByCourse(Long courseId) {
+        validate.validateCourseExists(courseId);
+        return paymentRepository.findTotalRevenueByCourse(courseId);
+    }
+
+    @Override
+    public Double getTotalMonthlyRevenueByCourse(Long courseId, Integer month, Integer year) {
+        validate.validateCourseExists(courseId);
+        return paymentRepository.findTotalMonthlyRevenueByCourse(courseId, month, year);
+    }
+
+    @Override
+    public Double getTotalYearlyRevenueByCourse(Long courseId, Integer year) {
+        validate.validateCourseExists(courseId);
+        return paymentRepository.findTotalYearlyRevenueByCourse(courseId, year);
+    }
+
+    @Override
+    public Boolean hasUserPaidForCourse(Long userId, Long courseId) {
+        validate.validateCourseExists(courseId);
+        validate.validateUserExists(userId);
+        return paymentRepository.findHasUserPaidForCourse(userId, courseId);
+    }
+
+    @Override
+    public PaymentDto initiatePayment(Long userId, Long courseId, PaymentMethod paymentMethod) {
+        validate.validateUserExists(userId);
+        validate.validateCourseExists(courseId);
+
+        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 payment = Payment.builder()
+                .paymentStatus(PaymentStatus.PENDING)
+                .paymentMethod(paymentMethod)
+                .date(new Date())
+                .user(user)
+                .enrollment(new Enrollment())
+                .amount(course.getPrice())
+                .build();
+
+        paymentRepository.save(payment);
+
+        return paymentMapper.toDto(payment);
+    }
+
+    @Override
+    public PaymentDto completePayment(Long paymentId) {
+        validate.validatePaymentExists(paymentId);
+        Payment payment = paymentRepository.findById(paymentId).orElseThrow();
+        payment.setPaymentStatus(PaymentStatus.COMPLETED);
+        paymentRepository.save(payment);
+
+        return paymentMapper.toDto(payment);
+    }
+
+    @Override
+    public PaymentDto failPayment(Long paymentId) {
+        validate.validatePaymentExists(paymentId);
+        Payment payment = paymentRepository.findById(paymentId).orElseThrow();
+        payment.setPaymentStatus(PaymentStatus.FAILED);
+        paymentRepository.save(payment);
+
+        return paymentMapper.toDto(payment);
+    }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/ReviewController.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,45 @@
+package com.shifterwebapp.shifter.review;
+
+import com.shifterwebapp.shifter.review.service.ReviewService;
+import com.shifterwebapp.shifter.user.UserDto;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("${api.base.path}/review")
+public class ReviewController {
+
+    private final ReviewService reviewService;
+
+    @GetMapping("/{reviewId}")
+    public ResponseEntity<ReviewDto> getReviewById(@PathVariable Long reviewId) {
+        ReviewDto reviewDto = reviewService.getReviewById(reviewId);
+        return ResponseEntity.ok(reviewDto);
+    }
+
+    @GetMapping("/{courseId}")
+    public ResponseEntity<List<ReviewDto>> getReviewByCourse(@PathVariable Long courseId) {
+        List<ReviewDto> reviewDtos = reviewService.getReviewsByCourse(courseId);
+        return ResponseEntity.ok(reviewDtos);
+    }
+
+    @GetMapping("/{userId}")
+    public ResponseEntity<List<ReviewDto>> getReviewByUser(@PathVariable Long userId) {
+        List<ReviewDto> reviewDtos = reviewService.getReviewsByUser(userId);
+        return ResponseEntity.ok(reviewDtos);
+    }
+
+    @PostMapping
+    public ResponseEntity<?> writeReview(@RequestParam Long enrollmentId, @RequestBody ReviewDto reviewDto) {
+        try {
+            ReviewDto savedReviewDto = reviewService.writeReview(enrollmentId, reviewDto);
+            return ResponseEntity.ok(savedReviewDto);
+        } catch (Exception e) {
+            return ResponseEntity.badRequest().body(e.getMessage());
+        }
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/review/ReviewMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/ReviewMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,19 @@
+package com.shifterwebapp.shifter.review;
+
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface ReviewMapper {
+
+    ReviewDto toDto(Review review);
+    List<ReviewDto> toDto(List<Review> review);
+
+    @InheritInverseConfiguration
+    Review toEntity(ReviewDto reviewDto);
+    @InheritInverseConfiguration
+    List<Review> toEntity(List<ReviewDto> reviewDtos);
+}
+
Index: backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/ReviewRepository.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -2,5 +2,22 @@
 
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
 
 public interface ReviewRepository extends JpaRepository<Review, Long> {
+
+    @Query("select AVG(r.rating) from Review r where r.enrollment.course.id = :courseId")
+    Float findAverageRatingByCourse(@Param("courseId") Long courseId);
+
+    @Query("select r from Review r where r.enrollment.course.id = :courseId")
+    List<Review> findReviewsByCourse(@Param("courseId") Long courseId);
+
+    @Query("select r from Review r where r.enrollment.payment.user.id = :userId")
+    List<Review> findReviewsByUser(@Param("userId") Long userId);
+
+    @Query("select case when count(r) > 0 then true else false end" +
+            " from Review r where r.enrollment.payment.user.id = :userId and r.enrollment.course.id = :userId")
+    Boolean findHasBeenReviewedByUser(@Param("userId") Long userId, @Param("courseId") Long courseId);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/service/ImplReviewService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -11,4 +11,6 @@
     Float getAverageRatingByCourse(Long courseId);
 
-    Boolean hasBeenReviewedByUser(Long userId);
+    ReviewDto writeReview(Long enrollmentId, ReviewDto reviewDto);
+
+    Boolean hasBeenReviewedByUser(Long userId, Long courseId);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/service/ReviewService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,4 +1,85 @@
 package com.shifterwebapp.shifter.review.service;
 
-public class ReviewService {
+import com.shifterwebapp.shifter.enrollment.Enrollment;
+import com.shifterwebapp.shifter.enrollment.EnrollmentRepository;
+import com.shifterwebapp.shifter.enums.EnrollmentStatus;
+import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
+import com.shifterwebapp.shifter.review.Review;
+import com.shifterwebapp.shifter.review.ReviewDto;
+import com.shifterwebapp.shifter.review.ReviewMapper;
+import com.shifterwebapp.shifter.review.ReviewRepository;
+import com.shifterwebapp.shifter.Validate;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class ReviewService implements ImplReviewService {
+
+    private final ReviewRepository reviewRepository;
+    private final ReviewMapper reviewMapper;
+    private final Validate validate;
+    private final EnrollmentRepository enrollmentRepository;
+
+    @Override
+    public ReviewDto getReviewById(Long id) {
+        Review review = reviewRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Review with id " + id + " not found"));
+        return reviewMapper.toDto(review);
+    }
+
+    @Override
+    public List<ReviewDto> getReviewsByCourse(Long courseId) {
+        validate.validateCourseExists(courseId);
+        List<Review> reviews = reviewRepository.findReviewsByCourse(courseId);
+        return reviewMapper.toDto(reviews);
+    }
+
+    @Override
+    public List<ReviewDto> getReviewsByUser(Long userId) {
+        validate.validateUserExists(userId);
+        List<Review> reviews = reviewRepository.findReviewsByUser(userId);
+        return reviewMapper.toDto(reviews);
+    }
+
+    @Override
+    public Float getAverageRatingByCourse(Long courseId) {
+        validate.validateCourseExists(courseId);
+        Float avgRating = reviewRepository.findAverageRatingByCourse(courseId);
+        return avgRating != null ? avgRating : 0f;
+    }
+
+    @Override
+    public ReviewDto writeReview(Long enrollmentId, ReviewDto reviewDto) {
+        validate.validateEnrollmentExists(enrollmentId);
+
+        Enrollment enrollment = enrollmentRepository.findById(enrollmentId).orElseThrow();
+        if (enrollment.getReview() != null) {
+            throw new RuntimeException("Review already submitted for enrollment with ID " + enrollmentId + "!");
+        }
+        if (enrollment.getEnrollmentStatus() != EnrollmentStatus.COMPLETED) {
+            throw new RuntimeException("Cannot review a course that has not been completed by user!");
+        }
+
+        Review review = Review.builder()
+                .rating(reviewDto.getRating())
+                .comment(reviewDto.getComment())
+                .canBeUsedAsTestimonial(reviewDto.getCanBeUsedAsTestimonial())
+                .enrollment(enrollment)
+                .date(new Date())
+                .build();
+
+        reviewRepository.save(review);
+
+        return reviewMapper.toDto(review);
+    }
+
+    @Override
+    public Boolean hasBeenReviewedByUser(Long userId, Long courseId) {
+        validate.validateUserExists(userId);
+        validate.validateCourseExists(courseId);
+        return reviewRepository.findHasBeenReviewedByUser(userId, courseId);
+    }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/user/PasswordUtil.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/PasswordUtil.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/PasswordUtil.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,13 @@
+package com.shifterwebapp.shifter.user;
+
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+public class PasswordUtil {
+
+    private static final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+
+    public static String hashPassword(String plainPassword) {
+        return passwordEncoder.encode(plainPassword);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/user/User.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -3,7 +3,7 @@
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.shifterwebapp.shifter.payment.Payment;
-import com.shifterwebapp.shifter.user.enums.CompanyType;
-import com.shifterwebapp.shifter.user.enums.Interests;
-import com.shifterwebapp.shifter.user.enums.Skills;
+import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
 import jakarta.persistence.*;
 import lombok.*;
@@ -54,6 +54,6 @@
     private List<Integer> favoriteCourses;
 
-    @OneToMany(mappedBy = "user")       // Maybe CascadeType.PERSIST ????
-    private List<Payment> payments;
+    @OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST, orphanRemoval = true)
+    private List<Payment> payments;             // WHEN DELETING USER SET PAYMENTS TO NULL, BECAUSE PAYMENTS DONT GET DELETED
 }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,119 @@
+package com.shifterwebapp.shifter.user;
+
+import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
+import com.shifterwebapp.shifter.payment.Payment;
+import com.shifterwebapp.shifter.user.service.UserService;
+import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("${api.base.path}/user")
+public class UserController {
+
+    private final UserService userService;
+
+    @GetMapping("/{userId}")
+    public ResponseEntity<UserDto> getUser(@PathVariable Long userId) {
+        UserDto userDto = userService.getUserById(userId);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PostMapping
+    public ResponseEntity<?> createUser(@RequestBody UserDto userDto) {
+        try {
+            UserDto savedUserDto = userService.createUser(userDto);
+            return ResponseEntity.ok(savedUserDto);
+        } catch (Exception e) {
+            return ResponseEntity.badRequest().body(e.getMessage());
+        }
+    }
+
+    @DeleteMapping("/{userId}")
+    public ResponseEntity<Void> deleteUser(@PathVariable Long userId) {
+        userService.deleteUser(userId);
+        return ResponseEntity.noContent().build();
+    }
+
+    @PutMapping("/{userId}/name")
+    public ResponseEntity<?> updateName(@PathVariable Long userId, @RequestParam String newName) {
+        UserDto userDto = userService.updateName(userId, newName);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/mail")
+    public ResponseEntity<?> updateMail(@PathVariable Long userId, @RequestParam String newMail) {
+        UserDto userDto = userService.updateMail(userId, newMail);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/password")
+    public ResponseEntity<?> updatePassword(@PathVariable Long userId, @RequestParam String newPassword) {
+        UserDto userDto = userService.updatePassword(userId, newPassword);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/work-position")
+    public ResponseEntity<?> updateWorkPosition(@PathVariable Long userId, @RequestParam String newWorkPosition) {
+        UserDto userDto = userService.updateWorkPosition(userId, newWorkPosition);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/company-type")
+    public ResponseEntity<?> updateCompanyType(@PathVariable Long userId, @RequestParam CompanyType newCompanyType) {
+        UserDto userDto = userService.updateCompanyType(userId, newCompanyType);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/add/interest")
+    public ResponseEntity<?> addInterest(@PathVariable Long userId, @RequestParam Interests newInterest) {
+        UserDto userDto = userService.addInterest(userId, newInterest);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/add/skill")
+    public ResponseEntity<?> addSkill(@PathVariable Long userId, @RequestParam Skills newSkill) {
+        UserDto userDto = userService.addSkill(userId, newSkill);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/add/skill-gap")
+    public ResponseEntity<?> addSkillGap(@PathVariable Long userId, @RequestParam Skills newSkillGap) {
+        UserDto userDto = userService.addSkillGap(userId, newSkillGap);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/add/favorite-course")
+    public ResponseEntity<?> addFavoriteCourse(@PathVariable Long userId, @RequestParam Integer newFavoriteCourse) {
+        UserDto userDto = userService.addFavoriteCourse(userId, newFavoriteCourse);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/remove/interest")
+    public ResponseEntity<?> removeInterest(@PathVariable Long userId, @RequestParam Interests oldInterest) {
+        UserDto userDto = userService.removeInterest(userId, oldInterest);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/remove/skill")
+    public ResponseEntity<?> removeSkill(@PathVariable Long userId, @RequestParam Skills oldSkill) {
+        UserDto userDto = userService.removeSkill(userId, oldSkill);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/remove/skill-gap")
+    public ResponseEntity<?> removeSkillGap(@PathVariable Long userId, @RequestParam Skills oldSkillGap) {
+        UserDto userDto = userService.removeSkillGap(userId, oldSkillGap);
+        return ResponseEntity.ok(userDto);
+    }
+
+    @PutMapping("/{userId}/remove/favorite-course")
+    public ResponseEntity<?> removeFavoriteCourse(@PathVariable Long userId, @RequestParam Integer oldFavoriteCourse) {
+        UserDto userDto = userService.removeFavoriteCourse(userId, oldFavoriteCourse);
+        return ResponseEntity.ok(userDto);
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -2,7 +2,7 @@
 
 import com.shifterwebapp.shifter.payment.PaymentDto;
-import com.shifterwebapp.shifter.user.enums.CompanyType;
-import com.shifterwebapp.shifter.user.enums.Interests;
-import com.shifterwebapp.shifter.user.enums.Skills;
+import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -15,5 +15,10 @@
 @AllArgsConstructor
 public class UserDto {
+
+    private Long id;
+
     private String email;
+
+    private String password;
 
     private String name;
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserMapper.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,20 @@
+package com.shifterwebapp.shifter.user;
+
+import com.shifterwebapp.shifter.course.Course;
+import com.shifterwebapp.shifter.course.CourseDto;
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface UserMapper {
+
+    UserDto toDto(User user);
+    List<UserDto> toDto(List<User> users);
+
+    @InheritInverseConfiguration
+    User toEntity(UserDto userDto);
+    @InheritInverseConfiguration
+    List<User> toEntity(List<UserDto> userDtos);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -4,3 +4,5 @@
 
 public interface UserRepository extends JpaRepository<User, Long> {
+
+    boolean existsUserByEmail(String email);
 }
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/enums/CompanyType.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/enums/CompanyType.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ 	(revision )
@@ -1,10 +1,0 @@
-package com.shifterwebapp.shifter.user.enums;
-
-public enum CompanyType {
-    FREELANCE,
-    STARTUP,
-    SME,
-    MIDMARKET,
-    ENTERPRISE,
-    OTHER
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/enums/Interests.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/enums/Interests.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ 	(revision )
@@ -1,15 +1,0 @@
-package com.shifterwebapp.shifter.user.enums;
-
-public enum Interests {
-    SALES_STRATEGIES,
-    MARKETING,
-    LEADERSHIP,
-    MANAGEMENT,
-    DIGITAL_TRANSFORMATION,
-    BUSINESS_TRANSFORMATION,
-    ENTREPRENEURSHIP,
-    STARTUP,
-    SALES,
-    NEGOTIATION,
-    FINANCE_FOR_BUSINESS
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/user/enums/Skills.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/enums/Skills.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package com.shifterwebapp.shifter.user.enums;
-
-public enum Skills {
-    COMMUNICATION,
-    STRATEGIC_PLANING,
-    LEADERSHIP,
-    SALES_TECHNIQUES,
-    SALES,
-    NEGOTIATION,
-    MARKETING,
-    PROBLEM_SOLVING,
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -5,7 +5,7 @@
 import com.shifterwebapp.shifter.review.ReviewDto;
 import com.shifterwebapp.shifter.user.UserDto;
-import com.shifterwebapp.shifter.user.enums.CompanyType;
-import com.shifterwebapp.shifter.user.enums.Interests;
-import com.shifterwebapp.shifter.user.enums.Skills;
+import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
 
 import java.util.List;
@@ -15,12 +15,10 @@
     UserDto getUserById(Long id);
 
-    List<CourseDto> getAllBoughtCourses(Long id);
-    CourseDto getBoughtCourse(Long userId, Long courseId);
-    List<ReviewDto> getAllReviews(Long id);
-    ReviewDto getReview(Long userId, Long reviewId);
+    UserDto createUser(UserDto userDto);
+    void deleteUser(Long id);
 
     UserDto updateName(Long id, String newName);
     UserDto updateMail(Long id, String newMail);
-    UserDto updatePass(Long id, String newPassHash);
+    UserDto updatePassword(Long id, String newPassHash);
     UserDto updateWorkPosition(Long id, String newWorkPosition);
     UserDto updateCompanyType(Long id, CompanyType newCompanyType);
@@ -28,6 +26,7 @@
     UserDto addInterest(Long id, Interests newInterest);
     UserDto addSkill(Long id, Skills newSkill);
+    UserDto addSkills(Long id, List<Skills> newSkills);
     UserDto addSkillGap(Long id, Skills newSkillGap);
-    UserDto addFavoriteCourse(Long id, Interests newFavoriteCourseId);
+    UserDto addFavoriteCourse(Long id, Integer newFavoriteCourseId);
     UserDto addPoints(Long id, Integer newPointsAchieved);
     UserDto addPayment(Long id, Payment newPayment);
@@ -36,5 +35,6 @@
     UserDto removeSkill(Long id, Skills removeSkill);
     UserDto removeSkillGap(Long id, Skills removeSkillGap);
-    UserDto removeFavoriteCourse(Long id, Interests removeFavoriteCourseId);
+    UserDto removeSkillGaps(Long id, List<Skills> removeSkillGaps);
+    UserDto removeFavoriteCourse(Long id, Integer removeFavoriteCourseId);
     UserDto removePoints(Long id, Integer removePointsAchieved);
     UserDto removePayment(Long id, Payment removePayment);
Index: backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -1,4 +1,266 @@
 package com.shifterwebapp.shifter.user.service;
 
-public class UserService {
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.course.CourseDto;
+import com.shifterwebapp.shifter.enums.CompanyType;
+import com.shifterwebapp.shifter.enums.Interests;
+import com.shifterwebapp.shifter.enums.Skills;
+import com.shifterwebapp.shifter.payment.Payment;
+import com.shifterwebapp.shifter.review.ReviewDto;
+import com.shifterwebapp.shifter.user.*;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class UserService implements ImplUserService {
+
+    private final UserRepository userRepository;
+    private final UserMapper userMapper;
+    private final Validate validate;
+
+    @Override
+    public List<UserDto> getAllUsers() {
+        List<User> users = userRepository.findAll();
+        return userMapper.toDto(users);
+    }
+
+    @Override
+    public UserDto getUserById(Long userId) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto createUser(UserDto userDto) {
+        if (userRepository.existsUserByEmail(userDto.getEmail())) {
+            throw new RuntimeException("Email already in use");
+        }
+
+        User user = User.builder()
+                .name(userDto.getName())
+                .email(userDto.getEmail())
+                .passwordHash(PasswordUtil.hashPassword(userDto.getPassword()))
+                .isAdmin(false)
+                .companyType(userDto.getCompanyType())
+                .workPosition(userDto.getWorkPosition())
+                .interests(userDto.getInterests())
+                .skills(userDto.getSkills())
+                .skillGap(userDto.getSkillGap())
+                .points(userDto.getPoints() != null ? userDto.getPoints() : 0)
+                .favoriteCourses(userDto.getFavoriteCourses())
+                .build();
+
+        return userMapper.toDto(userRepository.save(user));
+    }
+
+    @Override
+    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);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto updateMail(Long userId, String newMail) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        user.setEmail(newMail);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto updatePassword(Long userId, String newPass) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        user.setPasswordHash(PasswordUtil.hashPassword(newPass));
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto updateWorkPosition(Long userId, String newWorkPosition) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        user.setWorkPosition(newWorkPosition);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto updateCompanyType(Long userId, CompanyType newCompanyType) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        user.setCompanyType(newCompanyType);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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)) {
+                user.getSkills().add(skill);
+            }
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto addFavoriteCourse(Long userId, Integer newFavoriteCourseId) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        if (!user.getFavoriteCourses().contains(newFavoriteCourseId)) {
+            user.getFavoriteCourses().add(newFavoriteCourseId);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto addPoints(Long userId, Integer newPointsAchieved) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        Integer newPoints = user.getPoints() + newPointsAchieved;
+        user.setPoints(newPoints);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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)) {
+                user.getSkillGap().remove(skill);
+            }
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    public UserDto removePoints(Long userId, Integer removePointsAchieved) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        Integer newPoints = user.getPoints() - removePointsAchieved;
+        user.setPoints(newPoints);
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
+
+    @Override
+    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);
+        }
+        userRepository.save(user);
+        return userMapper.toDto(user);
+    }
 }
Index: backend/src/main/resources/application.properties
===================================================================
--- backend/src/main/resources/application.properties	(revision d061aac450daa79ad7e43ae505b0db48a22e27a4)
+++ backend/src/main/resources/application.properties	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -7,2 +7,4 @@
 spring.jpa.show-sql=true
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+
+api.base.path=/api
Index: backend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java
===================================================================
--- backend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,119 @@
+package com.shifterwebapp.shifter.unittests;
+
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.course.Course;
+import com.shifterwebapp.shifter.course.CourseRepository;
+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.enrollment.service.EnrollmentService;
+import com.shifterwebapp.shifter.payment.Payment;
+import com.shifterwebapp.shifter.payment.PaymentRepository;
+import com.shifterwebapp.shifter.enums.PaymentStatus;
+import com.shifterwebapp.shifter.user.User;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+@ExtendWith(MockitoExtension.class)
+public class TestEnrollmentService {
+    @Mock
+    EnrollmentRepository enrollmentRepository;
+    @Mock
+    CourseRepository courseRepository;
+    @Mock
+    PaymentRepository paymentRepository;
+    @Mock
+    EnrollmentMapper enrollmentMapper;
+    @Mock
+    Validate validate;
+    @InjectMocks
+    EnrollmentService enrollmentService;
+
+    Enrollment enrollment;
+
+    @BeforeEach
+    public void setUp() {
+        enrollment = Enrollment.builder()
+                .enrollmentStatus(EnrollmentStatus.PENDING)
+                .percentCompleted(0)
+                .date(new Date())
+                .payment(new Payment())
+                .review(null)
+                .course(new Course())
+                .build();
+    }
+
+    @Test
+    public void test_getEnrollmentsByUser() {
+        Long userId = 1L;
+
+        List<Enrollment> enrollments = List.of(enrollment);
+
+        List<EnrollmentDto> dtos = List.of(new EnrollmentDto());
+        dtos.get(0).setPercentCompleted(60);
+        dtos.get(0).setEnrollmentStatus(EnrollmentStatus.ACTIVE);
+
+
+        Mockito.when(enrollmentRepository.findEnrollmentsByUser(userId)).thenReturn(enrollments);
+        Mockito.doNothing().when(validate).validateUserExists(userId);
+        Mockito.when(enrollmentMapper.toDto(enrollments)).thenReturn(dtos);
+
+        List<EnrollmentDto> result = enrollmentService.getEnrollmentsByUser(userId);
+        Assertions.assertEquals(dtos, result);
+    }
+
+    @Test
+    public void test_updateEnrollmentStatus() {
+        Long enrollmentId = 1L;
+        EnrollmentStatus newEnrollmentStatus = EnrollmentStatus.COMPLETED;
+        EnrollmentDto dto = new EnrollmentDto();
+        dto.setPercentCompleted(60);
+        dto.setEnrollmentStatus(newEnrollmentStatus);
+
+        Mockito.when(enrollmentRepository.findById(enrollmentId)).thenReturn(Optional.of(enrollment));
+        Mockito.when(enrollmentRepository.save(enrollment)).thenReturn(null);
+        Mockito.when(enrollmentMapper.toDto(enrollment)).thenReturn(dto);
+
+        EnrollmentDto result = enrollmentService.updateEnrollmentStatus(enrollmentId, newEnrollmentStatus);
+
+        Assertions.assertEquals(dto, result);
+    }
+
+    @Test
+    public void test_enrollUser() {
+        Long courseId = 1L;
+        Long paymentId = 1L;
+        EnrollmentDto dto = new EnrollmentDto();
+        dto.setPercentCompleted(60);
+        dto.setEnrollmentStatus(EnrollmentStatus.ACTIVE);
+        Payment payment = Payment.builder()
+                .id(1L)
+                .paymentStatus(PaymentStatus.COMPLETED)
+                .user(new User())
+                .build();
+
+        Mockito.when(paymentRepository.findById(paymentId)).thenReturn(Optional.of(payment));
+        Mockito.doNothing().when(validate).validateCourseExists(courseId);
+        Mockito.doNothing().when(validate).validatePaymentExists(paymentId);
+        Mockito.doNothing().when(validate).validateUserExists(payment.getUser().getId());
+        Mockito.when(enrollmentRepository.findIsUserEnrolledInCourse(payment.getUser().getId(), courseId)).thenReturn(false);
+        Mockito.when(courseRepository.findById(courseId)).thenReturn(Optional.of(new Course()));
+        Mockito.when(enrollmentRepository.save(Mockito.any(Enrollment.class))).thenAnswer(arguments -> arguments.getArgument(0));
+        Mockito.when(enrollmentMapper.toDto(Mockito.any(Enrollment.class))).thenReturn(dto);
+
+        EnrollmentDto result = enrollmentService.enrollUser(courseId, paymentId);
+        Assertions.assertEquals(dto, result);
+    }
+}
Index: backend/src/test/java/com/shifterwebapp/shifter/unittests/TestReviewService.java
===================================================================
--- backend/src/test/java/com/shifterwebapp/shifter/unittests/TestReviewService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
+++ backend/src/test/java/com/shifterwebapp/shifter/unittests/TestReviewService.java	(revision 8a426f988b1fd1d0841e7a45b8db71b44ad54ce9)
@@ -0,0 +1,90 @@
+package com.shifterwebapp.shifter.unittests;
+
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.enrollment.Enrollment;
+import com.shifterwebapp.shifter.review.ReviewMapper;
+import com.shifterwebapp.shifter.review.ReviewRepository;
+import com.shifterwebapp.shifter.review.Review;
+import com.shifterwebapp.shifter.review.ReviewDto;
+import com.shifterwebapp.shifter.review.service.ReviewService;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.util.Date;
+import java.util.Optional;
+
+@ExtendWith(MockitoExtension.class)
+public class TestReviewService {
+
+    @Mock
+    ReviewRepository reviewRepository;
+    @Mock
+    ReviewMapper reviewMapper;
+    @Mock
+    Validate validate;
+    @InjectMocks
+    ReviewService reviewService;
+
+    Review review;
+
+    @BeforeEach
+    public void setUp() {
+        review = Review.builder()
+                .id(1L)
+                .rating(5)
+                .comment("Comment")
+                .canBeUsedAsTestimonial(true)
+                .date(new Date())
+                .enrollment(new Enrollment())
+                .build();
+    }
+
+    @Test
+    public void test_getReviewById() {
+        ReviewDto dto = new ReviewDto();
+        dto.setId(1L);
+        dto.setRating(5);
+        dto.setComment("Comment");
+        dto.setCanBeUsedAsTestimonial(true);
+
+        Mockito.when(reviewRepository.findById(1L)).thenReturn(Optional.of(review));
+        Mockito.when(reviewMapper.toDto(review)).thenReturn(dto);
+
+        ReviewDto result = reviewService.getReviewById(1L);
+        Assertions.assertNotNull(result);
+        Assertions.assertEquals(1L, result.getId());
+        Assertions.assertEquals(5, result.getRating());
+        Assertions.assertEquals("Comment", result.getComment());
+        Assertions.assertEquals(true, result.getCanBeUsedAsTestimonial());
+    }
+
+    @Test
+    public void test_getAverageRatingByCourse() {
+        Long courseId = 1L;
+
+        Mockito.when(reviewRepository.findAverageRatingByCourse(courseId)).thenReturn(5F);
+        Mockito.doNothing().when(validate).validateCourseExists(courseId);
+
+        Float result = reviewService.getAverageRatingByCourse(courseId);
+        Assertions.assertEquals(result, 5F);
+    }
+
+    @Test
+    public void test_hasBeenReviewedByUser() {
+        Long courseId = 1L;
+        Long userId = 1L;
+
+        Mockito.when(reviewRepository.findHasBeenReviewedByUser(userId, courseId)).thenReturn(true);
+        Mockito.doNothing().when(validate).validateUserExists(userId);
+        Mockito.doNothing().when(validate).validateCourseExists(courseId);
+
+        Boolean result = reviewService.hasBeenReviewedByUser(userId, courseId);
+        Assertions.assertEquals(true, result);
+    }
+}
