Professor update

This commit is contained in:
2026-05-04 14:33:19 +05:30
parent 08d3a8b9f4
commit 3e96bd4fb8
3 changed files with 28 additions and 19 deletions

View File

@ -6,17 +6,12 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import net.shyshkin.study.fullstack.supportportal.backend.domain.WorkingStatus; import net.shyshkin.study.fullstack.supportportal.backend.domain.WorkingStatus;
import net.shyshkin.study.fullstack.supportportal.backend.domain.ProfessorCategory; import net.shyshkin.study.fullstack.supportportal.backend.domain.ProfessorCategory;
import net.shyshkin.study.fullstack.supportportal.backend.domain.dto.SkillDto;
import net.shyshkin.study.fullstack.supportportal.backend.domain.dto.AwardDto;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.time.ZonedDateTime;
import java.util.List; import java.util.List;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@ -34,11 +29,12 @@ public class ProfessorDto {
private WorkingStatus status; private WorkingStatus status;
private ProfessorCategory category; private ProfessorCategory category;
private ZonedDateTime joinDate; // Received as ISO string from multipart form e.g. "2026-04-22T23:17:58.831Z"
private String joinDate;
private MultipartFile profileImage; private MultipartFile profileImage;
// Additional fields for Next.js integration // Additional fields
private String phone; private String phone;
private String specialty; private String specialty;
private String certification; private String certification;

View File

@ -15,7 +15,7 @@ public interface ProfessorMapper {
Professor toEntity(ProfessorDto professorDto); Professor toEntity(ProfessorDto professorDto);
@Mapping(target = "profileImage", ignore = true) @Mapping(target = "profileImage", ignore = true)
@Mapping(target = "joinDate", expression = "java(professor.getJoinDate() != null ? professor.getJoinDate().atZone(java.time.ZoneOffset.UTC) : null)") @Mapping(target = "joinDate", expression = "java(professor.getJoinDate() != null ? professor.getJoinDate().toString() + 'Z' : null)")
@Mapping(target = "status", source = "status", qualifiedByName = "workingStatusToString") @Mapping(target = "status", source = "status", qualifiedByName = "workingStatusToString")
ProfessorDto toDto(Professor professor); ProfessorDto toDto(Professor professor);

View File

@ -28,9 +28,10 @@ import javax.annotation.PostConstruct;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -62,6 +63,23 @@ public class ProfessorServiceImpl implements ProfessorService {
.build(); .build();
} }
/**
* Parses ISO date string from frontend (e.g. "2026-04-22T23:17:58.831Z")
* into LocalDateTime. Falls back to now() if null/blank/invalid.
*/
private LocalDateTime parseJoinDate(String joinDate) {
if (joinDate == null || joinDate.isBlank()) {
return LocalDateTime.now();
}
try {
return ZonedDateTime.parse(joinDate, DateTimeFormatter.ISO_DATE_TIME)
.toLocalDateTime();
} catch (Exception e) {
log.warn("Could not parse joinDate '{}', defaulting to now()", joinDate);
return LocalDateTime.now();
}
}
@Override @Override
@Transactional @Transactional
public Professor register(String firstName, String lastName, String email, String department, String position) { public Professor register(String firstName, String lastName, String email, String department, String position) {
@ -72,7 +90,6 @@ public class ProfessorServiceImpl implements ProfessorService {
.department(department) .department(department)
.position(position) .position(position)
.build(); .build();
return addNewProfessor(professorDto); return addNewProfessor(professorDto);
} }
@ -159,11 +176,7 @@ public class ProfessorServiceImpl implements ProfessorService {
Professor professor = professorMapper.toEntity(professorDto); Professor professor = professorMapper.toEntity(professorDto);
professor.setProfessorId(generateUuid()); professor.setProfessorId(generateUuid());
professor.setJoinDate( professor.setJoinDate(parseJoinDate(professorDto.getJoinDate()));
professorDto.getJoinDate() != null
? professorDto.getJoinDate().toLocalDateTime()
: LocalDateTime.now()
);
professor.setProfileImageUrl(generateDefaultProfileImageUrl(professor.getProfessorId())); professor.setProfileImageUrl(generateDefaultProfileImageUrl(professor.getProfessorId()));
Professor savedProfessor = professorRepository.save(professor); Professor savedProfessor = professorRepository.save(professor);
@ -217,7 +230,6 @@ public class ProfessorServiceImpl implements ProfessorService {
professor.setOfficeLocation(professorDto.getOfficeLocation()); professor.setOfficeLocation(professorDto.getOfficeLocation());
professor.setStatus(professorDto.getStatus()); professor.setStatus(professorDto.getStatus());
professor.setCategory(professorDto.getCategory()); professor.setCategory(professorDto.getCategory());
professor.setPhone(professorDto.getPhone()); professor.setPhone(professorDto.getPhone());
professor.setSpecialty(professorDto.getSpecialty()); professor.setSpecialty(professorDto.getSpecialty());
professor.setCertification(professorDto.getCertification()); professor.setCertification(professorDto.getCertification());
@ -227,8 +239,9 @@ public class ProfessorServiceImpl implements ProfessorService {
professor.setDesignation(professorDto.getDesignation()); professor.setDesignation(professorDto.getDesignation());
professor.setWorkDays(professorDto.getWorkDays()); professor.setWorkDays(professorDto.getWorkDays());
if (professorDto.getJoinDate() != null) { // Parse joinDate string safely
professor.setJoinDate(professorDto.getJoinDate().toLocalDateTime()); if (professorDto.getJoinDate() != null && !professorDto.getJoinDate().isBlank()) {
professor.setJoinDate(parseJoinDate(professorDto.getJoinDate()));
} }
final Professor professorRef = professor; final Professor professorRef = professor;