Index: backend/pom.xml
===================================================================
--- backend/pom.xml	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/pom.xml	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -15,7 +15,4 @@
 	<description>Shifter</description>
 	<url/>
-	<licenses>
-		<license/>
-	</licenses>
 	<developers>
 		<developer>
@@ -24,13 +21,20 @@
 		</developer>
 	</developers>
-	<scm>
-		<connection/>
-		<developerConnection/>
-		<tag/>
-		<url/>
-	</scm>
 	<properties>
 		<java.version>17</java.version>
 	</properties>
+
+	<!-- AWS SDK BOM to manage versions consistently -->
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>software.amazon.awssdk</groupId>
+				<artifactId>bom</artifactId>
+				<version>2.25.13</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
 
 	<dependencies>
@@ -124,4 +128,13 @@
 		</dependency>
 
+<!--		Amazon web services-->
+		<dependency>
+			<groupId>software.amazon.awssdk</groupId>
+			<artifactId>s3</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>software.amazon.awssdk</groupId>
+			<artifactId>auth</artifactId>
+		</dependency>
 	</dependencies>
 
Index: backend/src/main/java/com/shifterwebapp/shifter/Validate.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/Validate.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/Validate.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,4 +1,5 @@
 package com.shifterwebapp.shifter;
 
+import com.shifterwebapp.shifter.auth.CustomAuthDetails;
 import com.shifterwebapp.shifter.course.CourseRepository;
 import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
@@ -36,4 +37,18 @@
     }
 
+    public void validateUserIsAdmin(Authentication authentication) {
+        validateUserIsAuthenticated(authentication);
+        Object detailsObj = authentication.getDetails();
+        if (detailsObj instanceof CustomAuthDetails details) {
+            Long userId = details.getUserId();
+            boolean isAdmin = userRepository.isAdmin(userId);
+            if (!isAdmin) {
+                throw new UnauthorizedException("User is not an admin");
+            }
+        } else {
+            throw new UnauthorizedException("User is not an admin");
+        }
+    }
+
 
     public void validateCourseExists(Long courseId) {
Index: backend/src/main/java/com/shifterwebapp/shifter/auth/RegisterDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/auth/RegisterDto.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/auth/RegisterDto.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -2,6 +2,4 @@
 
 import com.shifterwebapp.shifter.enums.CompanyType;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
 import jakarta.validation.constraints.Email;
 import jakarta.validation.constraints.NotBlank;
@@ -27,6 +25,6 @@
     private String workPosition;
 
-    private List<Interests> interests;
+    private List<String> interests;
 
-    private List<Skills> desiredSkills;
+    private List<String> desiredSkills;
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/course/AdminCourseController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/AdminCourseController.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/AdminCourseController.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,63 @@
+package com.shifterwebapp.shifter.course;
+
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.course.service.CourseService;
+import com.shifterwebapp.shifter.upload.S3Service;
+import com.shifterwebapp.shifter.upload.S3UploadResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("${api.admin.path}/courses")
+@CrossOrigin
+public class AdminCourseController {
+
+    private final CourseService courseService;
+    private final Validate validate;
+    private final S3Service s3Service;
+
+    @PostMapping("/create")
+    public ResponseEntity<Long> createCourse(@RequestBody String courseJson, Authentication authentication) throws IOException {
+        validate.validateUserIsAdmin(authentication);
+
+        Course course = courseService.createCourse(courseJson);
+        Long courseId = course.getId();
+
+        return ResponseEntity.ok(courseId);
+    }
+
+    @PostMapping("/{id}/upload")
+    public ResponseEntity<?> uploadCourseFiles(
+            @PathVariable("id") Long courseId,
+            @RequestParam("courseImage") MultipartFile courseImage,
+            @RequestParam("files") List<MultipartFile> files,
+            @RequestParam("types") List<String> types,
+            @RequestParam("meta") List<String> meta,
+            Authentication authentication
+    ) throws IOException {
+        validate.validateUserIsAdmin(authentication);
+
+        try {
+            List<S3UploadResponse> s3UploadResponse =
+                    s3Service.uploadCourseImageAndFiles(courseId, courseImage, files, types, meta);
+
+            Course finalCourse = courseService.updateCourseWithImagesAndFiles(courseId, s3UploadResponse);
+            System.out.println("Final course: " + finalCourse);
+
+            return ResponseEntity.ok(null);
+        } catch (Exception e) {
+            // Cleanup — remove course from DB if file upload fails
+            courseService.deleteCourseById(courseId);
+            System.err.println("Error uploading files. Rolling back course. Reason: " + e.getMessage());
+
+            return ResponseEntity.status(500).body("Course creation failed due to file upload error. Rolled back.");
+        }
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/Course.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/Course.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/Course.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -4,6 +4,4 @@
 import com.shifterwebapp.shifter.coursecontent.CourseContent;
 import com.shifterwebapp.shifter.enrollment.Enrollment;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
 import jakarta.persistence.*;
 import lombok.*;
@@ -19,6 +17,4 @@
 public class Course {
     @Id
-//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "course_seq")
-//    @SequenceGenerator(name = "course_seq", sequenceName = "course_sequence", allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
@@ -56,11 +52,11 @@
     private List<String> whatWillBeLearned;
 
-    @ElementCollection(targetClass = Skills.class)
-    @Enumerated(EnumType.STRING)
-    private List<Skills> skillsGained;
+    @ElementCollection
+    @Column(columnDefinition = "text")
+    private List<String> skillsGained;
 
-    @ElementCollection(targetClass = Interests.class)
-    @Enumerated(EnumType.STRING)
-    private List<Interests> topicsCovered;
+    @ElementCollection
+    @Column(columnDefinition = "text")
+    private List<String> topicsCovered;
     
     @OneToMany(mappedBy = "course", orphanRemoval = true)        // IS THIS GOOD BUSINESS LOGIC? SHOULD I HAVE CASCADES?
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseController.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -2,16 +2,15 @@
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.shifterwebapp.shifter.Validate;
 import com.shifterwebapp.shifter.auth.CustomAuthDetails;
+import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
 import com.shifterwebapp.shifter.course.service.CourseService;
 import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
 import com.shifterwebapp.shifter.enums.Difficulty;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
 import com.shifterwebapp.shifter.exception.ErrorResponse;
-import com.shifterwebapp.shifter.user.User;
-import com.shifterwebapp.shifter.user.service.UserService;
+import com.shifterwebapp.shifter.exception.ResourceNotFoundException;
+import com.shifterwebapp.shifter.upload.S3Service;
+import com.shifterwebapp.shifter.upload.S3UploadResponse;
 import lombok.RequiredArgsConstructor;
 import org.springframework.data.jpa.domain.Specification;
@@ -19,5 +18,8 @@
 import org.springframework.security.core.Authentication;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
@@ -30,57 +32,75 @@
     private final CourseService courseService;
     private final EnrollmentService enrollmentService;
+    private final Validate validate;
+    private final S3Service s3Service;
 
     @GetMapping
-    public ResponseEntity<?> getCourses(
-            @RequestParam(required = false) String search,
-            @RequestParam(required = false, name = "difficulty") List<Difficulty> difficulties,
-            @RequestParam(required = false, name = "price") List<String> prices,
-            @RequestParam(required = false, name = "duration") List<String> durations,
-            @RequestParam(required = false, name = "skill") List<Skills> skills,
-            @RequestParam(required = false, name = "topic") List<Interests> topics,
-            Authentication authentication
-            ) throws JsonProcessingException {
-        Specification<Course> spec = null;
-
-        if (search != null && !search.isEmpty()) {
-            spec = CourseSpecification.hasSearchLike(search);
-        }
-
-        if (difficulties != null && !difficulties.isEmpty()) {
-            spec = (spec == null) ? CourseSpecification.hasDifficulties(difficulties) : spec.and(CourseSpecification.hasDifficulties(difficulties));
-        }
-
-        if (prices != null && !prices.isEmpty()) {
-            spec = (spec == null) ? CourseSpecification.hasPricesBetween(prices) : spec.and(CourseSpecification.hasPricesBetween(prices));
-        }
-
-        if (durations != null && !durations.isEmpty()) {
-            spec = (spec == null) ? CourseSpecification.hasDurationBetween(durations) : spec.and(CourseSpecification.hasDurationBetween(durations));
-        }
-
-        if (skills != null && !skills.isEmpty()) {
-            spec = (spec == null) ? CourseSpecification.hasSkills(skills) : spec.and(CourseSpecification.hasSkills(skills));
-        }
-
-        if (topics != null && !topics.isEmpty()) {
-            spec = (spec == null) ? CourseSpecification.hasTopics(topics) : spec.and(CourseSpecification.hasTopics(topics));
-        }
-
+    public ResponseEntity<?> getCourses(Authentication authentication) {
+        List<Long> enrolledCourseIds = new ArrayList<>();
         if (authentication != null && authentication.isAuthenticated()) {
             Object detailsObj = authentication.getDetails();
             if (detailsObj instanceof CustomAuthDetails details) {
                 Long userId = details.getUserId();
-                List<Long> enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
-
-                if (enrolledCourseIds != null && !enrolledCourseIds.isEmpty()) {
-                    spec = (spec == null) ? CourseSpecification.idNotIn(enrolledCourseIds)
-                            : spec.and(CourseSpecification.idNotIn(enrolledCourseIds));
-                }
+                enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
             }
         }
 
-        List<CourseDtoPreview> courseDtos = courseService.getAllCourses(spec);
+        List<CourseDtoPreview> courseDtos = courseService.getAllCourses(enrolledCourseIds);
+
         return ResponseEntity.ok(courseDtos);
     }
+
+//    @GetMapping
+//    public ResponseEntity<?> getCourses(
+//            @RequestParam(required = false) String search,
+//            @RequestParam(required = false, name = "difficulty") List<Difficulty> difficulties,
+//            @RequestParam(required = false, name = "price") List<String> prices,
+//            @RequestParam(required = false, name = "duration") List<String> durations,
+//            @RequestParam(required = false, name = "skill") List<String> skills,
+//            @RequestParam(required = false, name = "topic") List<String> topics,
+//            Authentication authentication
+//            ) throws JsonProcessingException {
+//        Specification<Course> spec = null;
+//
+//        if (search != null && !search.isEmpty()) {
+//            spec = CourseSpecification.hasSearchLike(search);
+//        }
+//
+//        if (difficulties != null && !difficulties.isEmpty()) {
+//            spec = (spec == null) ? CourseSpecification.hasDifficulties(difficulties) : spec.and(CourseSpecification.hasDifficulties(difficulties));
+//        }
+//
+//        if (prices != null && !prices.isEmpty()) {
+//            spec = (spec == null) ? CourseSpecification.hasPricesBetween(prices) : spec.and(CourseSpecification.hasPricesBetween(prices));
+//        }
+//
+//        if (durations != null && !durations.isEmpty()) {
+//            spec = (spec == null) ? CourseSpecification.hasDurationBetween(durations) : spec.and(CourseSpecification.hasDurationBetween(durations));
+//        }
+//
+//        if (skills != null && !skills.isEmpty()) {
+//            spec = (spec == null) ? CourseSpecification.hasSkills(skills) : spec.and(CourseSpecification.hasSkills(skills));
+//        }
+//
+//        if (topics != null && !topics.isEmpty()) {
+//            spec = (spec == null) ? CourseSpecification.hasTopics(topics) : spec.and(CourseSpecification.hasTopics(topics));
+//        }
+//
+//        if (authentication != null && authentication.isAuthenticated()) {
+//            Object detailsObj = authentication.getDetails();
+//            if (detailsObj instanceof CustomAuthDetails details) {
+//                Long userId = details.getUserId();
+//                List<Long> enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
+//
+//                if (enrolledCourseIds != null && !enrolledCourseIds.isEmpty()) {
+//                    spec = (spec == null) ? CourseSpecification.idNotIn(enrolledCourseIds)
+//                            : spec.and(CourseSpecification.idNotIn(enrolledCourseIds));
+//                }
+//            }
+//        }
+//
+//        List<CourseDtoPreview> courseDtos = courseService.getAllCourses(spec);
+//        return ResponseEntity.ok(courseDtos);
+//    }
 
     @GetMapping("/recommended")
@@ -104,7 +124,5 @@
     @GetMapping("/enrolled")
     public ResponseEntity<?> getEnrolledCourses(Authentication authentication) {
-        if (authentication == null || !authentication.isAuthenticated()) {
-            return ResponseEntity.badRequest().body(new ErrorResponse("User not authenticated"));
-        }
+        validate.validateUserIsAuthenticated(authentication);
 
         Object detailsObj = authentication.getDetails();
@@ -125,11 +143,49 @@
 
     @GetMapping("/topics")
-    public ResponseEntity<List<Interests>> getAllTopics() {
+    public ResponseEntity<List<String>> getAllTopics() {
         return ResponseEntity.ok(courseService.getAllTopics());
     }
 
     @GetMapping("/skills")
-    public ResponseEntity<List<Skills>> getAllSkills() {
+    public ResponseEntity<List<String>> getAllSkills() {
         return ResponseEntity.ok(courseService.getAllSkills());
     }
+
+    @PostMapping("/create")
+    public ResponseEntity<Long> createCourse(@RequestBody String courseJson, Authentication authentication) throws IOException {
+        validate.validateUserIsAdmin(authentication);
+
+        Course course = courseService.createCourse(courseJson);
+        Long courseId = course.getId();
+
+        return ResponseEntity.ok(courseId);
+    }
+
+    @PostMapping("/{id}/upload")
+    public ResponseEntity<?> uploadCourseFiles(
+            @PathVariable("id") Long courseId,
+            @RequestParam("courseImage") MultipartFile courseImage,
+            @RequestParam("files") List<MultipartFile> files,
+            @RequestParam("types") List<String> types,
+            @RequestParam("meta") List<String> meta,
+            Authentication authentication
+    ) throws IOException {
+        validate.validateUserIsAdmin(authentication);
+
+        try {
+            List<S3UploadResponse> s3UploadResponse =
+                    s3Service.uploadCourseImageAndFiles(courseId, courseImage, files, types, meta);
+
+            Course finalCourse = courseService.updateCourseWithImagesAndFiles(courseId, s3UploadResponse);
+            System.out.println("Final course: " + finalCourse);
+
+            return ResponseEntity.ok(null);
+        } catch (Exception e) {
+            // Cleanup — remove course from DB if file upload fails
+            courseService.deleteCourseById(courseId);
+            System.err.println("Error uploading files. Rolling back course. Reason: " + e.getMessage());
+
+            return ResponseEntity.status(500).body("Course creation failed due to file upload error. Rolled back.");
+        }
+    }
 }
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoDetail.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoDetail.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ 	(revision )
@@ -1,55 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import com.shifterwebapp.shifter.coursecontent.CourseContentDto;
-import com.shifterwebapp.shifter.enums.Difficulty;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class CourseDtoDetail  {
-
-    private Long id;
-
-    private String imageUrl;
-
-    private String color;
-
-    private String titleShort;
-
-    private String title;
-
-    private Difficulty difficulty;
-
-    private Integer durationMinutes;
-
-    private Double price;
-
-    private Integer rating;
-
-    private Integer ratingCount;
-
-    private List<Skills> skillsGained;
-
-    private List<Interests> topicsCovered;
-
-//    NEW FOR DETAILED DTO
-
-    private String descriptionShort;
-
-    private String description;
-
-    private String descriptionLong;
-
-    private List<String> whatWillBeLearned;
-
-    private List<CourseContentDto> courseContents;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseDtoPreview.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ 	(revision )
@@ -1,44 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import com.shifterwebapp.shifter.coursecontent.CourseContentDto;
-import com.shifterwebapp.shifter.enums.Difficulty;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class CourseDtoPreview {
-
-    private Long id;
-
-    private String imageUrl;
-
-    private String color;
-
-    private String titleShort;
-
-    private String title;
-
-    private Difficulty difficulty;
-
-    private Integer durationMinutes;
-
-    private Double price;
-
-    private Integer rating;
-
-    private Integer ratingCount;
-
-    private List<Skills> skillsGained;
-
-    private List<Interests> topicsCovered;
-
-    private Integer courseContentCount;
-}
-
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/CourseMapperDetail.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseMapperDetail.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ 	(revision )
@@ -1,19 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface CourseMapperDetail {
-
-    CourseDtoDetail toDto(Course course);
-    List<CourseDtoDetail> toDto(List<Course> courses);
-
-    @InheritInverseConfiguration
-    Course toEntity(CourseDtoDetail courseDto);
-    @InheritInverseConfiguration
-    List<Course> toEntity(List<CourseDtoDetail> courseDtos);
-}
Index: ckend/src/main/java/com/shifterwebapp/shifter/course/CourseMapperPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseMapperPreview.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package com.shifterwebapp.shifter.course;
-
-import org.mapstruct.InheritInverseConfiguration;
-import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-
-import java.util.List;
-
-@Mapper(componentModel = "spring")
-public interface CourseMapperPreview {
-
-    @Mapping(target = "courseContentCount", expression = "java(course.getCourseContents() != null ? course.getCourseContents().size() : 0)")
-    CourseDtoPreview toDto(Course course);
-    List<CourseDtoPreview> toDto(List<Course> courses);
-
-    @InheritInverseConfiguration
-    Course toEntity(CourseDtoPreview courseDto);
-    @InheritInverseConfiguration
-    List<Course> toEntity(List<CourseDtoPreview> courseDtos);
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseRepository.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -2,6 +2,4 @@
 
 import com.shifterwebapp.shifter.enums.Difficulty;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -13,4 +11,6 @@
 public interface CourseRepository extends JpaRepository<Course, Long>, JpaSpecificationExecutor<Course> {
     List<Course> findCoursesByTitle(String searchTitle);
+
+    List<Course> findCoursesByIdNotIn(List<Long> courseIds);
 
     @Query("select c from Course c order by c.rating/c.ratingCount desc")
@@ -25,12 +25,12 @@
     List<Course> findCoursesByPriceRange(@Param("floorPrice") Float floorPrice,@Param("ceilPrice") Float ceilPrice);
 
-    List<Course> findCoursesBySkillsGainedIn(List<Skills> searchSkills);
+    List<Course> findCoursesBySkillsGainedIn(List<String> searchSkills);
 
     List<Course> findCoursesByDifficultyIn(List<Difficulty> searchDifficulties);
 
     @Query("select distinct c.topicsCovered from Course c")
-    List<Interests> getCourseTopics();
+    List<String> getCourseTopics();
 
     @Query("select distinct c.skillsGained from Course c")
-    List<Skills> getCourseSkills();
+    List<String> getCourseSkills();
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/CourseSpecification.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -2,6 +2,4 @@
 
 import com.shifterwebapp.shifter.enums.Difficulty;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
 import jakarta.persistence.criteria.Join;
 import jakarta.persistence.criteria.JoinType;
@@ -18,6 +16,6 @@
         return (root, query, cb) -> {
             query.distinct(true);
-            Join<Course, Skills> skillsJoin = root.join("skillsGained", JoinType.LEFT);
-            Join<Course, Interests> topicsJoin = root.join("topicsCovered", JoinType.LEFT);
+            Join<Course, String> skillsJoin = root.join("skillsGained", JoinType.LEFT);
+            Join<Course, String> topicsJoin = root.join("topicsCovered", JoinType.LEFT);
 
             return cb.or(
@@ -36,9 +34,9 @@
     }
 
-    public static Specification<Course> hasSkills(List<Skills> skills) {
+    public static Specification<Course> hasSkills(List<String> skills) {
         return (root, query, cb) -> root.join("skillsGained").in(skills);
     }
 
-    public static Specification<Course> hasTopics(List<Interests> topics) {
+    public static Specification<Course> hasTopics(List<String> topics) {
         return (root, query, cb) -> root.join("topicsCovered").in(topics);
     }
Index: backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoDetail.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoDetail.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoDetail.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,52 @@
+package com.shifterwebapp.shifter.course.dto;
+
+import com.shifterwebapp.shifter.coursecontent.CourseContentDtoPreview;
+import com.shifterwebapp.shifter.enums.Difficulty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CourseDtoDetail  {
+
+    private Long id;
+
+    private String imageUrl;
+
+    private String color;
+
+    private String titleShort;
+
+    private String title;
+
+    private Difficulty difficulty;
+
+    private Integer durationMinutes;
+
+    private Double price;
+
+    private Integer rating;
+
+    private Integer ratingCount;
+
+    private List<String> skillsGained;
+
+    private List<String> topicsCovered;
+
+//    NEW FOR DETAILED DTO
+
+    private String descriptionShort;
+
+    private String description;
+
+    private String descriptionLong;
+
+    private List<String> whatWillBeLearned;
+
+    private List<CourseContentDtoPreview> courseContents;
+}
+
Index: backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,47 @@
+package com.shifterwebapp.shifter.course.dto;
+
+import com.shifterwebapp.shifter.coursecontent.CourseContentDtoFull;
+import com.shifterwebapp.shifter.enums.Difficulty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CourseDtoFull {
+
+    private Long id;
+
+    private String imageUrl;
+
+    private String color;
+
+    private String titleShort;
+
+    private String title;
+
+    private Difficulty difficulty;
+
+    private Integer durationMinutes;
+
+    private Double price;
+
+    private List<String> skillsGained;
+
+    private List<String> topicsCovered;
+
+    private String descriptionShort;
+
+    private String description;
+
+    private String descriptionLong;
+
+    private List<String> whatWillBeLearned;
+
+    // NEW FOR FULL DTO
+
+    private List<CourseContentDtoFull> courseContents;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/dto/CourseDtoPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,41 @@
+package com.shifterwebapp.shifter.course.dto;
+
+import com.shifterwebapp.shifter.enums.Difficulty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class CourseDtoPreview {
+
+    private Long id;
+
+    private String imageUrl;
+
+    private String color;
+
+    private String titleShort;
+
+    private String title;
+
+    private Difficulty difficulty;
+
+    private Integer durationMinutes;
+
+    private Double price;
+
+    private Integer rating;
+
+    private Integer ratingCount;
+
+    private List<String> skillsGained;
+
+    private List<String> topicsCovered;
+
+    private Integer courseContentCount;
+}
+
Index: backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperDetail.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperDetail.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperDetail.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,20 @@
+package com.shifterwebapp.shifter.course.mapper;
+
+import com.shifterwebapp.shifter.course.Course;
+import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface CourseMapperDetail {
+
+    CourseDtoDetail toDto(Course course);
+    List<CourseDtoDetail> toDto(List<Course> courses);
+
+    @InheritInverseConfiguration
+    Course toEntity(CourseDtoDetail courseDto);
+    @InheritInverseConfiguration
+    List<Course> toEntity(List<CourseDtoDetail> courseDtos);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,20 @@
+package com.shifterwebapp.shifter.course.mapper;
+
+import com.shifterwebapp.shifter.course.Course;
+import com.shifterwebapp.shifter.course.dto.CourseDtoFull;
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface CourseMapperFull {
+
+    CourseDtoFull toDto(Course course);
+    List<CourseDtoFull> toDto(List<Course> courses);
+
+    @InheritInverseConfiguration
+    Course toEntity(CourseDtoFull courseDto);
+    @InheritInverseConfiguration
+    List<Course> toEntity(List<CourseDtoFull> courseDtos);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/mapper/CourseMapperPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,22 @@
+package com.shifterwebapp.shifter.course.mapper;
+
+import com.shifterwebapp.shifter.course.Course;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface CourseMapperPreview {
+
+    @Mapping(target = "courseContentCount", expression = "java(course.getCourseContents() != null ? course.getCourseContents().size() : 0)")
+    CourseDtoPreview toDto(Course course);
+    List<CourseDtoPreview> toDto(List<Course> courses);
+
+    @InheritInverseConfiguration
+    Course toEntity(CourseDtoPreview courseDto);
+    @InheritInverseConfiguration
+    List<Course> toEntity(List<CourseDtoPreview> courseDtos);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/CourseService.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,12 +1,19 @@
 package com.shifterwebapp.shifter.course.service;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.shifterwebapp.shifter.Validate;
 import com.shifterwebapp.shifter.course.*;
-import com.shifterwebapp.shifter.coursecontent.CourseContentMapper;
+import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
+import com.shifterwebapp.shifter.course.mapper.CourseMapperDetail;
+import com.shifterwebapp.shifter.course.mapper.CourseMapperPreview;
+import com.shifterwebapp.shifter.coursecontent.CourseContent;
+import com.shifterwebapp.shifter.coursecontent.CourseContentRepository;
+import com.shifterwebapp.shifter.courselecture.CourseLecture;
+import com.shifterwebapp.shifter.courselecture.CourseLectureRepository;
 import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
-import com.shifterwebapp.shifter.enums.Difficulty;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
-import com.shifterwebapp.shifter.user.User;
+import com.shifterwebapp.shifter.upload.MetaInfo;
+import com.shifterwebapp.shifter.upload.S3UploadResponse;
 import com.shifterwebapp.shifter.user.UserDto;
 import com.shifterwebapp.shifter.user.service.UserService;
@@ -17,4 +24,6 @@
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 @Service
@@ -29,23 +38,93 @@
     private final EnrollmentService enrollmentService;
 
-    @Override
-    public List<CourseDtoPreview> getAllCourses(Specification<Course> specification) {
-        List<Course> courses = specification == null ?
-                courseRepository.findAll() :
-                courseRepository.findAll(specification);
-        return courseMapperPreview.toDto(courses);
-    }
+
+    @Override
+    public Course createCourse(String courseJson) throws JsonProcessingException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        Course course = objectMapper.readValue(courseJson, Course.class);
+        course.setRating(0);
+        course.setRatingCount(0);
+
+        for (CourseContent content : course.getCourseContents()) {
+            content.setCourse(course);
+
+            for (CourseLecture lecture : content.getCourseLectures()) {
+                lecture.setCourseContent(content);
+            }
+        }
+
+        return courseRepository.save(course);
+    }
+
+    @Override
+    public void deleteCourseById(Long courseId) {
+        courseRepository.deleteById(courseId);
+    }
+
+    @Override
+    public Course updateCourseWithImagesAndFiles(Long courseId, List<S3UploadResponse> s3UploadResponses) {
+        validate.validateCourseExists(courseId);
+        Course course = courseRepository.findById(courseId).orElseThrow();
+
+        for (S3UploadResponse s3UploadResponse : s3UploadResponses) {
+            if ("COURSE_IMAGE".equals(s3UploadResponse.getType())) {
+                course.setImageUrl(s3UploadResponse.getUrl());
+                continue;
+            }
+
+            MetaInfo meta = s3UploadResponse.getMeta();
+            Integer contentPosition = meta.getContentPosition();
+            Integer lecturePosition = meta.getLecturePosition();
+
+            if (contentPosition != null && lecturePosition != null) {
+                int contentIndex = contentPosition - 1;
+                int lectureIndex = lecturePosition - 1;
+
+                if (contentIndex >= 0 && contentIndex < course.getCourseContents().size()) {
+                    var courseContent = course.getCourseContents().get(contentIndex);
+                    if (lectureIndex >= 0 && lectureIndex < courseContent.getCourseLectures().size()) {
+                        CourseLecture courseLecture = courseContent.getCourseLectures().get(lectureIndex);
+
+                        courseLecture.setContentStoragePath(s3UploadResponse.getUrl());
+                    } else {
+                        // handle invalid lecture index
+                        System.err.println("Invalid lecture index: " + lectureIndex);
+                    }
+                } else {
+                    // handle invalid content index
+                    System.err.println("Invalid content index: " + contentIndex);
+                }
+            }
+        }
+        return courseRepository.save(course);
+    }
+
+    @Override
+    public List<CourseDtoPreview> getAllCourses(List<Long> courseIds) {
+        List<Course> courses = courseIds != null && !courseIds.isEmpty() ?
+                courseRepository.findCoursesByIdNotIn(courseIds) :
+                courseRepository.findAll();
+        return courseMapperPreview.toDto(courses);
+    }
+
+//    @Override
+//    public List<CourseDtoPreview> getAllCourses(Specification<Course> specification) {
+//        List<Course> courses = specification == null ?
+//                courseRepository.findAll() :
+//                courseRepository.findAll(specification);
+//        return courseMapperPreview.toDto(courses);
+//    }
 
     @Override
     public List<CourseDtoPreview> getRecommendedCourses(Long userId) {
         UserDto user = userService.getUserById(userId);
-        List<Skills> skills = user.getSkills();
-        List<Interests> interests = user.getInterests();
-
+        List<String> skills = user.getSkills();
+        List<String> interests = user.getInterests();
+
+        // get user enrollments
         List<Long> enrolledCourseIds = enrollmentService.getCourseIdsByUserEnrollments(userId);
 
-        List<Course> courses = courseRepository.findAll();
-
-        List<Course> filteredCourses = courses
+        // filter out enrolled courses
+        List<Course> courses = courseRepository.findAll()
                 .stream()
                 .filter(course -> !enrolledCourseIds.contains(course.getId()))
@@ -53,5 +132,5 @@
 
         List<ScoredCourse> scoredCourses = new ArrayList<>();
-        for (Course course : filteredCourses) {
+        for (Course course : courses) {
             boolean matchesSkills = course.getSkillsGained().stream().anyMatch(skills::contains);
             boolean matchesTopics = course.getTopicsCovered().stream().anyMatch(interests::contains);
@@ -64,19 +143,12 @@
             }
 
-            if (score > 0)
-                scoredCourses.add(new ScoredCourse(course, score));
+            scoredCourses.add(new ScoredCourse(course, score));
         }
 
-        scoredCourses.sort((a, b) -> Integer.compare(b.getScore(), a.getScore()));
-
-        if (scoredCourses.size() < 5) {
-            courses.sort((a, b) -> Integer.compare(b.getRating()/b.getRatingCount(), a.getRating()/a.getRatingCount()));
-
-            while (scoredCourses.size() < 5)
-                scoredCourses.add(new ScoredCourse(courses.remove(0), 0));
-        }
-
+        scoredCourses.sort((a, b) -> Integer.compare(b.getScore(), a.getScore()));  // descending order
+
+        int limit = Math.min(5, scoredCourses.size());
         return scoredCourses
-                .subList(0, 5)
+                .subList(0, limit)
                 .stream()
                 .map(ScoredCourse::getCourse)
@@ -120,11 +192,13 @@
 
     @Override
-    public List<Interests> getAllTopics() {
+    public List<String> getAllTopics() {
         return courseRepository.getCourseTopics();
     }
 
     @Override
-    public List<Skills> getAllSkills() {
+    public List<String> getAllSkills() {
         return courseRepository.getCourseSkills();
     }
+
+
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/course/service/ImplCourseService.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,10 +1,9 @@
 package com.shifterwebapp.shifter.course.service;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.shifterwebapp.shifter.course.Course;
-import com.shifterwebapp.shifter.course.CourseDtoDetail;
-import com.shifterwebapp.shifter.course.CourseDtoPreview;
-import com.shifterwebapp.shifter.enums.Difficulty;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
+import com.shifterwebapp.shifter.course.dto.CourseDtoDetail;
+import com.shifterwebapp.shifter.course.dto.CourseDtoPreview;
+import com.shifterwebapp.shifter.upload.S3UploadResponse;
 import org.springframework.data.jpa.domain.Specification;
 
@@ -12,5 +11,11 @@
 
 public interface ImplCourseService {
-    List<CourseDtoPreview> getAllCourses(Specification<Course> specification);
+    Course createCourse(String courseJson) throws JsonProcessingException;
+    void deleteCourseById(Long courseId);
+
+    Course updateCourseWithImagesAndFiles(Long courseId, List<S3UploadResponse> s3UploadResponses);
+
+//    List<CourseDtoPreview> getAllCourses(Specification<Course> specification);
+    List<CourseDtoPreview> getAllCourses(List<Long> courseIds);
     List<CourseDtoPreview> getRecommendedCourses(Long userId);
     List<CourseDtoPreview> getEnrolledCourses(Long userId);
@@ -20,5 +25,5 @@
     Course getCourseEntityById(Long courseId);
 
-    List<Interests> getAllTopics();
-    List<Skills> getAllSkills();
+    List<String> getAllTopics();
+    List<String> getAllSkills();
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentController.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentController.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -18,5 +18,5 @@
     @GetMapping("/{courseId}")
     public ResponseEntity<?> getCourseContent(@PathVariable Long courseId) {
-        List<CourseContentDto> courseContents = courseContentService.getCourseContentByCourseId(courseId);
+        List<CourseContentDtoPreview> courseContents = courseContentService.getCourseContentByCourseId(courseId);
         return ResponseEntity.ok(courseContents);
     }
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDto.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent;
-
-import com.shifterwebapp.shifter.courselecture.CourseLecturePreviewDto;
-import com.shifterwebapp.shifter.enums.ContentType;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CourseContentDto {
-
-    private String title;
-
-    private Integer position;
-
-    private List<CourseLecturePreviewDto> courseLectures;
-}
-
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDtoFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDtoFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDtoFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,20 @@
+package com.shifterwebapp.shifter.coursecontent;
+
+import com.shifterwebapp.shifter.courselecture.CourseLectureDtoFull;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CourseContentDtoFull {
+
+    private String title;
+
+    private Integer position;
+
+    private List<CourseLectureDtoFull> courseLectures;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDtoPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDtoPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentDtoPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,21 @@
+package com.shifterwebapp.shifter.coursecontent;
+
+import com.shifterwebapp.shifter.courselecture.CourseLectureDtoPreview;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CourseContentDtoPreview {
+
+    private String title;
+
+    private Integer position;
+
+    private List<CourseLectureDtoPreview> courseLectures;
+}
+
Index: ckend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapper.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapper.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package com.shifterwebapp.shifter.coursecontent;
-
-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: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapperFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapperFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapperFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,18 @@
+package com.shifterwebapp.shifter.coursecontent;
+
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface CourseContentMapperFull {
+
+    CourseContentDtoFull toDto(CourseContent courseContent);
+    List<CourseContentDtoFull> toDto(List<CourseContent> courseContents);
+
+    @InheritInverseConfiguration
+    CourseContent toEntity(CourseContentDtoFull courseContentDtoFull);
+    @InheritInverseConfiguration
+    List<CourseContent> toEntity(List<CourseContentDtoFull> courseContentDtoFulls);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapperPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapperPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentMapperPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,18 @@
+package com.shifterwebapp.shifter.coursecontent;
+
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+
+import java.util.List;
+
+@Mapper(componentModel = "spring")
+public interface CourseContentMapperPreview {
+
+    CourseContentDtoPreview toDto(CourseContent courseContent);
+    List<CourseContentDtoPreview> toDto(List<CourseContent> courseContents);
+
+    @InheritInverseConfiguration
+    CourseContent toEntity(CourseContentDtoPreview courseContentDtoPreview);
+    @InheritInverseConfiguration
+    List<CourseContent> toEntity(List<CourseContentDtoPreview> courseContentDtoPreviews);
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentRepository.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/CourseContentRepository.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -2,4 +2,5 @@
 
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 
 import java.util.List;
@@ -8,3 +9,6 @@
 
     List<CourseContent> getCourseContentByCourse_Id(Long courseId);
+
+    @Query("SELECT c.course.id, COUNT(c) FROM CourseContent c GROUP BY c.course.id")
+    List<Object[]> countCourseContentsPerCourse();
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/CourseContentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/CourseContentService.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/CourseContentService.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -2,6 +2,6 @@
 
 import com.shifterwebapp.shifter.coursecontent.CourseContent;
-import com.shifterwebapp.shifter.coursecontent.CourseContentDto;
-import com.shifterwebapp.shifter.coursecontent.CourseContentMapper;
+import com.shifterwebapp.shifter.coursecontent.CourseContentDtoPreview;
+import com.shifterwebapp.shifter.coursecontent.CourseContentMapperPreview;
 import com.shifterwebapp.shifter.coursecontent.CourseContentRepository;
 import lombok.RequiredArgsConstructor;
@@ -15,10 +15,10 @@
 
     private final CourseContentRepository courseContentRepository;
-    private final CourseContentMapper courseContentMapper;
+    private final CourseContentMapperPreview courseContentMapperPreview;
 
     @Override
-    public List<CourseContentDto> getCourseContentByCourseId(Long courseId) {
+    public List<CourseContentDtoPreview> getCourseContentByCourseId(Long courseId) {
         List<CourseContent> courseContents = courseContentRepository.getCourseContentByCourse_Id(courseId);
-        return courseContentMapper.toDto(courseContents);
+        return courseContentMapperPreview.toDto(courseContents);
     }
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/ImplCourseContentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/ImplCourseContentService.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/coursecontent/service/ImplCourseContentService.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,10 +1,10 @@
 package com.shifterwebapp.shifter.coursecontent.service;
 
-import com.shifterwebapp.shifter.coursecontent.CourseContentDto;
+import com.shifterwebapp.shifter.coursecontent.CourseContentDtoPreview;
 
 import java.util.List;
 
 public interface ImplCourseContentService {
-    List<CourseContentDto> getCourseContentByCourseId(Long courseId);
+    List<CourseContentDtoPreview> getCourseContentByCourseId(Long courseId);
 
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLecture.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLecture.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLecture.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -30,5 +30,5 @@
     private String contentText;
 
-    private String contentUrl;
+    private String contentStoragePath;
 
     @Enumerated(EnumType.STRING)
Index: backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureDtoFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureDtoFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureDtoFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,28 @@
+package com.shifterwebapp.shifter.courselecture;
+
+import com.shifterwebapp.shifter.enums.ContentType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CourseLectureDtoFull {
+
+    private Long id;
+
+    private String title;
+
+    private String description;
+
+    private Integer durationMinutes;
+
+    private Integer position;
+
+    private String contentText;
+
+    private String contentStoragePath;
+
+    private ContentType contentType;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureDtoPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureDtoPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureDtoPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,22 @@
+package com.shifterwebapp.shifter.courselecture;
+
+import com.shifterwebapp.shifter.enums.ContentType;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CourseLectureDtoPreview {
+
+    private String title;
+
+    private String description;
+
+    private Integer durationMinutes;
+
+    private Integer position;
+
+    private ContentType contentType;
+}
Index: ckend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureFullDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureFullDto.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ 	(revision )
@@ -1,29 +1,0 @@
-package com.shifterwebapp.shifter.courselecture;
-
-import com.shifterwebapp.shifter.coursecontent.CourseContent;
-import com.shifterwebapp.shifter.enums.ContentType;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CourseLectureFullDto {
-
-    private Long id;
-
-    private String title;
-
-    private String description;
-
-    private Integer durationMinutes;
-
-    private Integer position;
-
-    private String contentText;
-
-    private String contentUrl;
-
-    private ContentType contentType;
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureMapperFull.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureMapperFull.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureMapperFull.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -9,10 +9,10 @@
 public interface CourseLectureMapperFull {
 
-    CourseLectureFullDto toDto(CourseLecture courseContent);
-    List<CourseLectureFullDto> toDto(List<CourseLecture> courseContents);
+    CourseLectureDtoFull toDto(CourseLecture courseContent);
+    List<CourseLectureDtoFull> toDto(List<CourseLecture> courseContents);
 
     @InheritInverseConfiguration
-    CourseLecture toEntity(CourseLectureFullDto courseContentDto);
+    CourseLecture toEntity(CourseLectureDtoFull courseContentDto);
     @InheritInverseConfiguration
-    List<CourseLecture> toEntity(List<CourseLectureFullDto> courseContentDtos);
+    List<CourseLecture> toEntity(List<CourseLectureDtoFull> courseContentDtos);
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureMapperPreview.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureMapperPreview.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLectureMapperPreview.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -9,10 +9,10 @@
 public interface CourseLectureMapperPreview {
 
-    CourseLecturePreviewDto toDto(CourseLecture courseContent);
-    List<CourseLecturePreviewDto> toDto(List<CourseLecture> courseContents);
+    CourseLectureDtoPreview toDto(CourseLecture courseContent);
+    List<CourseLectureDtoPreview> toDto(List<CourseLecture> courseContents);
 
     @InheritInverseConfiguration
-    CourseLecture toEntity(CourseLecturePreviewDto courseContentDto);
+    CourseLecture toEntity(CourseLectureDtoPreview courseContentDto);
     @InheritInverseConfiguration
-    List<CourseLecture> toEntity(List<CourseLecturePreviewDto> courseContentDtos);
+    List<CourseLecture> toEntity(List<CourseLectureDtoPreview> courseContentDtos);
 }
Index: ckend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLecturePreviewDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/courselecture/CourseLecturePreviewDto.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package com.shifterwebapp.shifter.courselecture;
-
-import com.shifterwebapp.shifter.enums.ContentType;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CourseLecturePreviewDto {
-
-    private String title;
-
-    private String description;
-
-    private Integer durationMinutes;
-
-    private Integer position;
-
-    private ContentType contentType;
-}
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/Enrollment.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -20,6 +20,4 @@
 public class Enrollment {
     @Id
-//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "enrollment_seq")
-//    @SequenceGenerator(name = "enrollment_seq", sequenceName = "enrollment_sequence", allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentController.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/EnrollmentController.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -3,11 +3,6 @@
 import com.shifterwebapp.shifter.Validate;
 import com.shifterwebapp.shifter.auth.CustomAuthDetails;
-import com.shifterwebapp.shifter.course.CourseDtoPreview;
 import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
 import com.shifterwebapp.shifter.exception.ErrorResponse;
-import com.shifterwebapp.shifter.payment.service.PaymentService;
-import com.shifterwebapp.shifter.user.User;
-import com.shifterwebapp.shifter.user.UserRepository;
-import com.shifterwebapp.shifter.user.service.UserService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.ResponseEntity;
@@ -16,5 +11,4 @@
 
 import java.util.List;
-import java.util.Optional;
 
 @RequiredArgsConstructor
Index: backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/enrollment/service/EnrollmentService.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -49,5 +49,5 @@
     @Override
     public List<Long> getCourseIdsByUserEnrollments(Long userId) {
-        validate.validateCourseExists(userId);
+        validate.validateUserExists(userId);
         return enrollmentRepository.getCourseIdsByUserEnrollments(userId);
     }
@@ -130,5 +130,5 @@
 
         Long userId = enrollment.getPayment().getUser().getId();
-        List<Skills> skillsGained = enrollment.getCourse().getSkillsGained();
+        List<String> skillsGained = enrollment.getCourse().getSkillsGained();
         userService.addPoints(userId, PointsConstants.BUY_COURSE);
         userService.addSkills(userId, skillsGained);
Index: backend/src/main/java/com/shifterwebapp/shifter/enums/ContentType.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/enums/ContentType.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/enums/ContentType.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -5,4 +5,5 @@
     TEXT,
     FILE,
-    QUIZ
+    QUIZ,
+    TOOL,
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/exception/GlobalExceptionHandler.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -5,4 +5,5 @@
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.multipart.MultipartException;
 
 @ControllerAdvice
@@ -15,4 +16,10 @@
     }
 
-    // You can add more handlers for different exception types if needed
+    @ExceptionHandler(MultipartException.class)
+    public ResponseEntity<?> handleMultipartException(MultipartException ex) {
+        ex.printStackTrace(); // ← log full stack trace
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
+                .body("Failed to process multipart request: " + ex.getMessage());
+    }
+
 }
Index: backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/payment/Payment.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -18,6 +18,4 @@
 public class Payment {
     @Id
-//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "payment_seq")
-//    @SequenceGenerator(name = "payment_seq", sequenceName = "payment_sequence", allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
Index: backend/src/main/java/com/shifterwebapp/shifter/review/Review.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/review/Review.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/review/Review.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -15,6 +15,4 @@
 public class Review {
     @Id
-//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "review_seq")
-//    @SequenceGenerator(name = "review_seq", sequenceName = "review_sequence", allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
Index: backend/src/main/java/com/shifterwebapp/shifter/sql/initializeUser.sql
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/sql/initializeUser.sql	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/sql/initializeUser.sql	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,16 @@
+INSERT INTO _user (email,
+                   password_hash,
+                   name,
+                   is_admin,
+                   points,
+                   work_position,
+                   company_type)
+VALUES (
+        'admin@gmail.com',
+        '$2a$12$QREFNsS4GKa9soUNUa4rMe1yZtj1wE7Bye8etobRyBWZDiq6Vfnwy',
+        'Admin',
+        true,
+        1000,
+        'Administrator',
+        'ENTERPRISE'
+    )
Index: backend/src/main/java/com/shifterwebapp/shifter/upload/MetaInfo.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/upload/MetaInfo.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/upload/MetaInfo.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,14 @@
+package com.shifterwebapp.shifter.upload;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class MetaInfo {
+    private Integer contentPosition;
+    private Integer lecturePosition;
+    private Long courseId;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/upload/S3Service.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/upload/S3Service.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/upload/S3Service.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,95 @@
+package com.shifterwebapp.shifter.upload;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.core.sync.RequestBody;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.model.PutObjectRequest;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@RequiredArgsConstructor
+public class S3Service {
+
+    @Value("${aws.access-key}")
+    private String accessKey;
+
+    @Value("${aws.secret-key}")
+    private String secretKey;
+
+    @Value("${aws.region}")
+    private String region;
+
+    @Value("${aws.s3.bucket-name}")
+    private String bucketName;
+
+    public List<S3UploadResponse> uploadCourseImageAndFiles(
+            Long courseId,
+            MultipartFile courseImage,
+            List<MultipartFile> files,
+            List<String> types,
+            List<String> metaList
+    ) throws IOException {
+        S3Client s3Client = S3Client.builder()
+                .region(Region.of(region))
+                .credentialsProvider(
+                        StaticCredentialsProvider.create(
+                                AwsBasicCredentials.create(accessKey, secretKey)
+                        )
+                )
+                .build();
+
+        List<S3UploadResponse> responses = new ArrayList<>();
+
+        // Upload public course image
+        if (courseImage != null && !courseImage.isEmpty()) {
+            String imageKey = "public/courseImages/course" + courseId + "_" + courseImage.getOriginalFilename();
+
+            s3Client.putObject(
+                    PutObjectRequest.builder()
+                            .bucket(bucketName)
+                            .key(imageKey)
+                            .build(),
+                    RequestBody.fromBytes(courseImage.getBytes())
+            );
+
+            String imageUrl = "https://" + bucketName + ".s3." + region + ".amazonaws.com/" + imageKey;
+
+            responses.add(new S3UploadResponse("COURSE_IMAGE", imageUrl, new MetaInfo(null, null, courseId)));
+        }
+
+        // Upload private course content files
+        for (int i = 0; i < files.size(); i++) {
+            MultipartFile file = files.get(i);
+            String type = types.get(i);
+            String metaJson = metaList.get(i);
+
+            String key = "private/courseContent/" + type.toLowerCase() + "/course" + courseId + "_" + file.getOriginalFilename();
+
+            s3Client.putObject(
+                    PutObjectRequest.builder()
+                            .bucket(bucketName)
+                            .key(key)
+                            .build(),
+                    RequestBody.fromBytes(file.getBytes())
+            );
+
+
+            MetaInfo meta = new ObjectMapper().readValue(metaJson, MetaInfo.class);
+            responses.add(new S3UploadResponse("COURSE_LECTURE", key, meta));
+        }
+
+        return responses;
+    }
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/upload/S3UploadResponse.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/upload/S3UploadResponse.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/upload/S3UploadResponse.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,12 @@
+package com.shifterwebapp.shifter.upload;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@AllArgsConstructor
+@Data
+public class S3UploadResponse {
+    public String type;
+    public String url;
+    public MetaInfo meta;
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/upload/UploadController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/upload/UploadController.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ backend/src/main/java/com/shifterwebapp/shifter/upload/UploadController.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,39 @@
+package com.shifterwebapp.shifter.upload;
+
+import com.shifterwebapp.shifter.Validate;
+import com.shifterwebapp.shifter.upload.S3Service;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/upload")
+@RequiredArgsConstructor
+public class UploadController {
+
+    private final S3Service s3Service;
+    private final Validate validate;
+
+    @PostMapping(
+            value = "/course-image-and-content",
+            consumes = MediaType.MULTIPART_FORM_DATA_VALUE
+    )
+    public ResponseEntity<Void> uploadFiles(
+            @RequestParam("files") List<MultipartFile> files,
+            @RequestParam("types") List<String> types,
+            @RequestParam("meta") List<String> meta,
+            Authentication authentication
+    ) throws IOException {
+        validate.validateUserIsAdmin(authentication);
+
+//        s3Service.uploadFilesWithMeta(files, types, meta);
+        return ResponseEntity.ok().build();
+    }
+
+}
Index: backend/src/main/java/com/shifterwebapp/shifter/user/User.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/User.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -4,6 +4,4 @@
 import com.shifterwebapp.shifter.payment.Payment;
 import com.shifterwebapp.shifter.enums.CompanyType;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
 import jakarta.persistence.*;
 import lombok.*;
@@ -25,6 +23,4 @@
 public class User implements UserDetails {
     @Id
-//    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
-//    @SequenceGenerator(name = "user_seq", sequenceName = "user_sequence", allocationSize = 1)
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
@@ -47,15 +43,15 @@
     private String workPosition;
     
-    @ElementCollection(targetClass = Interests.class)
-    @Enumerated(EnumType.STRING)
-    private List<Interests> interests;
+    @ElementCollection
+    @Column(columnDefinition = "text")
+    private List<String> interests;
 
-    @ElementCollection(targetClass = Skills.class)
-    @Enumerated(EnumType.STRING)
-    private List<Skills> skills;
+    @ElementCollection
+    @Column(columnDefinition = "text")
+    private List<String> skills;
 
-    @ElementCollection(targetClass = Skills.class)
-    @Enumerated(EnumType.STRING)
-    private List<Skills> desiredSkills;
+    @ElementCollection
+    @Column(columnDefinition = "text")
+    private List<String> desiredSkills;
     
     private Integer points;
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserController.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -3,6 +3,4 @@
 import com.shifterwebapp.shifter.Validate;
 import com.shifterwebapp.shifter.auth.CustomAuthDetails;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
 import com.shifterwebapp.shifter.exception.ErrorResponse;
 import com.shifterwebapp.shifter.user.service.UserService;
@@ -49,5 +47,5 @@
 
     @PutMapping("/update/interests")
-    public ResponseEntity<?> updateInterests(Authentication authentication, @RequestBody List<Interests> interests) {
+    public ResponseEntity<?> updateInterests(Authentication authentication, @RequestBody List<String> interests) {
         validate.validateUserIsAuthenticated(authentication);
         Object detailsObj = authentication.getDetails();
@@ -62,5 +60,5 @@
 
     @PutMapping("/update/desired-skills")
-    public ResponseEntity<?> updateDesiredSkills(Authentication authentication, @RequestBody List<Skills> desiredSkills) {
+    public ResponseEntity<?> updateDesiredSkills(Authentication authentication, @RequestBody List<String> desiredSkills) {
         validate.validateUserIsAuthenticated(authentication);
         Object detailsObj = authentication.getDetails();
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserDto.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -3,6 +3,4 @@
 import com.shifterwebapp.shifter.payment.PaymentDto;
 import com.shifterwebapp.shifter.enums.CompanyType;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
 import lombok.AllArgsConstructor;
 import lombok.Data;
@@ -28,13 +26,15 @@
     private String workPosition;
 
-    private List<Interests> interests;
+    private List<String> interests;
 
-    private List<Skills> skills;
+    private List<String> skills;
 
-    private List<Skills> desiredSkills;
+    private List<String> desiredSkills;
 
     private Integer points;
 
     private List<Integer> favoriteCourses;
+
+    private Boolean isAdmin;
 }
 
Index: backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/UserRepository.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -13,4 +13,7 @@
     Optional<User> findByEmail(String email);
 
+    @Query("select case when count(u) > 0 then true else false end from User u where u.id = :userId and u.isAdmin = true")
+    boolean isAdmin(@Param("userId") Long userId);
+
     @Query("select u.id from User u where u.email = :email")
     Optional<Long> findUserIdByEmail(@Param("email") String email);
Index: backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/service/ImplUserService.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -6,6 +6,4 @@
 import com.shifterwebapp.shifter.user.User;
 import com.shifterwebapp.shifter.user.UserDto;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
 
 import java.util.List;
@@ -22,17 +20,17 @@
 
     UserDto updateUser(Long id, UserInfoDto userInfoDto);
-    UserDto updateInterests(Long id, List<Interests> interests);
-    UserDto updateDesiredSkills(Long id, List<Skills> desiredSkills);
+    UserDto updateInterests(Long id, List<String> interests);
+    UserDto updateDesiredSkills(Long id, List<String> desiredSkills);
     UserDto updateMail(Long id, String newMail);
     UserDto updatePassword(Long id, String newPassHash);
 
-    UserDto addSkill(Long id, Skills newSkill);
-    UserDto addSkills(Long id, List<Skills> newSkills);
+    UserDto addSkill(Long id, String newSkill);
+    UserDto addSkills(Long id, List<String> newSkills);
     UserDto toggleFavoriteCourse(Long userId, Integer newFavoriteCourseId);
     UserDto addPoints(Long id, Integer newPointsAchieved);
     UserDto addPayment(Long id, Payment newPayment);
 
-    UserDto removeDesiredSkill(Long id, Skills removeDesiredSkill);
-    UserDto removeDesiredSkills(Long id, List<Skills> removeDesiredSkills);
+    UserDto removeDesiredSkill(Long id, String removeDesiredSkill);
+    UserDto removeDesiredSkills(Long id, List<String> removeDesiredSkills);
     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 af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/user/service/UserService.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -3,6 +3,4 @@
 import com.shifterwebapp.shifter.Validate;
 import com.shifterwebapp.shifter.auth.RegisterDto;
-import com.shifterwebapp.shifter.enums.Interests;
-import com.shifterwebapp.shifter.enums.Skills;
 import com.shifterwebapp.shifter.user.UserInfoDto;
 import com.shifterwebapp.shifter.payment.Payment;
@@ -103,5 +101,5 @@
 
     @Override
-    public UserDto updateInterests(Long id, List<Interests> interests) {
+    public UserDto updateInterests(Long id, List<String> interests) {
         validate.validateUserExists(id);
         User user = userRepository.findById(id).orElseThrow();
@@ -114,5 +112,5 @@
 
     @Override
-    public UserDto updateDesiredSkills(Long id, List<Skills> desiredSkills) {
+    public UserDto updateDesiredSkills(Long id, List<String> desiredSkills) {
         validate.validateUserExists(id);
         User user = userRepository.findById(id).orElseThrow();
@@ -144,5 +142,5 @@
 
     @Override
-    public UserDto addSkill(Long userId, Skills newSkill) {
+    public UserDto addSkill(Long userId, String newSkill) {
         validate.validateUserExists(userId);
         User user = userRepository.findById(userId).orElseThrow();
@@ -155,8 +153,8 @@
 
     @Override
-    public UserDto addSkills(Long userId, List<Skills> newSkills) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        for (Skills skill : newSkills) {
+    public UserDto addSkills(Long userId, List<String> newSkills) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        for (String skill : newSkills) {
             if (!user.getSkills().contains(skill)) {
                 user.getSkills().add(skill);
@@ -202,5 +200,5 @@
 
     @Override
-    public UserDto removeDesiredSkill(Long userId, Skills removeDesiredSkill) {
+    public UserDto removeDesiredSkill(Long userId, String removeDesiredSkill) {
         validate.validateUserExists(userId);
         User user = userRepository.findById(userId).orElseThrow();
@@ -213,8 +211,8 @@
 
     @Override
-    public UserDto removeDesiredSkills(Long userId, List<Skills> removeDesiredSkills) {
-        validate.validateUserExists(userId);
-        User user = userRepository.findById(userId).orElseThrow();
-        for (Skills skill : removeDesiredSkills) {
+    public UserDto removeDesiredSkills(Long userId, List<String> removeDesiredSkills) {
+        validate.validateUserExists(userId);
+        User user = userRepository.findById(userId).orElseThrow();
+        for (String skill : removeDesiredSkills) {
             if (!user.getDesiredSkills().contains(skill)) {
                 user.getDesiredSkills().remove(skill);
Index: backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressDto.java
===================================================================
--- backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressDto.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/java/com/shifterwebapp/shifter/usercourseprogress/UserCourseProgressDto.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,5 +1,5 @@
 package com.shifterwebapp.shifter.usercourseprogress;
 
-import com.shifterwebapp.shifter.coursecontent.CourseContentDto;
+import com.shifterwebapp.shifter.coursecontent.CourseContentDtoPreview;
 import lombok.*;
 
@@ -11,5 +11,5 @@
     private Long id;
 
-    private CourseContentDto courseContent;
+    private CourseContentDtoPreview courseContent;
 
     private boolean completed;
Index: backend/src/main/resources/application.properties
===================================================================
--- backend/src/main/resources/application.properties	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/main/resources/application.properties	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -23,4 +23,20 @@
 # Base API path
 api.base.path=/api
+api.admin.path=/api/admin
 
 spring.profiles.active=dev
+
+# Max file size
+spring.servlet.multipart.max-file-size=500MB
+spring.servlet.multipart.max-request-size=550MB
+
+logging.level.org.springframework.web=DEBUG
+logging.level.org.apache.coyote.http11=DEBUG
+
+
+# Amazon S3 configuration
+# aws.region=REMOVED
+# aws.s3.bucket-name=REMOVED
+# aws.access-key=REMOVED
+# aws.secret-key=REMOVED
+
Index: backend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java
===================================================================
--- backend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ backend/src/test/java/com/shifterwebapp/shifter/unittests/TestEnrollmentService.java	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -10,7 +10,9 @@
 import com.shifterwebapp.shifter.enums.EnrollmentStatus;
 import com.shifterwebapp.shifter.enrollment.service.EnrollmentService;
+import com.shifterwebapp.shifter.enums.PaymentMethod;
 import com.shifterwebapp.shifter.payment.Payment;
 import com.shifterwebapp.shifter.payment.PaymentRepository;
 import com.shifterwebapp.shifter.enums.PaymentStatus;
+import com.shifterwebapp.shifter.payment.service.PaymentService;
 import com.shifterwebapp.shifter.user.User;
 import com.shifterwebapp.shifter.user.service.UserService;
@@ -36,4 +38,6 @@
     @Mock
     PaymentRepository paymentRepository;
+    @Mock
+    PaymentService paymentService;
     @Mock
     EnrollmentMapper enrollmentMapper;
@@ -134,15 +138,12 @@
 
         User mockUser = Mockito.mock(User.class);
-        Mockito.when(mockUser.getId()).thenReturn(userId);
 
         Payment mockPayment = Mockito.mock(Payment.class);
-        Mockito.when(mockPayment.getUser()).thenReturn(mockUser);
         Mockito.when(mockPayment.getPaymentStatus()).thenReturn(PaymentStatus.COMPLETED);
 
-        Mockito.when(paymentRepository.findById(paymentId)).thenReturn(Optional.of(mockPayment));
         Mockito.doNothing().when(validate).validateCourseExists(courseId);
-        Mockito.doNothing().when(validate).validatePaymentExists(paymentId);
         Mockito.doNothing().when(validate).validateUserExists(userId);
         Mockito.when(enrollmentRepository.findIsUserEnrolledInCourse(userId, courseId)).thenReturn(false);
+        Mockito.when(paymentService.initiatePayment(userId, courseId, PaymentMethod.CASYS)).thenReturn(mockPayment);
         Mockito.when(courseRepository.findById(courseId)).thenReturn(Optional.of(new Course()));
         Mockito.when(enrollmentRepository.save(Mockito.any(Enrollment.class))).thenAnswer(arguments -> arguments.getArgument(0));
Index: frontend/src/App.tsx
===================================================================
--- frontend/src/App.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/App.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,3 +1,3 @@
-import { Route, Routes, useLocation } from "react-router-dom";
+import {Route, Routes, useLocation} from "react-router-dom";
 import Home from "./pages/Home.tsx";
 import Navbar from "./layout/Navbar.tsx";
@@ -8,5 +8,5 @@
 import {useEffect} from "react";
 import CourseDetails from "./pages/CourseDetails.tsx";
-import { ToastContainer } from 'react-toastify';
+import {ToastContainer} from 'react-toastify';
 import 'react-toastify/dist/ReactToastify.css';
 import AppLoader from "./AppLoader.tsx";
@@ -14,26 +14,70 @@
 import Dashboard from "./pages/Dashboard.tsx";
 import FreeConsultation from "./pages/FreeConsultation.tsx";
+import PublicOnlyRoute from "./components/routeProtectors/PublicOnlyRoute.tsx";
+import UserOnlyRoute from "./components/routeProtectors/UserOnlyRoute.tsx";
+import {useAuthContext} from "./context/AuthContext.tsx";
+import AdminNavbar from "./admin/utils/AdminNavbar.tsx";
+import Admin from "./admin/Admin.tsx";
+import AdminAddCourse from "./admin/pages/AdminAddCourse.tsx";
 
 function LayoutWrapper() {
     const location = useLocation();
     const hideLayout = location.pathname === "/login" || location.pathname === "/register"; // You can add more paths like || location.pathname === "/signup"
+    const {user, authChecked} = useAuthContext();
+
+    if (!authChecked)
+        return null;
+
+    if (user?.isAdmin) {
+        return (
+            <>
+                <AdminNavbar />
+                <Routes>
+                    <Route path="/" element={<Admin />}/>
+                    <Route path="/add-course" element={<AdminAddCourse />}/>
+                    <Route path="/analytics" element={<p>Analytics</p>}/>
+                </Routes>
+            </>
+        )
+    }
+
 
     return (
         <>
-            {!hideLayout && <Navbar />}
+            {!hideLayout && <Navbar/>}
             <Routes>
-                <Route path="/login" element={<Login />} />
-                <Route path="/register" element={<Register />} />
+                <Route path="/login" element={
+                    <PublicOnlyRoute>
+                        <Login/>
+                    </PublicOnlyRoute>
+                }/>
+                <Route path="/register" element={
+                    <PublicOnlyRoute>
+                        <Register/>
+                    </PublicOnlyRoute>
+                }/>
 
-                <Route path="/" element={<Home />} />
-                <Route path="/courses" element={<Courses />} />
-                <Route path="/courses/:courseId/:courseTitle" element={<CourseDetails />} />
+                <Route path="/" element={<Home/>}/>
+                <Route path="/courses" element={<Courses/>}/>
+                <Route path="/courses/:courseId/:courseTitle" element={<CourseDetails/>}/>
 
-                <Route path="/free-consultation" element={<FreeConsultation />} />
+                <Route path="/free-consultation" element={
+                    <UserOnlyRoute>
+                        <FreeConsultation/>
+                    </UserOnlyRoute>
+                }/>
 
-                <Route path="/profile" element={<Profile />} />
-                <Route path="/dashboard" element={<Dashboard />} />
+                <Route path="/profile" element={
+                    <UserOnlyRoute>
+                        <Profile/>
+                    </UserOnlyRoute>
+                }/>
+                <Route path="/dashboard" element={
+                    <UserOnlyRoute>
+                        <Dashboard/>
+                    </UserOnlyRoute>
+                }/>
             </Routes>
-            {!hideLayout && <Footer />}
+            {!hideLayout && <Footer/>}
         </>
     );
@@ -41,5 +85,5 @@
 
 function ScrollToTop() {
-    const { pathname } = useLocation();
+    const {pathname} = useLocation();
 
     useEffect(() => {
@@ -54,6 +98,6 @@
     return (
         <>
-            <AppLoader />
-            <ScrollToTop />
+            <AppLoader/>
+            <ScrollToTop/>
             <ToastContainer
                 position="top-right"
Index: frontend/src/AppLoader.tsx
===================================================================
--- frontend/src/AppLoader.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/AppLoader.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,3 +1,3 @@
-import {useGlobalContext} from "./context/GlobalContext.tsx";
+import {useAuthContext} from "./context/AuthContext.tsx";
 import {useCourseStorage} from "./context/CourseStorage.ts";
 import {
@@ -5,10 +5,8 @@
 } from "./api/courseApi.ts";
 import {useEffect} from "react";
-import {fetchUserEnrollmentsApi} from "./api/enrollmentApi.ts";
 
 function AppLoader() {
-    const {accessToken, authChecked} = useGlobalContext();
+    const {accessToken, authChecked} = useAuthContext();
     const {
-        setEnrollments,
         recommendedCourses,
         setRecommendedCourses,
@@ -31,19 +29,4 @@
                 console.error("Failed to fetch recommended courses:", err);
             }
-
-            // Enrollments
-            try {
-                try {
-                    if (accessToken) {
-                        const enrollments = await fetchUserEnrollmentsApi(accessToken);
-                        setEnrollments(enrollments);
-                    }
-                } catch (err) {
-                    console.error("Failed to fetch enrollments:", err);
-                }
-
-            } catch (err) {
-                console.error("Unexpected error in AppLoader:", err);
-            }
         };
 
Index: frontend/src/admin/Admin.tsx
===================================================================
--- frontend/src/admin/Admin.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/Admin.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,11 @@
+
+function Admin() {
+
+    return (
+        <main>
+
+        </main>
+    )
+}
+
+export default Admin;
Index: frontend/src/admin/api/addCourse.ts
===================================================================
--- frontend/src/admin/api/addCourse.ts	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/api/addCourse.ts	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,32 @@
+import axios from "axios";
+
+const backendUrl = import.meta.env.VITE_BACKEND_URL;
+
+export const createCourseApi = async (courseJsonStr: string, accessToken?: string): Promise<number> => {
+    const courseIdResponse = await axios.post(
+        `${backendUrl}/api/admin/courses/create`,
+        courseJsonStr,
+        {
+            headers: {
+                Authorization: `Bearer ${accessToken}`,
+                "Content-Type": "application/json",
+            }
+        }
+    );
+
+    return courseIdResponse.data;
+};
+
+export const uploadCourseFilesApi = async (courseId: number, formData: FormData, accessToken?: string): Promise<number> => {
+    const response = await axios.post(
+        `${backendUrl}/api/admin/courses/${courseId}/upload`,
+        formData,
+        {
+            headers: {
+                Authorization: `Bearer ${accessToken}`
+            }
+        }
+    );
+
+    return response.data;
+};
Index: frontend/src/admin/components/AdminAddCourseContent.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseContent.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/components/AdminAddCourseContent.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,409 @@
+import type {Dispatch, SetStateAction} from "react";
+import AdminAddCourseInput from "./AdminAddCourseInput.tsx";
+import type {ContentType} from "../../types/ContentType.tsx";
+import AdminAddCourseInputSelect from "./AdminAddCourseInputSelect.tsx";
+import AdminAddCourseInputTextArea from "./AdminAddCourseInputTextArea.tsx";
+import {X, MoveUp, MoveDown, ChevronUp, ChevronDown} from "lucide-react";
+import type {CourseEntity} from "../types/CourseEntity.tsx";
+
+function AdminAddCourseContents({
+                                          course,
+                                          setCourse,
+                                          courseLectureFiles,
+                                          setCourseLectureFiles
+                                      }: {
+    course: CourseEntity;
+    setCourse: Dispatch<SetStateAction<CourseEntity>>;
+    courseLectureFiles: { file: File, type: ContentType, contentPosition: number, lecturePosition: number }[];
+    setCourseLectureFiles: Dispatch<SetStateAction<{
+        file: File,
+        type: ContentType,
+        contentPosition: number,
+        lecturePosition: number
+    }[]>>;
+}) {
+    return (
+        <div className="flex flex-col gap-4">
+            {/*COURSE CONTENT*/}
+            {
+                course.courseContents.length > 0 && course.courseContents.map((content, index) => {
+                    return (
+                        <div key={`content-${index}`}
+                             className="w-full flex flex-col gap-4"
+                        >
+                            {/*CONTENT HEADER*/}
+                            <div className="flex justify-between items-center">
+                                <h3 className="font-semibold text-black/80 text-2xl text-left">Module {index + 1}</h3>
+
+                                {/*Header Buttons*/}
+                                <div className="flex gap-2">
+                                    {index > 0 && (
+                                        <button
+                                            onClick={() => {
+                                                const updated = [...course.courseContents];
+                                                [updated[index - 1], updated[index]] = [updated[index], updated[index - 1]];
+                                                updated[index - 1] = {...updated[index - 1], position: index};
+                                                updated[index] = {...updated[index], position: index + 1};
+                                                setCourse({
+                                                    ...course,
+                                                    courseContents: updated
+                                                });
+                                            }}
+                                            className="hover:bg-gray/60 transition-all duration-300 ease-out cursor-pointer
+                                            rounded-sm"
+                                        >
+                                            <MoveUp size={28} opacity={0.6}/>
+                                        </button>
+                                    )}
+                                    {index < course.courseContents.length - 1 && (
+                                        <button
+                                            onClick={() => {
+                                                const updated = [...course.courseContents];
+                                                [updated[index], updated[index + 1]] = [updated[index + 1], updated[index]];
+                                                updated[index] = {...updated[index], position: index + 1};
+                                                updated[index + 1] = {...updated[index + 1], position: index + 2};
+                                                setCourse({
+                                                    ...course,
+                                                    courseContents: updated
+                                                });
+                                            }}
+                                            className="hover:bg-gray/60 transition-all duration-300 ease-out cursor-pointer
+                                            rounded-sm"
+                                        >
+                                            <MoveDown size={28} opacity={0.6}/>
+                                        </button>
+                                    )}
+                                    <button
+                                        className="hover:bg-gray/60 hover:text-black rounded-sm px-4 py-2 cursor-pointer text-black/80"
+                                        onClick={() => setCourse({
+                                            ...course,
+                                            courseContents: course.courseContents
+                                                .filter((_, i) => i !== index)
+                                                .map((item, i) => ({...item, position: i + 1}))
+                                        })}
+                                    >
+                                        Delete Module
+                                    </button>
+                                </div>
+                            </div>
+
+                            <AdminAddCourseInput
+                                label={"Title"}
+                                value={content.title}
+                                onChange={e => setCourse({
+                                    ...course,
+                                    courseContents: course.courseContents.map((item, i) => i === index ? {
+                                        ...item,
+                                        title: e.target.value
+                                    } : item)
+                                })}
+                                type={"text"}
+                                width={"full"}
+                            />
+
+                            {/*LECTURES*/}
+                            <div
+                                className={`relative grid grid-cols-6 grid-rows-[${content.courseLectures.length}] gap-y-12`}>
+                                <div
+                                    className="col-span-1 flex flex-col gap-12 overflow-clip"
+                                    style={{
+                                        gridRow: `span ${content.courseLectures.length} / span ${content.courseLectures.length}`
+                                    }}
+                                >
+                                    {
+                                        content.courseLectures.length > 0 && content.courseLectures.map((_, lectureIndex) => (
+                                            <div key={`content-${index}-lectureDot-${lectureIndex}`}
+                                                 className="relative h-full flex justify-center items-start"
+                                            >
+                                                <div
+                                                    className="w-8 aspect-square bg-gray rounded-full z-10"/>
+                                                {
+                                                    lectureIndex === content.courseLectures.length - 1 ? (
+                                                        <div
+                                                            className="absolute w-1 h-50/10 bg-white z-1 rounded-full"/>
+                                                    ) : (
+                                                        <div
+                                                            className="absolute w-1 h-50/10 bg-gray rounded-full"/>
+                                                    )
+                                                }
+                                            </div>
+                                        ))
+                                    }
+                                </div>
+                                {
+                                    content.courseLectures.length > 0 && content.courseLectures.map((lecture, lectureIndex) => {
+                                        return (
+                                            <div key={`content-${index}-lecture-${lectureIndex}`}
+                                                 className="col-span-5 col-start-2 row-span-1 flex flex-col gap-4">
+                                                {/*LECTURE HEADER*/}
+                                                <div className="flex justify-between items-center">
+                                                    <h3 className="font-semibold text-black/80 text-2xl text-left">Lecture {lectureIndex + 1}</h3>
+
+                                                    {/*Header Buttons*/}
+                                                    <div className="flex gap-2">
+                                                        {lectureIndex > 0 && (
+                                                            <button
+                                                                onClick={() => {
+                                                                    const updatedContent = [...course.courseContents];
+                                                                    const lectures = [...updatedContent[index].courseLectures];
+                                                                    [lectures[lectureIndex - 1], lectures[lectureIndex]] = [lectures[lectureIndex], lectures[lectureIndex - 1]];
+                                                                    lectures[lectureIndex - 1] = {
+                                                                        ...lectures[lectureIndex - 1],
+                                                                        position: lectureIndex
+                                                                    };
+                                                                    lectures[lectureIndex] = {
+                                                                        ...lectures[lectureIndex],
+                                                                        position: lectureIndex + 1
+                                                                    };
+                                                                    updatedContent[index].courseLectures = lectures;
+                                                                    setCourse({
+                                                                        ...course,
+                                                                        courseContents: updatedContent
+                                                                    });
+                                                                }}
+                                                                className="hover:bg-gray/60 transition-all duration-300 ease-out cursor-pointer
+                                                                rounded-sm px-1"
+                                                            >
+                                                                <ChevronUp size={28} opacity={0.6}/>
+                                                            </button>
+                                                        )}
+                                                        {lectureIndex < content.courseLectures.length - 1 && (
+                                                            <button
+                                                                onClick={() => {
+                                                                    const updatedContent = [...course.courseContents];
+                                                                    const lectures = [...updatedContent[index].courseLectures];
+                                                                    [lectures[lectureIndex], lectures[lectureIndex + 1]] = [lectures[lectureIndex + 1], lectures[lectureIndex]];
+                                                                    lectures[lectureIndex] = {
+                                                                        ...lectures[lectureIndex],
+                                                                        position: lectureIndex + 1
+                                                                    };
+                                                                    lectures[lectureIndex + 1] = {
+                                                                        ...lectures[lectureIndex + 1],
+                                                                        position: lectureIndex + 2
+                                                                    };
+                                                                    updatedContent[index].courseLectures = lectures;
+                                                                    setCourse({
+                                                                        ...course,
+                                                                        courseContents: updatedContent
+                                                                    });
+                                                                }}
+                                                                className="hover:bg-gray/60 transition-all duration-300 ease-out cursor-pointer
+                                                                rounded-sm px-1"
+                                                            >
+                                                                <ChevronDown size={28} opacity={0.6}/>
+                                                            </button>
+                                                        )}
+                                                        <button
+                                                            className="hover:bg-gray/60 rounded-sm px-2 py-1 cursor-pointer"
+                                                            onClick={() => setCourse({
+                                                                ...course,
+                                                                courseContents: course.courseContents.map((item, i) => {
+                                                                    if (i === index) {
+                                                                        const updatedLectures = item.courseLectures
+                                                                            .filter((_, li) => li !== lectureIndex)
+                                                                            .map((lecture, li) => ({
+                                                                                ...lecture,
+                                                                                position: li + 1
+                                                                            }));
+                                                                        return {
+                                                                            ...item,
+                                                                            courseLectures: updatedLectures
+                                                                        };
+                                                                    }
+                                                                    return item;
+                                                                })
+                                                            })}
+                                                        ><X size={28} opacity={0.6}/></button>
+                                                    </div>
+                                                </div>
+
+                                                <div className="flex gap-20 justify-between w-full">
+                                                    <AdminAddCourseInput
+                                                        label={`Title`}
+                                                        value={lecture.title}
+                                                        onChange={e => setCourse({
+                                                            ...course,
+                                                            courseContents: course.courseContents.map((item, i) => {
+                                                                if (i === index) {
+                                                                    const updatedLectures = item.courseLectures.map((l, li) => li === lectureIndex ? {
+                                                                        ...l,
+                                                                        title: e.target.value
+                                                                    } : l);
+                                                                    return {...item, courseLectures: updatedLectures};
+                                                                }
+                                                                return item;
+                                                            })
+                                                        })}
+                                                        type={"text"}
+                                                        width={"full"}
+                                                    />
+                                                    <AdminAddCourseInput
+                                                        label={`Duration (in minutes)`}
+                                                        value={lecture.durationMinutes}
+                                                        onChange={e => setCourse({
+                                                            ...course,
+                                                            courseContents: course.courseContents.map((item, i) => {
+                                                                if (i === index) {
+                                                                    const updatedLectures = item.courseLectures.map((l, li) => li === lectureIndex ? {
+                                                                        ...l,
+                                                                        durationMinutes: Number(e.target.value)
+                                                                    } : l);
+                                                                    return {...item, courseLectures: updatedLectures};
+                                                                }
+                                                                return item;
+                                                            })
+                                                        })}
+                                                        type={"number"}
+                                                        width={"fit"}
+                                                    />
+                                                    <AdminAddCourseInputSelect
+                                                        label={"Content Type"}
+                                                        onChange={e => setCourse({
+                                                            ...course,
+                                                            courseContents: course.courseContents.map((item, i) => {
+                                                                if (i === index) {
+                                                                    const updatedLectures = item.courseLectures.map((l, li) => li === lectureIndex ? {
+                                                                        ...l,
+                                                                        contentType: e.target.value as ContentType
+                                                                    } : l);
+                                                                    return {...item, courseLectures: updatedLectures};
+                                                                }
+                                                                return item;
+                                                            })
+                                                        })}
+                                                        options={[
+                                                            {value: "TEXT", name: "Text"},
+                                                            {value: "FILE", name: "File"},
+                                                            {value: "VIDEO", name: "Video"},
+                                                            {value: "QUIZ", name: "Quiz"},
+                                                            {value: "TOOL", name: "Tool"}
+                                                        ]}
+                                                    />
+                                                </div>
+                                                <AdminAddCourseInputTextArea
+                                                    label={`Description (2-3 sentences)`}
+                                                    rows={3}
+                                                    value={lecture.description}
+                                                    name={`description-${index}-${lectureIndex}`}
+                                                    placeholder={"Enter the description for the lecture here..."}
+                                                    onChange={e => setCourse({
+                                                        ...course,
+                                                        courseContents: course.courseContents.map((item, i) => {
+                                                            if (i === index) {
+                                                                const updatedLectures = item.courseLectures.map((l, li) => li === lectureIndex ? {
+                                                                    ...l,
+                                                                    description: e.target.value
+                                                                } : l);
+                                                                return {...item, courseLectures: updatedLectures};
+                                                            }
+                                                            return item;
+                                                        })
+                                                    })}/>
+                                                <AdminAddCourseInputTextArea
+                                                    label={`Content Text`}
+                                                    rows={6}
+                                                    value={lecture.contentText}
+                                                    name={`contentText-${index}-${lectureIndex}`}
+                                                    placeholder={"Enter the content text here..."}
+                                                    onChange={e => setCourse({
+                                                        ...course,
+                                                        courseContents: course.courseContents.map((item, i) => {
+                                                            if (i === index) {
+                                                                const updatedLectures = item.courseLectures.map((l, li) => li === lectureIndex ? {
+                                                                    ...l,
+                                                                    contentText: e.target.value
+                                                                } : l);
+                                                                return {...item, courseLectures: updatedLectures};
+                                                            }
+                                                            return item;
+                                                        })
+                                                    })}/>
+                                                {
+                                                    lecture.contentType !== "TEXT" && (
+                                                        <AdminAddCourseInput
+                                                            label={`Content ${lecture.contentType.charAt(0) + lecture.contentType.slice(1).toLowerCase()}`}
+                                                            onChange={e => {
+                                                                const file = e.target.files && e.target.files[0];
+                                                                if (!file) return;
+
+                                                                setCourseLectureFiles([
+                                                                    ...courseLectureFiles.filter(item => item.lecturePosition !== lecture.position || item.contentPosition !== content.position),
+                                                                    {
+                                                                        file,
+                                                                        type: lecture.contentType,
+                                                                        contentPosition: content.position,
+                                                                        lecturePosition: lecture.position
+                                                                    }
+                                                                ]);
+                                                            }}
+                                                            type={"file"}
+                                                            width={"full"}
+                                                        />
+                                                    )
+                                                }
+                                            </div>
+                                        )
+                                    })
+                                }
+                            </div>
+
+                            <button
+                                onClick={() =>
+                                    setCourse({
+                                        ...course,
+                                        courseContents: course.courseContents.map((item, i) => i === index ? {
+                                            ...item,
+                                            courseLectures: [
+                                                ...item.courseLectures,
+                                                {
+                                                    title: "",
+                                                    position: item.courseLectures.length + 1,
+                                                    contentText: "",
+                                                    contentStoragePath: "",
+                                                    contentType: "TEXT",
+                                                    description: "",
+                                                    durationMinutes: 0
+                                                }
+                                            ]
+                                        } : item)
+                                    })}
+                                className="hover:bg-shifter/20 transition-all ease-out duration-300
+                                px-12 py-2 rounded-sm text-shifter text-xl font-bold underline w-full cursor-pointer"
+                            >
+                                Add New Course Lecture
+                            </button>
+
+                            {
+                                index !== course.courseContents.length - 1 && (
+                                    <hr className="border-t-4 w-full border-black/20 rounded-full my-4"/>
+                                )
+                            }
+                        </div>
+                    )
+                })
+            }
+
+            <button
+                onClick={() =>
+                    setCourse({
+                        ...course,
+                        courseContents: [
+                            ...course.courseContents,
+                            {
+                                title: "",
+                                position: course.courseContents.length + 1,
+                                courseLectures: []
+                            }
+                        ]
+                    })
+                }
+                className="hover:bg-shifter/20 transition-all ease-out duration-300
+                px-12 py-2 rounded-sm text-shifter text-xl font-bold underline w-full cursor-pointer "
+            >
+                Add New Course Content
+            </button>
+        </div>
+    );
+}
+
+export default AdminAddCourseContents;
Index: frontend/src/admin/components/AdminAddCourseInfo.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseInfo.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/components/AdminAddCourseInfo.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,199 @@
+import AdminAddCourseInput from "./AdminAddCourseInput.tsx";
+import type {Difficulty} from "../../types/Difficulty.tsx";
+import AdminAddCourseInputWithPills from "./AdminAddCourseInputWithPills.tsx";
+import AdminAddCourseInputTextArea from "./AdminAddCourseInputTextArea.tsx";
+import type {CourseEntity} from "../types/CourseEntity.tsx";
+import AdminAddCourseInputSelect from "./AdminAddCourseInputSelect.tsx";
+import type {JSX} from "react";
+
+function AdminAddCourseInfo({course, setCourse, courseCard, setCourseImage}: {
+    course: CourseEntity;
+    setCourse: (course: CourseEntity) => void;
+    courseCard: JSX.Element;
+    setCourseImage: (image: File | null) => void;
+}) {
+
+    return (
+        <section className="flex flex-col gap-2">
+            <div className="grid grid-cols-3 gap-x-12">
+                {/*Course Card*/}
+                <div className="col-span-1 h-full flex items-center justify-center">
+                    {courseCard}
+                </div>
+
+                {/*Course Info*/}
+                <div className="flex flex-col gap-4 justify-center col-span-2 w-full">
+
+                    <AdminAddCourseInput
+                        label={"Course Image"}
+                        onChange={e => {
+                            // const file = e.target.files?.[0];
+                            // if (!file) return;
+                            const file = e.target.files ? e.target.files[0] : null;
+                            setCourseImage(file);
+                        }}
+                        type={"file"}
+                        width={"full"}
+                    />
+
+                    <AdminAddCourseInput
+                        label={"Short Title"}
+                        value={course.titleShort}
+                        onChange={e => setCourse({
+                            ...course,
+                            titleShort: e.target.value
+                        })}
+                        type={"text"}
+                        width={"full"}
+                    />
+
+                    <AdminAddCourseInput
+                        label={"Long Title"}
+                        value={course.title}
+                        onChange={e => setCourse({
+                            ...course,
+                            title: e.target.value
+                        })}
+                        type={"text"}
+                        width={"full"}
+                    />
+
+                    <AdminAddCourseInputWithPills
+                        label="Topics Covered"
+                        name="topicsCovered"
+                        options={course.topicsCovered}
+                        addPill={option => setCourse({
+                            ...course,
+                            topicsCovered: course.topicsCovered.includes(option) ? course.topicsCovered : [...course.topicsCovered, option]
+                        })}
+                        removePill={index => setCourse({
+                            ...course,
+                            topicsCovered: course.topicsCovered.filter((_, i) => i !== index)
+                        })}
+                        width={"full"}
+                    />
+
+                    <div className="flex justify-between w-full">
+                        <AdminAddCourseInput
+                            label={"Duration (in minutes)"}
+                            value={course.durationMinutes}
+                            onChange={e => setCourse({
+                                ...course,
+                                durationMinutes: Number(e.target.value)
+                            })}
+                            type={"number"}
+                            width={"fit"}
+                        />
+                        <AdminAddCourseInput
+                            label={"Price (in euros)"}
+                            value={course.price}
+                            onChange={e => setCourse({
+                                ...course,
+                                price: Number(e.target.value)
+                            })}
+                            type={"number"}
+                            width={"fit"}
+                        />
+                        <AdminAddCourseInputSelect
+                            label={"Difficulty"}
+                            onChange={e => setCourse({
+                                ...course,
+                                difficulty: e.target.value as Difficulty
+                            })}
+                            options={[
+                                {value: "BEGINNER", name: "Beginner"},
+                                {value: "INTERMEDIATE", name: "Intermediate"},
+                                {value: "ADVANCED", name: "Advanced"},
+                                {value: "EXPERT", name: "Expert"}
+                            ]}
+                        />
+                    </div>
+
+                    <div className="flex gap-4 w-fit items-end">
+                        <AdminAddCourseInput
+                            label={"Color (in hex)"}
+                            value={course.color}
+                            onChange={e => setCourse({
+                                ...course,
+                                color: e.target.value
+                            })}
+                            type={"text"}
+                            width={"fit"}
+                        />
+                        <div
+                            style={{backgroundColor: course.color}}
+                            className="ml-auto h-2/3 aspect-square rounded-sm"
+                        />
+                    </div>
+
+                    <AdminAddCourseInputWithPills
+                        label="Skills Gained"
+                        name="skillsGained"
+                        options={course.skillsGained}
+                        addPill={option => setCourse({
+                            ...course,
+                            skillsGained: course.skillsGained.includes(option) ? course.skillsGained : [...course.skillsGained, option]
+                        })}
+                        removePill={index => setCourse({
+                            ...course,
+                            skillsGained: course.skillsGained.filter((_, i) => i !== index)
+                        })}
+                        width={"full"}
+                    />
+                </div>
+            </div>
+
+            <div className="flex flex-col gap-6">
+                <AdminAddCourseInputWithPills
+                    label="What will be learned (1-2 sentences)"
+                    name="whatWillBeLearned"
+                    options={course.whatWillBeLearned}
+                    addPill={option => setCourse({
+                        ...course,
+                        whatWillBeLearned: course.whatWillBeLearned.includes(option) ? course.whatWillBeLearned : [...course.whatWillBeLearned, option]
+                    })}
+                    removePill={index => setCourse({
+                        ...course,
+                        whatWillBeLearned: course.whatWillBeLearned.filter((_, i) => i !== index)
+                    })}
+                    width={"full"}
+                />
+                <AdminAddCourseInputTextArea
+                    label={"Description Short (1-2 sentences)"}
+                    name={"descriptionShort"}
+                    value={course.descriptionShort}
+                    placeholder={"Enter a short description of the course"}
+                    rows={1}
+                    onChange={e => setCourse({
+                        ...course,
+                        descriptionShort: e.target.value
+                    })}
+                />
+                <AdminAddCourseInputTextArea
+                    label={"Description Medium (2-3 sentences)"}
+                    name={"description"}
+                    value={course.description}
+                    placeholder={"Enter a description of the course"}
+                    rows={3}
+                    onChange={e => setCourse({
+                        ...course,
+                        description: e.target.value
+                    })}
+                />
+                <AdminAddCourseInputTextArea
+                    label={"Description Long"}
+                    name={"descriptionLong"}
+                    value={course.descriptionLong}
+                    placeholder={"Enter a detailed description of the course"}
+                    rows={6}
+                    onChange={e => setCourse({
+                        ...course,
+                        descriptionLong: e.target.value
+                    })}
+                />
+            </div>
+        </section>
+    )
+}
+
+export default AdminAddCourseInfo;
Index: frontend/src/admin/components/AdminAddCourseInput.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseInput.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/components/AdminAddCourseInput.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,32 @@
+import React from "react";
+
+function Input({label, name, value, type, onChange, width}: {
+    label: string;
+    name?: string;
+    value?: string | number;
+    type: "text" | "number" | "file";
+    onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
+    width: "fit" | "full"
+}) {
+    return (
+        <div className={`flex flex-col gap-1 items-start ${width === "full" ? "w-full" : "w-fit"}`}>
+            <label className="text-md font-medium text-black/60 whitespace-nowrap">{label}</label>
+            <input
+                type={type}
+                value={type !== "file" ? value : undefined}
+                name={name}
+                onChange={onChange}
+                className={`border-2 border-transparent focus:outline-none focus:border-black/40
+                text-lg px-2 py-2 bg-[#FFF] w-full rounded-sm shadow-sm shadow-black/10
+                file:mr-4 file:py-2 file:px-4
+                file:rounded-sm file:border-0
+                file:text-sm file:font-semibold
+                file:bg-black/10 file:text-black/70
+                hover:file:bg-black/20
+                ${type === "file" ? "cursor-pointer" : ""}`}
+            />
+        </div>
+    )
+}
+
+export default Input;
Index: frontend/src/admin/components/AdminAddCourseInputSelect.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseInputSelect.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/components/AdminAddCourseInputSelect.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,29 @@
+import React from "react";
+
+function AdminAddCourseInputSelect({label, value, options, onChange}: {
+    label: string;
+    value?: string | number;
+    options: {value: string, name: string}[];
+    onChange?: (e: React.ChangeEvent<HTMLSelectElement>) => void;
+}) {
+    return (
+        <div className="flex flex-col gap-1 items-start">
+            <label
+                className="text-md font-medium text-black/60 whitespace-nowrap">{label}</label>
+            <select
+                value={value}
+                onChange={onChange}
+                className="border-2 border-transparent focus:outline-none focus:border-black/40
+                                                    text-lg px-2 py-2 bg-[#FFF] rounded-sm shadow-sm shadow-black/10"
+            >
+                {
+                    options.map((o, index) => (
+                        <option value={o.value} key={index}>{o.name}</option>
+                    ))
+                }
+            </select>
+        </div>
+    )
+}
+
+export default AdminAddCourseInputSelect;
Index: frontend/src/admin/components/AdminAddCourseInputTextArea.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseInputTextArea.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/components/AdminAddCourseInputTextArea.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,28 @@
+import React from "react";
+
+function InputTextArea({label, name, value, placeholder, rows, onChange}: {
+    label: string;
+    name: string;
+    value: string;
+    placeholder: string;
+    rows: number;
+    onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
+}) {
+    return (
+        <div className="flex flex-col gap-1 items-start">
+            <label className="text-md font-medium text-black/60">{label}</label>
+            <textarea
+                name={name}
+                value={value}
+                rows={rows}
+                placeholder={placeholder}
+                onChange={onChange}
+                className="resize-none overflow-hidden min-h-fit
+                border-2 border-transparent focus:outline-none focus:border-black/40
+                text-lg px-2 py-2 bg-[#FFF] w-full rounded-sm shadow-sm shadow-black/10 overflow-y-auto scrollable-show"
+            />
+        </div>
+    )
+}
+
+export default InputTextArea;
Index: frontend/src/admin/components/AdminAddCourseInputWithPills.tsx
===================================================================
--- frontend/src/admin/components/AdminAddCourseInputWithPills.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/components/AdminAddCourseInputWithPills.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,58 @@
+import {X} from "lucide-react";
+import AdminAddCourseInput from "./AdminAddCourseInput.tsx";
+
+function InputWithPills({label, name, options, addPill, removePill, width}: {
+    name: string;
+    label: string;
+    options: string[];
+    addPill: (option: string) => void;
+    removePill: (index: number) => void;
+    width: "full" | "fit";
+}) {
+    return (
+        <div className="flex flex-col gap-4 ">
+            <form
+                onSubmit={e => {
+                    e.preventDefault()
+                    const form = e.target as HTMLFormElement;
+                    const input = form.elements.namedItem(name) as HTMLInputElement;
+                    const option = input.value.trim();
+                    addPill(option)
+                    form.reset()
+                }}
+                className="flex gap-8 items-end w-full">
+                <AdminAddCourseInput
+                    type={"text"}
+                    label={label}
+                    name={name}
+                    width={width}
+                />
+                <button
+                    type="submit"
+                    className="hover:shadow-lg shadow-md shadow-shifter/40 transition-all ease-out duration-300
+                                border-2 border-white/40 px-12 py-2 bg-shifter rounded-sm text-white text-lg w-fit cursor-pointer "
+                >
+                    Add
+                </button>
+            </form>
+
+            <div className="flex flex-wrap gap-2 items-center justify-start">
+                {
+                    options.length > 0 && options.map((option, index) => (
+                        <button
+                            onClick={() => removePill(index)}
+                            className="hover:opacity-60 transition-all ease-out duration-300 cursor-pointer
+                                        flex items-center gap-2 px-4 py-2 rounded-md bg-black/40 text-white shadow-sm"
+                            key={index}
+                        >
+                            <span>{option}</span>
+                            <X size={20}/>
+                        </button>
+                    ))
+                }
+            </div>
+        </div>
+    )
+}
+
+export default InputWithPills;
Index: frontend/src/admin/pages/AdminAddCourse.tsx
===================================================================
--- frontend/src/admin/pages/AdminAddCourse.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/pages/AdminAddCourse.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,134 @@
+import {useState} from "react";
+import type {CourseEntity} from "../types/CourseEntity.tsx";
+import CourseCard from "../../components/CourseCard.tsx";
+import {createCourseApi, uploadCourseFilesApi} from "../api/addCourse.ts";
+import {useAuthContext} from "../../context/AuthContext.tsx";
+import type {ContentType} from "../../types/ContentType.tsx";
+import AdminAddCourseInfo from "../components/AdminAddCourseInfo.tsx";
+import AdminAddCourseContent from "../components/AdminAddCourseContent.tsx";
+import {useNavigate} from "react-router-dom";
+
+function AdminAddCourse() {
+    const [course, setCourse] = useState<CourseEntity>({
+        imageUrl: "",
+        color: "#000000",
+        titleShort: "",
+        title: "",
+        difficulty: "BEGINNER",
+        durationMinutes: 0,
+        price: 0,
+        descriptionShort: "",
+        description: "",
+        descriptionLong: "",
+        whatWillBeLearned: [],
+        skillsGained: [],
+        topicsCovered: [],
+        courseContents: []
+    })
+    const [courseImage, setCourseImage] = useState<File | null>(null);
+    const [courseLectureFiles, setCourseLectureFiles] = useState<{file: File, type: ContentType, contentPosition: number, lecturePosition: number}[]>([]);
+    const [error, setError] = useState<string | null>(null);
+    const [loading, setLoading] = useState<boolean>(false);
+    const {accessToken} = useAuthContext();
+    const navigate = useNavigate();
+
+    const courseCard = (
+        <CourseCard card={{
+            id: 0, // temporary since new course has no ID yet
+            imageUrl: courseImage ? URL.createObjectURL(courseImage) : "",
+            color: course.color,
+            titleShort: course.titleShort,
+            title: course.title,
+            difficulty: course.difficulty,
+            durationMinutes: course.durationMinutes,
+            price: course.price,
+            rating: 0,
+            ratingCount: 0,
+            skillsGained: course.skillsGained,
+            topicsCovered: course.topicsCovered,
+            courseContentCount: course.courseContents.length
+        }}/>
+    )
+
+    const handleAddCourse = async () => {
+        if (
+            !courseImage ||
+            !course.titleShort || !course.title || !course.difficulty || !course.durationMinutes ||
+            !course.descriptionShort || !course.description || !course.descriptionLong ||
+            course.whatWillBeLearned.length === 0 || course.skillsGained.length === 0 || course.topicsCovered.length === 0 ||
+            course.courseContents.length === 0
+        ) {
+            setError("Please fill in all fields");
+            return;
+        }
+
+        const formData = new FormData();
+        formData.append("courseImage", courseImage);
+        courseLectureFiles.forEach(courseLectureFile => {
+            formData.append("files", courseLectureFile.file);
+            formData.append("types", courseLectureFile.type);
+            formData.append("meta", JSON.stringify({
+                contentPosition: courseLectureFile.contentPosition,
+                lecturePosition: courseLectureFile.lecturePosition
+            }));
+        });
+
+        console.log(JSON.stringify(course).length);
+        setLoading(true);
+        setError(null);
+
+        try {
+            const courseId = await createCourseApi(JSON.stringify(course), accessToken || "");
+            if (!courseId) {
+                throw new Error("Failed to create course.");
+            }
+
+            try {
+                await uploadCourseFilesApi(courseId, formData, accessToken || "");
+                navigate('/')
+            } catch (err) {
+                console.error("Error uploading course image and lecture files:", err);
+                setError("An error occurred while uploading course image and lecture files. Please try again or contact support.");
+            }
+        } catch (err) {
+            console.error("Error creating course:", err);
+            setError("An error occurred while creating the course. Please try again or contact support.");
+        } finally {
+            setLoading(false);
+        }
+    };
+
+    return (
+        <main className="flex flex-col gap-12 px-horizontal-md py-vertical-md">
+            <AdminAddCourseInfo
+                course={course}
+                setCourse={setCourse}
+                courseCard={courseCard}
+                setCourseImage={setCourseImage}
+            />
+            <AdminAddCourseContent
+                course={course}
+                setCourse={setCourse}
+                courseLectureFiles={courseLectureFiles}
+                setCourseLectureFiles={setCourseLectureFiles}
+            />
+            {
+                error &&
+                <p className="text-lg text-red-500 text-center">
+                    {error}
+                </p>
+            }
+            <button
+                onClick={handleAddCourse}
+                disabled={loading}
+                className={`hover:shadow-lg transition-all duration-400 ease-in-out
+                w-full py-2 border-2 border-white/40 bg-shifter rounded-sm text-white font-medium text-2xl shadow-md shadow-shifter/40 
+                disabled:opacity-60 disabled:cursor-not-allowed cursor-pointer`}
+            >
+                {loading ? "Creating..." : "Create Course"}
+            </button>
+        </main>
+    )
+}
+
+export default AdminAddCourse;
Index: frontend/src/admin/types/CourseContentEntity.tsx
===================================================================
--- frontend/src/admin/types/CourseContentEntity.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/types/CourseContentEntity.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,7 @@
+import type {CourseLectureEntity} from "./CourseLectureEntity.tsx";
+
+export interface CourseContentEntity {
+    title: string;
+    position: number;
+    courseLectures: CourseLectureEntity[];
+}
Index: frontend/src/admin/types/CourseEntity.tsx
===================================================================
--- frontend/src/admin/types/CourseEntity.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/types/CourseEntity.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,19 @@
+import type {Difficulty} from "../../types/Difficulty.tsx";
+import type {CourseContentEntity} from "./CourseContentEntity.tsx";
+
+export interface CourseEntity {
+    imageUrl: string;
+    color: string;
+    titleShort: string;
+    title: string;
+    difficulty: Difficulty;
+    durationMinutes: number;
+    price: number;
+    descriptionShort: string;
+    description: string;
+    descriptionLong: string;
+    whatWillBeLearned: string[];
+    skillsGained: string[];
+    topicsCovered: string[];
+    courseContents: CourseContentEntity[];
+}
Index: frontend/src/admin/types/CourseLectureEntity.tsx
===================================================================
--- frontend/src/admin/types/CourseLectureEntity.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/types/CourseLectureEntity.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,11 @@
+import type {ContentType} from "../../types/ContentType.tsx";
+
+export interface CourseLectureEntity {
+    title: string;
+    description: string;
+    durationMinutes: number;
+    position: number;
+    contentText: string;
+    contentStoragePath: string;
+    contentType: ContentType;
+}
Index: frontend/src/admin/types/UploadedFileResponse.ts
===================================================================
--- frontend/src/admin/types/UploadedFileResponse.ts	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/types/UploadedFileResponse.ts	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,5 @@
+export interface UploadedFileResponse {
+    type: string;
+    url: string;
+    meta: Record<string, never>;
+}
Index: frontend/src/admin/utils/AdminNavbar.tsx
===================================================================
--- frontend/src/admin/utils/AdminNavbar.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/admin/utils/AdminNavbar.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,42 @@
+import {Link} from "react-router-dom";
+import logo from "../../../public/Shifter-S2W-Transparent.png"
+import NavbarLink from "../../components/NavbarLink.tsx";
+import {useAuthContext} from "../../context/AuthContext.tsx";
+
+function AdminNavbar() {
+    const {logout} = useAuthContext();
+
+    return (
+        <nav className="flex items-center justify-between px-horizontal-sm py-2 z-10 shadow-md shadow-black/10">
+            <Link to="/">
+                <img
+                    src={logo} alt="Shifter Logo"
+                    className="h-16 w-auto"
+                />
+            </Link>
+
+            <div className="flex items-center gap-20">
+                <ul className="flex gap-8 items-center text-lg font-medium">
+                    <li><NavbarLink
+                        to="/add-course"
+                        label="Add Course"
+                    /></li>
+                    <li><NavbarLink
+                        to="/analytics"
+                        label="Analytics"
+                    /></li>
+                </ul>
+
+                <button
+                    onClick={logout}
+                    className="hover:bg-[#F00]/60 px-8 py-2 rounded-sm hover:text-white transition-all duration-300 ease-in-out
+                    text-[#F00] text-lg font-medium cursor-pointer"
+                >
+                    Log Out
+                </button>
+            </div>
+        </nav>
+    )
+}
+
+export default AdminNavbar;
Index: frontend/src/api/courseApi.ts
===================================================================
--- frontend/src/api/courseApi.ts	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/api/courseApi.ts	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,5 +1,3 @@
-import type {FilterParams} from "../types/FilterParams.tsx";
 import axios from "axios";
-import qs from 'qs';
 import type {CoursePreview} from "../types/CoursePreview.tsx";
 import type {CourseDetail} from "../types/CourseDetail.tsx";
@@ -7,10 +5,22 @@
 const backendUrl = import.meta.env.VITE_BACKEND_URL;
 
-export const fetchCoursesApi = async (accessToken?: string, params?: FilterParams, signal?: AbortSignal): Promise<CoursePreview[]> => {
+// export const fetchCoursesApi = async (accessToken?: string, params?: FilterParams, signal?: AbortSignal): Promise<CoursePreview[]> => {
+//     const res = await axios.get(
+//         `${backendUrl}/api/courses`,
+//         {
+//             params,
+//             paramsSerializer: params => qs.stringify(params, {arrayFormat: 'repeat'}),
+//             signal,
+//             headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : undefined
+//
+//         }
+//     )
+//
+//     return res.data;
+// }
+export const fetchCoursesApi = async (accessToken?: string, signal?: AbortSignal): Promise<CoursePreview[]> => {
     const res = await axios.get(
         `${backendUrl}/api/courses`,
         {
-            params,
-            paramsSerializer: params => qs.stringify(params, {arrayFormat: 'repeat'}),
             signal,
             headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : undefined
Index: frontend/src/components/CourseCard.tsx
===================================================================
--- frontend/src/components/CourseCard.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/components/CourseCard.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -7,12 +7,13 @@
 import HeartOutline from "../assets/icons/HeartOutline.tsx";
 import HeartFill from "../assets/icons/HeartFill.tsx";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 import {toggleFavoriteCourseApi} from "../api/userApi.ts";
 import {showInfoToast} from "../utils/showInfoToast.ts";
+import {Sparkle} from "lucide-react";
 
 
 
 function CourseCard({ card }: {card: CoursePreview}) {
-    const { accessToken, user, setUser } = useGlobalContext()
+    const { accessToken, user, setUser } = useAuthContext()
     const [isHoveredButton, setisHoveredButton] = React.useState<boolean>(false);
     const [isHoveredHeart, setIsHoveredHeart] = React.useState<boolean>(false);
@@ -91,10 +92,20 @@
             {/*INFO*/}
             <div className="flex flex-wrap gap-2 whitespace-nowrap">
-                <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                    <StarFilled className="w-4 h-4 text-gold"/> {card.rating / card.ratingCount}
-                </div>
-                <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
-                    {card.ratingCount} reviews
-                </div>
+                {
+                    card.ratingCount > 10 ? (
+                        <>
+                            <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
+                                <StarFilled className="w-4 h-4 text-gold"/> {card.rating / card.ratingCount}
+                            </div>
+                            <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
+                                {card.ratingCount} reviews
+                            </div>
+                        </>
+                    ) : (
+                        <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
+                            <Sparkle className="w-4 h-4 text-gold"/> New
+                        </div>
+                    )
+                }
                 <div className="flex items-center gap-1 px-2 border-1 border-black/20 rounded-sm text-black/60">
                     {(card.durationMinutes / 60).toFixed(1)} hours
Index: frontend/src/components/CoursesCarouselCourseDetails.tsx
===================================================================
--- frontend/src/components/CoursesCarouselCourseDetails.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/components/CoursesCarouselCourseDetails.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -2,5 +2,5 @@
 import Slider from "react-slick";
 import CourseCard from "./CourseCard.tsx";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 import {useEffect} from "react";
 import {fetchRecommendedCoursesApi} from "../api/courseApi.ts";
@@ -9,5 +9,5 @@
 function CoursesCarouselCourseDetails() {
     const {recommendedCourses, setRecommendedCourses} = useCourseStorage();
-    const {accessToken} = useGlobalContext();
+    const {accessToken} = useAuthContext();
 
     useEffect(() => {
@@ -39,18 +39,31 @@
 
             <div className="relative mx-0 my-auto w-full p-0">
-                <Slider {...settings}>
-                    {
-                        recommendedCourses ?
-                            recommendedCourses.map((course, index) => (
-                                <CourseCard card={course} key={index}/>
-                                // <div className="h-full flex flex-col justify-center bg-red-500" key={index}>
-                                //     <CourseCard card={course}/>
-                                // </div>
-                            )) :
-                            [...Array(4)].map((_, index) => (
-                                <CourseCardSkeleton key={index} />
-                            ))
-                    }
-                </Slider>
+                {recommendedCourses && recommendedCourses.length > 0 ? (
+                    recommendedCourses.length <= 3 ? (
+                        <div className="flex gap-4 justify-center items-center">
+                            {recommendedCourses.map((course, index) => (
+                                <div key={index} className="max-w-1/3">
+                                    <CourseCard card={course} key={index}/>
+                                </div>
+                            ))}
+                        </div>
+                    ) : (
+                        <Slider {...settings}>
+                            {recommendedCourses.map((course, index) => (
+                                <div key={index}>
+                                    <CourseCard card={course}/>
+                                </div>
+                            ))}
+                        </Slider>
+                    )
+                ) : (
+                    <Slider {...settings}>
+                        {[...Array(4)].map((_, index) => (
+                            <div key={index}>
+                                <CourseCardSkeleton/>
+                            </div>
+                        ))}
+                    </Slider>
+                )}
             </div>
         </section>
Index: frontend/src/components/CoursesCarouselHome.tsx
===================================================================
--- frontend/src/components/CoursesCarouselHome.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/components/CoursesCarouselHome.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -11,8 +11,9 @@
 function CoursesCarouselHome() {
     const {recommendedCourses} = useCourseStorage();
+    console.log(recommendedCourses)
 
     return (
         <section
-            className="relative flex flex-col gap-10 items-center bg-dark-blue/10 py-vertical-md px-4 overflow-clip">
+            className="relative flex flex-col gap-10 items-center bg-dark-blue/10 py-vertical-md px-horizontal-lg overflow-clip">
             <img src={ShifterArrow} alt="Shifter Arrow"
                  className="absolute opacity-30 h-150 w-120 -rotate-130 -top-30 right-0"/>
@@ -30,20 +31,34 @@
             </div>
 
-            <div className="relative max-w-[85%] mx-0 my-auto w-full p-0">
-                <Slider {...settings}>
-                    {
-                        recommendedCourses ?
-                            recommendedCourses.map((course, index) => (
-                                <CourseCard card={course} key={index}/>
-                                // <div className="h-full flex flex-col justify-center bg-red-500" key={index}>
-                                //     <CourseCard card={course}/>
-                                // </div>
-                            )) :
-                            [...Array(4)].map((_, index) => (
-                                <CourseCardSkeleton key={index} />
-                            ))
-                    }
-                </Slider>
+            <div className="relative mx-0 my-auto w-full p-0">
+                {recommendedCourses && recommendedCourses.length > 0 ? (
+                    recommendedCourses.length <= 3 ? (
+                        <div className="flex gap-4 justify-center items-center">
+                            {recommendedCourses.map((course, index) => (
+                                <div key={index} className="max-w-1/3">
+                                    <CourseCard card={course} key={index}/>
+                                </div>
+                            ))}
+                        </div>
+                    ) : (
+                        <Slider {...settings}>
+                            {recommendedCourses.map((course, index) => (
+                                <div key={index}>
+                                    <CourseCard card={course}/>
+                                </div>
+                            ))}
+                        </Slider>
+                    )
+                ) : (
+                    <Slider {...settings}>
+                        {[...Array(4)].map((_, index) => (
+                            <div key={index}>
+                                <CourseCardSkeleton/>
+                            </div>
+                        ))}
+                    </Slider>
+                )}
             </div>
+
         </section>
     );
Index: frontend/src/components/CoursesFilters.tsx
===================================================================
--- frontend/src/components/CoursesFilters.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/components/CoursesFilters.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -3,5 +3,5 @@
 import {durationToQueryMapper, priceToQueryMapper} from "../utils/mapper.ts";
 import type {FilterParams} from "../types/FilterParams.tsx";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 
 function CoursesFilters({filters, setFilters, topics, skills}: {
@@ -11,5 +11,5 @@
     skills: string[] | null,
 }) {
-    const {user} = useGlobalContext();
+    const {user} = useAuthContext();
     const duration = [
         "< 3 hours",
@@ -87,5 +87,5 @@
             className="flex flex-col gap-8 pl-8 pt-12 text-left sticky top-0 h-screen border-r-2 border-black/10">
             <h2 className="text-2xl font-medium">Filter by</h2>
-            <div className="relative flex flex-col gap-12 pl-4 pr-2 pb-20 overflow-y-auto scrollable">
+            <div className="relative flex flex-col gap-12 pl-4 pr-2 pb-20 overflow-y-scroll scrollable">
                 {
                     user && (
Index: frontend/src/components/DashboardCourses.tsx
===================================================================
--- frontend/src/components/DashboardCourses.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/components/DashboardCourses.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -2,5 +2,5 @@
 import {fetchCoursesApi, fetchEnrolledCoursesApi} from "../api/courseApi.ts";
 import type {CoursePreview} from "../types/CoursePreview.tsx";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 import {useCourseStorage} from "../context/CourseStorage.ts";
 import StarFilled from "../assets/icons/StarFilled.tsx";
@@ -8,5 +8,5 @@
 function DashboardCourses() {
     const {allCourses: allCoursesStorage, setAllCourses: setAllCoursesStorage} = useCourseStorage();
-    const {user, loading, accessToken} = useGlobalContext();
+    const {user, loading, accessToken} = useAuthContext();
 
     const [selectedTab, setSelectedTab] = useState("all");
Index: frontend/src/components/HeroCourseDetails.tsx
===================================================================
--- frontend/src/components/HeroCourseDetails.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/components/HeroCourseDetails.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -13,10 +13,15 @@
         {
             header: `${course?.durationMinutes && (course.durationMinutes / 60).toFixed(1)} Hours Duration`,
-            description: 'Self-paced course with flexible learning and optional exercises and templates.'
+            description: 'Learn at your own pace with flexible timing, plus optional exercises and helpful templates.'
         },
         {
-            header: `${(course?.rating || 0) / (course?.ratingCount || 1)} Rating`,
-            description: 'Rated highly by learners for its practical insights and actionable strategies.'
-        },
+            header: course?.ratingCount && course.ratingCount > 10
+                ? `${(course.rating || 0) / course.ratingCount} Rating`
+                : `New & Trending`,
+            description: course?.ratingCount && course.ratingCount > 10
+                ? 'Rated highly by learners for its practical insights and actionable strategies.'
+                : 'New to the platform, this course is growing quickly. Be among the first learners to benefit from its insights.'
+        }
+        ,
     ]
 
@@ -88,5 +93,5 @@
                         <div
                             key={index}
-                            className="flex flex-col gap-4 text-left px-20 py-8 border-r-2 border-white/40 last:border-r-0"
+                            className="w-1/3 flex flex-col gap-4 text-left px-20 py-8 border-r-2 border-white/40 last:border-r-0"
                         >
                             <h2 className="text-3xl font-bold">{info.header}</h2>
Index: frontend/src/components/NavbarLink.tsx
===================================================================
--- frontend/src/components/NavbarLink.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/components/NavbarLink.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,12 @@
+import {Link} from "react-router-dom";
+
+const NavbarLink = ({to, label, className}: { to: string; label: string, className?: string; }) => (
+    <div className={`flex flex-col gap-0 overflow-clip p-1 group ${className}`}>
+        <Link to={to} className="transition-all duration-300 ease-in-out z-10">
+            {label}
+        </Link>
+        <hr className="relative -left-30 group-hover:-left-6 border-t-2 rounded-full transition-all duration-300 ease-in-out"/>
+    </div>
+);
+
+export default NavbarLink;
Index: frontend/src/components/ProfileInfo.tsx
===================================================================
--- frontend/src/components/ProfileInfo.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/components/ProfileInfo.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,6 +1,6 @@
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 
 function ProfileInfo() {
-    const {user} = useGlobalContext();
+    const {user} = useAuthContext();
 
     return (
Index: frontend/src/components/ProfileModalAddSkills&Interests.tsx
===================================================================
--- frontend/src/components/ProfileModalAddSkills&Interests.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/components/ProfileModalAddSkills&Interests.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -3,5 +3,5 @@
 import React, {useEffect} from "react";
 import {fetchCoursesSkillsApi, fetchCoursesTopicsApi, fetchRecommendedCoursesApi} from "../api/courseApi.ts";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 import {X} from "lucide-react";
 import ProfileModalAddSkillsInterestsSkeleton from "./skeletons/ProfileModalAddSkills&InterestsSkeleton.tsx";
@@ -14,5 +14,5 @@
     closeModal: () => void;
 }) {
-    const {user, setUser, accessToken} = useGlobalContext();
+    const {user, setUser, accessToken} = useAuthContext();
     const {setRecommendedCourses} = useCourseStorage();
     const [allOptions, setAllOptions] = React.useState<string[]>([]);
Index: frontend/src/components/ProfileMyProfile.tsx
===================================================================
--- frontend/src/components/ProfileMyProfile.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/components/ProfileMyProfile.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,3 +1,3 @@
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 import React, {useState} from "react";
 import {updateUserApi} from "../api/userApi.ts";
@@ -5,5 +5,5 @@
 function ProfileMyProfile() {
     const [loading, setLoading] = useState(false);
-    const {user, setUser, accessToken} = useGlobalContext();
+    const {user, setUser, accessToken} = useAuthContext();
 
     const [formData, setFormData] = useState({
@@ -63,5 +63,5 @@
                     <button
                         className="shadow-md shadow-shifter/30 hover:shadow-lg hover:shadow-shifter/50 transition-all duration-200 ease-in-out cursor-pointer
-                    bg-shifter px-12 py-2 w-fit text-white rounded-sm font-semibold border-2 border-white/40"
+                        bg-shifter px-12 py-2 w-fit text-white rounded-sm font-semibold border-2 border-white/40"
                         type="submit">
                         {loading ? "Saving..." : "Save Changes"}
Index: frontend/src/components/inputs/RegisterSlider.tsx
===================================================================
--- frontend/src/components/inputs/RegisterSlider.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/components/inputs/RegisterSlider.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -2,5 +2,4 @@
 import type {UserRegister} from "../../types/UserRegister.tsx";
 import type {SliderProps} from "../../types/SliderProps.tsx";
-import {toEnumFormat} from "../../utils/toEnumFormat.ts";
 
 function RegisterSlider(sliderProps: SliderProps) {
@@ -48,5 +47,5 @@
             <div className="relative custom-scrollbar flex gap-2 flex-wrap w-full max-h-[30vh] items-center overflow-y-auto">
                 {options.map((option, index) => {
-                    const isSelected = sliderProps.user[sliderProps.name]?.includes(toEnumFormat(option)) || false;
+                    const isSelected = sliderProps.user[sliderProps.name]?.includes(option) || false;
 
                     return (
Index: frontend/src/components/routeProtectors/AdminOnlyRoute.tsx
===================================================================
--- frontend/src/components/routeProtectors/AdminOnlyRoute.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/components/routeProtectors/AdminOnlyRoute.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,19 @@
+import type {JSX} from "react";
+import {useAuthContext} from "../../context/AuthContext.tsx";
+import {Navigate} from "react-router-dom";
+
+const AdminOnlyRoute = ({children}: { children: JSX.Element }) => {
+    const {user, authChecked} = useAuthContext();
+
+    if (!authChecked) {
+        return null;
+    }
+
+    if (user?.isAdmin)
+        return children;
+
+
+    return <Navigate to="/" replace/>;
+};
+
+export default AdminOnlyRoute;
Index: frontend/src/components/routeProtectors/PublicOnlyRoute.tsx
===================================================================
--- frontend/src/components/routeProtectors/PublicOnlyRoute.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/components/routeProtectors/PublicOnlyRoute.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,17 @@
+import type {JSX} from "react";
+import { useAuthContext } from "../../context/AuthContext.tsx";
+import { Navigate } from "react-router-dom";
+
+const PublicOnlyRoute = ({ children }: { children: JSX.Element }) => {
+    const { user, authChecked } = useAuthContext();
+
+    if (!authChecked) {
+        return null;
+    }
+
+    if (user) return <Navigate to="/" replace />;
+
+    return children;
+};
+
+export default PublicOnlyRoute;
Index: frontend/src/components/routeProtectors/UserOnlyRoute.tsx
===================================================================
--- frontend/src/components/routeProtectors/UserOnlyRoute.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/components/routeProtectors/UserOnlyRoute.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,16 @@
+import {Navigate} from "react-router-dom";
+import type {JSX} from "react";
+import {useAuthContext} from "../../context/AuthContext.tsx";
+
+const UserOnlyRoute = ({ children }: {
+    children: JSX.Element;
+}) => {
+    const { user } = useAuthContext();
+
+    if (!user)
+        return <Navigate to="/login" replace />;
+
+    return children;
+};
+
+export default UserOnlyRoute;
Index: frontend/src/context/AuthContext.tsx
===================================================================
--- frontend/src/context/AuthContext.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/context/AuthContext.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,133 @@
+import React, {
+    createContext,
+    useState,
+    useEffect,
+    type ReactNode,
+    type Dispatch,
+    type SetStateAction,
+} from "react";
+import type {User} from "../types/User.tsx";
+import type {UserRegister} from "../types/UserRegister.tsx";
+import {loginApi, logoutApi, refreshAccessTokenApi, registerApi} from "../api/auth.ts";
+import {useNavigate} from "react-router-dom";
+
+interface AuthContextType {
+    user: User | null;
+    setUser: Dispatch<SetStateAction<User | null>>;
+    accessToken: string | null;
+    setAccessToken: Dispatch<SetStateAction<string | null>>;
+    authChecked: boolean;
+    setAuthChecked: Dispatch<SetStateAction<boolean>>;
+    register: (user: UserRegister) => Promise<void>;
+    login: (email: string, password: string) => Promise<void>;
+    logout: () => void;
+    refreshAccessToken: () => Promise<void>;
+    loading: boolean;
+}
+
+export const AuthContext = createContext<AuthContextType | undefined>(
+    undefined
+);
+
+export const AuthProvider = ({children}: { children: ReactNode }) => {
+    const [user, setUser] = useState<User | null>(null);
+    const [accessToken, setAccessToken] = useState<string | null>(null);
+    const [authChecked, setAuthChecked] = useState<boolean>(false);
+    const [loading, setLoading] = useState(true);
+    const navigate = useNavigate();
+
+    const register = async (user: UserRegister) => {
+        return registerApi(user)
+            .then(data => {
+                setAccessToken(data.accessToken);
+                setUser(data.user);
+            })
+            .catch(error => {
+                setAccessToken(null);
+                setUser(null);
+                console.log("Registration failed:", error);
+                throw error;
+            });
+    }
+
+    const login = async (email: string, password: string) => {
+        return loginApi(email, password)
+            .then(data => {
+                setAccessToken(data.accessToken);
+                setUser(data.user);
+            })
+            .catch(error => {
+                    setAccessToken(null);
+                    setUser(null);
+                    console.log("Login failed:", error);
+                    throw error;
+            });
+    };
+
+    const logout = async () => {
+        return logoutApi()
+            .then(() => {
+                setAccessToken(null);
+                setUser(null);
+                navigate("/");
+            })
+            .catch(err => {
+                console.warn("Logout failed:", err);
+                throw err;
+            });
+    };
+
+
+    const refreshAccessToken = async () => {
+        setLoading(true);
+
+        return refreshAccessTokenApi()
+            .then(data => {
+                setAccessToken(data.accessToken);
+                setUser(data.user);
+            })
+            .catch(error => {
+                setAccessToken(null);
+                setUser(null);
+                console.log("Refresh token failed: ", error);
+                throw error;
+            })
+            .finally(() => {
+                setLoading(false);
+                setAuthChecked(true);
+            })
+    };
+
+    useEffect(() => {
+        refreshAccessToken();
+    }, []);
+
+    return (
+        <AuthContext.Provider
+            value={{
+                user,
+                setUser,
+                accessToken,
+                setAccessToken,
+                authChecked,
+                setAuthChecked,
+                register,
+                login,
+                logout,
+                refreshAccessToken,
+                loading,
+            }}
+        >
+            {children}
+        </AuthContext.Provider>
+    );
+};
+
+// Custom hook for ease of use
+export const useAuthContext = () => {
+    const context = React.useContext(AuthContext);
+    if (!context) {
+        throw new Error("useGlobalContext must be used within a GlobalProvider");
+    }
+    return context;
+};
Index: ontend/src/context/GlobalContext.tsx
===================================================================
--- frontend/src/context/GlobalContext.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ 	(revision )
@@ -1,133 +1,0 @@
-import React, {
-    createContext,
-    useState,
-    useEffect,
-    type ReactNode,
-    type Dispatch,
-    type SetStateAction,
-} from "react";
-import type {User} from "../types/User.tsx";
-import type {UserRegister} from "../types/UserRegister.tsx";
-import {loginApi, logoutApi, refreshAccessTokenApi, registerApi} from "../api/auth.ts";
-import {useNavigate} from "react-router-dom";
-
-interface GlobalContextType {
-    user: User | null;
-    setUser: Dispatch<SetStateAction<User | null>>;
-    accessToken: string | null;
-    setAccessToken: Dispatch<SetStateAction<string | null>>;
-    authChecked: boolean;
-    setAuthChecked: Dispatch<SetStateAction<boolean>>;
-    register: (user: UserRegister) => Promise<void>;
-    login: (email: string, password: string) => Promise<void>;
-    logout: () => void;
-    refreshAccessToken: () => Promise<void>;
-    loading: boolean;
-}
-
-export const GlobalContext = createContext<GlobalContextType | undefined>(
-    undefined
-);
-
-export const GlobalProvider = ({children}: { children: ReactNode }) => {
-    const [user, setUser] = useState<User | null>(null);
-    const [accessToken, setAccessToken] = useState<string | null>(null);
-    const [authChecked, setAuthChecked] = useState<boolean>(false);
-    const [loading, setLoading] = useState(true);
-    const navigate = useNavigate();
-
-    const register = async (user: UserRegister) => {
-        return registerApi(user)
-            .then(data => {
-                setAccessToken(data.accessToken);
-                setUser(data.user);
-            })
-            .catch(error => {
-                setAccessToken(null);
-                setUser(null);
-                console.log("Registration failed:", error);
-                throw error;
-            });
-    }
-
-    const login = async (email: string, password: string) => {
-        return loginApi(email, password)
-            .then(data => {
-                setAccessToken(data.accessToken);
-                setUser(data.user);
-            })
-            .catch(error => {
-                    setAccessToken(null);
-                    setUser(null);
-                    console.log("Login failed:", error);
-                    throw error;
-            });
-    };
-
-    const logout = async () => {
-        return logoutApi()
-            .then(() => {
-                setAccessToken(null);
-                setUser(null);
-                navigate("/");
-            })
-            .catch(err => {
-                console.warn("Logout failed:", err);
-                throw err;
-            });
-    };
-
-
-    const refreshAccessToken = async () => {
-        setLoading(true);
-
-        return refreshAccessTokenApi()
-            .then(data => {
-                setAccessToken(data.accessToken);
-                setUser(data.user);
-                setAuthChecked(true);
-            })
-            .catch(error => {
-                setAccessToken(null);
-                setUser(null);
-                console.log("Refresh token failed: ", error);
-                throw error;
-            })
-            .finally(() => {
-                setLoading(false);
-            })
-    };
-
-    useEffect(() => {
-        refreshAccessToken();
-    }, []);
-
-    return (
-        <GlobalContext.Provider
-            value={{
-                user,
-                setUser,
-                accessToken,
-                setAccessToken,
-                authChecked,
-                setAuthChecked,
-                register,
-                login,
-                logout,
-                refreshAccessToken,
-                loading,
-            }}
-        >
-            {children}
-        </GlobalContext.Provider>
-    );
-};
-
-// Custom hook for ease of use
-export const useGlobalContext = () => {
-    const context = React.useContext(GlobalContext);
-    if (!context) {
-        throw new Error("useGlobalContext must be used within a GlobalProvider");
-    }
-    return context;
-};
Index: frontend/src/global.css
===================================================================
--- frontend/src/global.css	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/global.css	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -137,35 +137,39 @@
 
 
-/* Hide scrollbar - works on most browsers */
-.scrollable {
-    scrollbar-width: none; /* Firefox */
-    -ms-overflow-style: none;  /* IE and Edge */
-}
-
-.scrollable::-webkit-scrollbar {
-    display: none; /* Chrome, Safari, Opera */
-}
-
-/* Show scrollbar on hover */
-.scrollable:hover {
+
+.scrollable-show {
     scrollbar-width: thin;
+    scrollbar-color: rgba(100, 100, 100, 0.5) transparent;
     -ms-overflow-style: auto;
-    scrollbar-color: rgba(0,0,0,0.4) transparent;
-}
-
-.scrollable:hover::-webkit-scrollbar {
+}
+.scrollable-show::-webkit-scrollbar {
     display: block;
     width: 6px;
 }
-
+.scrollable-show::-webkit-scrollbar-thumb {
+    background-color: rgba(0,0,0,0.4);
+    border-radius: 4px;
+}
+.scrollable-show::-webkit-scrollbar-track {
+    background: transparent;
+}
+
+.scrollable {
+    scrollbar-width: thin;
+    scrollbar-color: transparent transparent;
+}
+.scrollable::-webkit-scrollbar {
+    background: transparent;
+}
+.scrollable::-webkit-scrollbar-thumb {
+    background-color: transparent;
+}
+.scrollable:hover {
+    scrollbar-color: rgba(0, 0, 0, 0.4) transparent;
+}
 .scrollable:hover::-webkit-scrollbar-thumb {
     background-color: rgba(0,0,0,0.4);
     border-radius: 4px;
 }
-
-.scrollable:hover::-webkit-scrollbar-track {
-    background: transparent;
-}
-
 
 
@@ -184,5 +188,5 @@
 /* HTML: <div class="loader"></div> */
 .loader {
-    margin-left: 20px;
+    /*margin-left: 20px;*/
     /*width: 40px;*/
     aspect-ratio: 1;
Index: frontend/src/layout/Footer.tsx
===================================================================
--- frontend/src/layout/Footer.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/layout/Footer.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,10 +1,10 @@
 import ShifterLogo from "../../public/Shifter-S2W-White-Transparent.png";
 import {Link} from "react-router-dom";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 import LinkedIn from "../assets/icons/LinkedIn.tsx";
 import Instagram from "../assets/icons/Instagram.tsx";
 
 function Footer() {
-    const {user, logout} = useGlobalContext();
+    const {user, logout} = useAuthContext();
 
     return (
Index: frontend/src/layout/Navbar.tsx
===================================================================
--- frontend/src/layout/Navbar.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/layout/Navbar.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,8 +1,9 @@
 import {Link} from "react-router-dom";
 import logo from "../../public/Shifter-S2W-White-Transparent.png"
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
+import NavbarLink from "../components/NavbarLink.tsx";
 
 function Navbar() {
-    const {user} = useGlobalContext();
+    const {user} = useAuthContext();
 
     return (
@@ -14,7 +15,7 @@
             <div className="flex w-36/100 justify-between text-lg items-center">
                 {/* Link group */}
-                <LinkGroup to="/courses" label="Courses"/>
-                <LinkGroup to="/mentoring" label="Mentoring"/>
-                <LinkGroup to="/academies" label="Academies"/>
+                <NavbarLink to="/courses" label="Courses"/>
+                <NavbarLink to="/mentoring" label="Mentoring"/>
+                <NavbarLink to="/academies" label="Academies"/>
             </div>
 
@@ -28,8 +29,8 @@
             {/* Right nav links + profile */}
             <div className="flex w-36/100 justify-between text-lg items-center gap-6">
-                <LinkGroup to="/about" label="About"/>
+                <NavbarLink to="/about" label="About"/>
                 {user ? (
                     <>
-                        <LinkGroup to="/dashboard" label="Dashboard"/>
+                        <NavbarLink to="/dashboard" label="Dashboard"/>
                         <div className="flex gap-4 items-center">
                             <Link
@@ -62,13 +63,4 @@
 }
 
-const LinkGroup = ({to, label}: { to: string; label: string }) => (
-    <div className="flex flex-col gap-0 overflow-clip p-1 group">
-        <Link to={to} className="transition-all duration-300 ease-in-out z-10">
-            {label}
-        </Link>
-        <hr className="relative -left-30 group-hover:-left-6 border-t-2 rounded-full transition-all duration-300 ease-in-out"/>
-    </div>
-);
-
 
 export default Navbar
Index: frontend/src/main.tsx
===================================================================
--- frontend/src/main.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/main.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -3,5 +3,5 @@
 import './global.css'
 import App from './App.tsx'
-import {GlobalProvider} from "./context/GlobalContext.tsx";
+import {AuthProvider} from "./context/AuthContext.tsx";
 import {BrowserRouter} from "react-router-dom";
 
@@ -9,7 +9,7 @@
   <StrictMode>
       <BrowserRouter>
-          <GlobalProvider>
+          <AuthProvider>
               <App />
-          </GlobalProvider>
+          </AuthProvider>
       </BrowserRouter>
   </StrictMode>,
Index: frontend/src/pages/CourseDetails.tsx
===================================================================
--- frontend/src/pages/CourseDetails.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/pages/CourseDetails.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -7,5 +7,5 @@
 import type {CourseDetail} from "../types/CourseDetail.tsx";
 import {enrollUserApi} from "../api/enrollmentApi.ts";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 import {showInfoToast} from "../utils/showInfoToast.ts";
 import {useCourseStorage} from "../context/CourseStorage.ts";
@@ -14,5 +14,5 @@
 
 function CourseDetails() {
-    const { user, accessToken, loading: authLoading } = useGlobalContext();
+    const { user, accessToken, loading: authLoading } = useAuthContext();
     const { enrollments, setEnrollments } = useCourseStorage();
     const [loading, setLoading] = useState<boolean>(true);
Index: frontend/src/pages/Courses.tsx
===================================================================
--- frontend/src/pages/Courses.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/pages/Courses.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -7,5 +7,5 @@
 import {useCourseStorage} from "../context/CourseStorage.ts";
 import type {CoursePreview} from "../types/CoursePreview.tsx";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 import {useLocation, useNavigate} from "react-router-dom";
 import CoursesFiltersSkeleton from "../components/skeletons/CoursesFiltersSkeleton.tsx";
@@ -40,5 +40,5 @@
     const navigate = useNavigate();
     const location = useLocation();
-    const {accessToken, user, loading: authLoading} = useGlobalContext();
+    const {accessToken, user, loading: authLoading} = useAuthContext();
     const {allCourses, setAllCourses} = useCourseStorage();
 
Index: frontend/src/pages/FreeConsultation.tsx
===================================================================
--- frontend/src/pages/FreeConsultation.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/pages/FreeConsultation.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,6 +1,6 @@
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 
 function FreeConsultation() {
-    const {user} = useGlobalContext();
+    const {user} = useAuthContext();
 
     return (
Index: frontend/src/pages/Login.tsx
===================================================================
--- frontend/src/pages/Login.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/pages/Login.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -4,5 +4,5 @@
 import { Eye, EyeOff } from "lucide-react";
 import { Link, useNavigate } from "react-router-dom";
-import { useGlobalContext } from "../context/GlobalContext.tsx";
+import { useAuthContext } from "../context/AuthContext.tsx";
 
 interface InputProps {
@@ -17,5 +17,5 @@
 
 function Login() {
-    const { login } = useGlobalContext();
+    const { login } = useAuthContext();
     const [email, setEmail] = React.useState<string>("");
     const [password, setPassword] = React.useState<string>("");
Index: frontend/src/pages/Profile.tsx
===================================================================
--- frontend/src/pages/Profile.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/pages/Profile.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,5 +1,5 @@
 import ProfileInfo from "../components/ProfileInfo.tsx";
 import ProfileSkillsInterests from "../components/ProfileSkills&Interests.tsx";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 import ProfileMyProfile from "../components/ProfileMyProfile.tsx";
 import ProfileSkeleton from "../components/skeletons/ProfileSkeleton.tsx";
@@ -8,5 +8,5 @@
 
 function Profile() {
-    const {user, loading} = useGlobalContext();
+    const {user, loading, logout} = useAuthContext();
     const [showModalDesiredSkills, setShowModalDesiredSkills] = React.useState(false);
     const [showModalInterests, setShowModalInterests] = React.useState(false);
@@ -24,4 +24,11 @@
                 <ProfileSkillsInterests title="Desired Skills" pills={user?.desiredSkills || []} openModal={() => setShowModalDesiredSkills(true)}/>
                 <ProfileSkillsInterests title="Interests" pills={user?.interests || []} openModal={() => setShowModalInterests(true)}/>
+                <button
+                    onClick={logout}
+                    className="hover:border-white/40 hover:bg-red hover:text-white hover:shadow-lg hover:shadow-red/50 transition-all duration-200 ease-in-out cursor-pointer
+                    py-2 rounded-sm border-2 border-red/40 text-red/80 font-semibold"
+                >
+                    Log Out
+                </button>
             </div>
 
Index: frontend/src/pages/Register.tsx
===================================================================
--- frontend/src/pages/Register.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/pages/Register.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,3 +1,3 @@
-import React, {useEffect} from "react";
+import React from "react";
 import ShifterLogo from "../../public/Shifter-S2W-Transparent.png";
 import ShifterArrow from "../../public/Shifter-Arrow-White.png";
@@ -16,10 +16,10 @@
 import RegisterStepThree from "../components/registerSteps/RegisterStepThree.tsx";
 import RegisterStepFour from "../components/registerSteps/RegisterStepFour.tsx";
-import {useGlobalContext} from "../context/GlobalContext.tsx";
+import {useAuthContext} from "../context/AuthContext.tsx";
 import {isValidEmail} from "../utils/validation.ts";
 import {checkEmailExistsApi} from "../api/auth.ts";
 
 function Register() {
-    const {register} = useGlobalContext();
+    const {register} = useAuthContext();
     const [isLoading, setIsLoading] = React.useState<boolean>(false);
     const [isCheckingEmail, setIsCheckingEmail] = React.useState<boolean>(false);
@@ -40,8 +40,4 @@
     const navigate = useNavigate();
 
-    useEffect(() => {
-        console.log(user)
-    }, [user]);
-
     const handleNext = async () => {
         if (error.length > 0) {
@@ -58,24 +54,23 @@
 
             setIsCheckingEmail(true);
-            await checkEmailExistsApi(user.email)
-                .then(exists => {
-                    if (exists) {
-                        setError("Email already exists");
-                        setShowError(true);
-                        return;
-                    }
-                })
-                .catch(err => {
-                    setError("Error checking email. Theres a problem with the server.");
+            try {
+                const exists = await checkEmailExistsApi(user.email);
+                if (exists) {
+                    setError("Email already exists");
                     setShowError(true);
-                    console.error("Error checking email: ", err);
+                    setIsCheckingEmail(false);
                     return;
-                })
-                .finally(() => {
-                    setIsCheckingEmail(false);
-                });
-        }
-
-        // IF THE FUNCTION REACHES HERE, IT MEANS THAT THERE ARE NO ERRORS
+                }
+            } catch (err) {
+                setError("Error checking email. There's a problem with the server.");
+                setShowError(true);
+                setIsCheckingEmail(false);
+                console.error("Error checking email: ", err);
+                return;
+            }
+            setIsCheckingEmail(false);
+        }
+
+        // If we get here, no errors => proceed to next step
         setError("");
         setShowError(false);
@@ -83,4 +78,6 @@
         setActiveStep((prev) => prev + 1);
     };
+
+
     const handleBack = () => {
         setDirection(-1);
@@ -115,5 +112,5 @@
         } catch (err) {
             setError("Registration failed. Please try again.");
-            console.log("Registration error: ", err);
+            console.error("Registration error: ", err);
         } finally {
             setIsLoading(false);
Index: frontend/src/types/ContentType.tsx
===================================================================
--- frontend/src/types/ContentType.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
+++ frontend/src/types/ContentType.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -0,0 +1,1 @@
+export type ContentType = "VIDEO" | "TEXT" | "FILE" | "QUIZ" | "TOOL";
Index: frontend/src/types/CourseLecturePreview.tsx
===================================================================
--- frontend/src/types/CourseLecturePreview.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/types/CourseLecturePreview.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,2 +1,3 @@
+import type {ContentType} from "./ContentType.tsx";
 
 export interface CourseLecturePreview {
@@ -5,4 +6,4 @@
     durationMinutes: number;
     position: number;
-    contentType: "VIDEO" | "TEXT" | "FILE" | "QUIZ";
+    contentType: ContentType;
 }
Index: frontend/src/types/User.tsx
===================================================================
--- frontend/src/types/User.tsx	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/types/User.tsx	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -10,3 +10,4 @@
     points: number;
     favoriteCourses: number[];
+    isAdmin: boolean;
 }
Index: frontend/src/utils/toEnumFormat.ts
===================================================================
--- frontend/src/utils/toEnumFormat.ts	(revision af4cd1f4c1fd5370da9c889d92ef91382f245b92)
+++ frontend/src/utils/toEnumFormat.ts	(revision 00bf631b9e4b4b620af6d3d50ac94906a41e4ce0)
@@ -1,3 +1,2 @@
-
 export function toEnumFormat(str: string): string {
     return str.trim().replace(/\s+/g, '_').toUpperCase();
