| | 12 | Course course = buildCourse(courseDtoFull, language); |
| | 13 | |
| | 14 | CourseVersion oldCourseVersion = courseVersionRepository |
| | 15 | .findByActiveTrueAndCourse_Id(course.getId()); |
| | 16 | |
| | 17 | int newVersionNumber = 1; |
| | 18 | if (oldCourseVersion != null) { |
| | 19 | newVersionNumber = oldCourseVersion.getVersionNumber() + 1; |
| | 20 | oldCourseVersion.setActive(false); |
| | 21 | courseVersionRepository.save(oldCourseVersion); |
| | 22 | } |
| | 23 | |
| | 24 | CourseVersion courseVersion = CourseVersion.builder() |
| | 25 | .versionNumber(newVersionNumber) |
| | 26 | .active(true) |
| | 27 | .creationDate(java.time.LocalDate.now()) |
| | 28 | .course(course) |
| | 29 | .build(); |
| | 30 | |
| | 31 | List<CourseContent> contentList = courseDtoFull.getCourseContents().stream() |
| | 32 | .map(content -> courseContentService.buildCourseContent(content, courseVersion, language)) |
| | 33 | .toList(); |
| | 34 | |
| | 35 | courseVersion.setCourseContents(contentList); |
| | 36 | |
| | 37 | List<Tag> skillTags = tagService.processRawTags( |
| | 38 | courseDtoFull.getSkillsGained(), TagType.SKILL, language |
| | 39 | ); |
| | 40 | List<Tag> topicTags = tagService.processRawTags( |
| | 41 | courseDtoFull.getTopicsCovered(), TagType.TOPIC, language |
| | 42 | ); |
| | 43 | |
| | 44 | List<Tag> tagList = new ArrayList<>(skillTags); |
| | 45 | tagList.addAll(topicTags); |
| | 46 | |
| | 47 | course.setTags(tagList); |
| | 48 | |
| | 49 | return courseVersionRepository.save(courseVersion); |
| | 50 | } |
| | 51 | |
| | 52 | private Course buildCourse(CourseDtoFull courseDtoFull, Language language) { |
| | 53 | |
| | 54 | int durationMinutes = courseDtoFull.getCourseContents().stream() |
| | 55 | .flatMap(content -> content.getCourseLectures().stream()) |
| | 56 | .mapToInt(CourseLectureDtoFull::getDurationMinutes) |
| | 57 | .sum(); |
| | 58 | |
| | 59 | Course course = Course.builder() |
| | 60 | .imageUrl(courseDtoFull.getImageUrl()) |
| | 61 | .color(courseDtoFull.getColor()) |
| | 62 | .difficulty(courseDtoFull.getDifficulty()) |
| | 63 | .durationMinutes(durationMinutes) |
| | 64 | .price(courseDtoFull.getPrice()) |
| | 65 | .build(); |
| | 66 | |
| | 67 | CourseTranslate courseTranslate = CourseTranslate.builder() |
| | 68 | .language(language) |
| | 69 | .titleShort(courseDtoFull.getTitleShort()) |
| | 70 | .title(courseDtoFull.getTitle()) |
| | 71 | .descriptionShort(courseDtoFull.getDescriptionShort()) |
| | 72 | .description(courseDtoFull.getDescription()) |
| | 73 | .descriptionLong(courseDtoFull.getDescriptionLong()) |
| | 74 | .whatWillBeLearned(courseDtoFull.getWhatWillBeLearned()) |
| | 75 | .course(course) |
| | 76 | .build(); |
| | 77 | |
| | 78 | course.setTranslations(List.of(courseTranslate)); |
| | 79 | return course; |
| | 80 | } |
| | 81 | }}} |
| | 82 | |
| | 83 | |
| | 84 | === Преведување на постоечки курс === |
| | 85 | {{{ |
| | 86 | @Transactional |
| | 87 | @Override |
| | 88 | public Course translateCourse(CourseTranslateReq courseTranslateReq) { |
| | 89 | validate.validateCourseExists(courseTranslateReq.getId()); |
| | 90 | validate.validateCourseTranslation(courseTranslateReq.getId(), courseTranslateReq.getLanguage()); |
| | 91 | |
| | 92 | CourseVersion courseVersion = courseVersionRepository.findByActiveTrueAndCourse_Id(courseTranslateReq.getId()); |
| | 93 | Course course = courseRepository.findById(courseTranslateReq.getId()).orElseThrow(); |
| | 94 | addCourseTranslation(course, courseTranslateReq); |
| | 95 | translateContents(courseVersion, courseTranslateReq.getCourseContents(), courseTranslateReq.getLanguage()); |
| | 96 | |
| | 97 | tagService.processExistingTags( |
| | 98 | courseTranslateReq.getSkillsGained(), TagType.SKILL, courseTranslateReq.getLanguage() |
| | 99 | ); |
| | 100 | tagService.processExistingTags( |
| | 101 | courseTranslateReq.getTopicsCovered(), TagType.TOPIC, courseTranslateReq.getLanguage() |
| | 102 | ); |
| | 103 | |
| | 104 | return courseRepository.save(course); |
| | 105 | } |
| | 106 | |
| | 107 | private void addCourseTranslation(Course course, CourseTranslateReq dto) { |
| | 108 | CourseTranslate translation = CourseTranslate.builder() |
| | 109 | .language(dto.getLanguage()) |
| | 110 | .titleShort(dto.getTitleShort()) |
| | 111 | .title(dto.getTitle()) |
| | 112 | .descriptionShort(dto.getDescriptionShort()) |
| | 113 | .description(dto.getDescription()) |
| | 114 | .descriptionLong(dto.getDescriptionLong()) |
| | 115 | .whatWillBeLearned(dto.getWhatWillBeLearned()) |
| | 116 | .course(course) |
| | 117 | .build(); |
| | 118 | |
| | 119 | course.getTranslations().add(translation); |
| | 120 | } |
| | 121 | |
| | 122 | private void translateContents(CourseVersion courseVersion, List<CourseContentTranslateReq> contentDtos, Language language) { |
| | 123 | for (CourseContent content : courseVersion.getCourseContents()) { |
| | 124 | CourseContentTranslateReq contentDto = contentDtos.stream() |
| | 125 | .filter(ct -> ct.getId().equals(content.getId())) |
| | 126 | .findFirst() |
| | 127 | .orElseThrow(() -> new RuntimeException( |
| | 128 | "Missing translation DTO for CourseContent id=" + content.getId() |
| | 129 | )); |
| | 130 | |
| | 131 | addContentTranslation(content, contentDto, language); |
| | 132 | } |
| | 133 | } |
| | 134 | |
| | 135 | private void addContentTranslation(CourseContent content, CourseContentTranslateReq contentDto, Language language) { |
| | 136 | CourseContentTranslate contentTranslate = CourseContentTranslate.builder() |
| | 137 | .title(contentDto.getTitle()) |
| | 138 | .language(language) |
| | 139 | .courseContent(content) |
| | 140 | .build(); |
| | 141 | |
| | 142 | content.getTranslations().add(contentTranslate); |
| | 143 | translateLectures(content, contentDto.getCourseLectures(), language); |
| | 144 | } |
| | 145 | |
| | 146 | private void translateLectures(CourseContent content, List<CourseLectureTranslateReq> lectureDtos, Language language) { |
| | 147 | for (CourseLecture lecture : content.getCourseLectures()) { |
| | 148 | CourseLectureTranslateReq lectureDto = lectureDtos.stream() |
| | 149 | .filter(ld -> ld.getId().equals(lecture.getId())) |
| | 150 | .findFirst() |
| | 151 | .orElseThrow(() -> new RuntimeException( |
| | 152 | "Missing translation DTO for CourseLecture id=" + lecture.getId() |
| | 153 | )); |
| | 154 | |
| | 155 | CourseLectureTranslate lectureTranslate = CourseLectureTranslate.builder() |
| | 156 | .language(language) |
| | 157 | .title(lectureDto.getTitle()) |
| | 158 | .description(lectureDto.getDescription()) |
| | 159 | .contentText(lectureDto.getContentText()) |
| | 160 | .courseLecture(lecture) |
| | 161 | .build(); |
| | 162 | |
| | 163 | lecture.getTranslations().add(lectureTranslate); |
| | 164 | } |
| | 165 | } |
| | 166 | }}} |