Skip to content
Snippets Groups Projects
Commit 138f1e85 authored by Dominika Zemanovičová's avatar Dominika Zemanovičová
Browse files

Merge branch 'M2-fix-certificate' into 'main'

Implementing certificateFile + filename functionality

See merge request !39
parents 68b1fefc 8b60b1a6
No related branches found
No related tags found
1 merge request!39Implementing certificateFile + filename functionality
Pipeline #
Showing
with 118 additions and 52 deletions
package org.fuseri.model.dto.certificate;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
import org.fuseri.model.dto.common.DomainObjectDto;
import java.time.Instant;
/**
* This class represents a Data Transfer Object (DTO) for Certificate entities.
* It is used to transfer Certificate data between different layers of the application.
* It extends the DomainObjectDto class and includes additional Certificate-specific fields.
*/
@Getter
@Setter
public class CertificateGenerateDto extends DomainObjectDto {
@NotBlank
@NotNull
private Long userId;
@NotBlank
@NotNull
private Instant generatedAt;
@NotBlank
@NotNull
private Long courseId;
@NotBlank
@NotNull
private String certificateFile;
@NotBlank
@NotNull
private String certificateFileName;
public CertificateGenerateDto(Long id, Long userId, Instant generatedAt, Long courseId, String certificateFile, String certificateFileName) {
this.setId(id);
this.userId = userId;
this.generatedAt = generatedAt;
this.courseId = courseId;
this.certificateFile = certificateFile;
this.certificateFileName = certificateFileName;
}
}
......@@ -27,17 +27,13 @@ public class CertificateSimpleDto extends DomainObjectDto {
private Long courseId;
@NotBlank
@NotNull
private String certificateFile;
@NotBlank
@NotNull
private String certificateFileName;
public CertificateSimpleDto(Long id, Long userId, Instant generatedAt, Long courseId, String certificateFile, String certificateFileName) {
public CertificateSimpleDto(Long id, Long userId, Instant generatedAt, Long courseId, String certificateFileName) {
this.setId(id);
this.userId = userId;
this.generatedAt = generatedAt;
this.courseId = courseId;
this.certificateFile = certificateFile;
this.certificateFileName = certificateFileName;
}
}
......@@ -21,19 +21,16 @@ public class Certificate implements Serializable {
private Instant generatedAt;
@Column(name = "id_course")
private Long courseId;
@Column(name = "certificate_file")
private String certificateFile;
@Column(name = "certificate_file_name")
private String certificateFileName;
public Certificate() {
}
public Certificate(Long userId, Instant generatedAt, Long courseId, String certificateFile, String certificateFileName) {
public Certificate(Long userId, Instant generatedAt, Long courseId, String certificateFileName) {
this.userId = userId;
this.generatedAt = generatedAt;
this.courseId = courseId;
this.certificateFile = certificateFile;
this.certificateFileName = certificateFileName;
}
......@@ -65,13 +62,6 @@ public class Certificate implements Serializable {
this.courseId = courseId;
}
public String getCertificateFile() {
return certificateFile;
}
public void setCertificateFile(String certificateFile) {
this.certificateFile = certificateFile;
}
public String getCertificateFileName() {
return certificateFileName;
......@@ -92,13 +82,12 @@ public class Certificate implements Serializable {
return Objects.equals(getUserId(), certificate.getUserId())
&& Objects.equals(getGeneratedAt(), certificate.getGeneratedAt())
&& Objects.equals(getCourseId(), certificate.getCourseId())
&& Objects.equals(getCertificateFile(), certificate.getCertificateFile())
&& Objects.equals(getCertificateFileName(), certificate.getCertificateFileName());
}
@Override
public int hashCode() {
return Objects.hash(getUserId(), getGeneratedAt(), getCourseId(), getCertificateFile(), getCertificateFileName());
return Objects.hash(getUserId(), getGeneratedAt(), getCourseId(), getCertificateFileName());
}
}
......@@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import org.fuseri.model.dto.certificate.CertificateCreateDto;
import org.fuseri.model.dto.certificate.CertificateGenerateDto;
import org.fuseri.model.dto.certificate.CertificateSimpleDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
......@@ -46,9 +47,9 @@ public class CertificateController {
@ApiResponse(responseCode = "500", description = "Internal server error.")
})
@PostMapping
public ResponseEntity<CertificateSimpleDto> generate(@Valid @RequestBody CertificateCreateDto certificateCreateDto) {
var certificateSimpleDto = certificateFacade.generate(certificateCreateDto);
return ResponseEntity.status(HttpStatus.CREATED).body(certificateSimpleDto);
public ResponseEntity<CertificateGenerateDto> generate(@Valid @RequestBody CertificateCreateDto certificateCreateDto) {
var certificateGenerateDto = certificateFacade.generate(certificateCreateDto);
return ResponseEntity.status(HttpStatus.CREATED).body(certificateGenerateDto);
}
/**
......
......@@ -2,6 +2,7 @@ package org.fuseri.modulecertificate.certificate;
import org.fuseri.model.dto.certificate.CertificateCreateDto;
import org.fuseri.model.dto.certificate.CertificateGenerateDto;
import org.fuseri.model.dto.certificate.CertificateSimpleDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
......@@ -10,6 +11,7 @@ import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.Instant;
import java.util.List;
@Service
......@@ -32,8 +34,12 @@ public class CertificateFacade {
}
@Transactional()
public CertificateSimpleDto generate(CertificateCreateDto certificateCreateDto) {
return certificateMapper.mapToSimpleDto(certificateService.save(certificateMapper.mapToCertificate(certificateCreateDto)));
public CertificateGenerateDto generate(CertificateCreateDto certificateCreateDto) {
var certificate = certificateMapper.mapToCertificate(certificateCreateDto,
Instant.now(), certificateService.generateCertificateFileName(certificateCreateDto));
var saved = certificateService.save(certificate);
return certificateMapper.mapToCertificateGenerateDto(saved, certificateService.generateCertificateFile());
}
@Cacheable(cacheNames = "certificates", key = "#userId")
......
package org.fuseri.modulecertificate.certificate;
import org.fuseri.model.dto.certificate.CertificateCreateDto;
import org.fuseri.model.dto.certificate.CertificateGenerateDto;
import org.fuseri.model.dto.certificate.CertificateSimpleDto;
import org.mapstruct.Mapper;
import org.springframework.data.domain.Page;
......@@ -23,21 +24,36 @@ public interface CertificateMapper {
certificate.getUserId(),
certificate.getGeneratedAt(),
certificate.getCourseId(),
certificate.getCertificateFile(),
certificate.getCertificateFileName());
}
default Certificate mapToCertificate(CertificateCreateDto certificateCreateDto)
default CertificateGenerateDto mapToCertificateGenerateDto(Certificate certificate, String certificateFile)
{
if ( certificate == null ) {
return null;
}
return new CertificateGenerateDto(
certificate.getId(),
certificate.getUserId(),
certificate.getGeneratedAt(),
certificate.getCourseId(),
certificateFile,
certificate.getCertificateFileName());
}
default Certificate mapToCertificate(CertificateCreateDto certificateCreateDto,Instant generatedAt, String fileName)
{
if ( certificateCreateDto == null ) {
return null;
}
return new Certificate(certificateCreateDto.getUser().getId(),
Instant.now(),
generatedAt,
certificateCreateDto.getCourse().getId(),
null,
null);
fileName);
}
List<CertificateSimpleDto> mapToList(List<Certificate> certificates);
......
......@@ -25,11 +25,11 @@ public class DataInitializer {
public void initialize() {
drop();
Certificate c1 = new Certificate(7L, Instant.parse("2023-04-12T10:30:00Z"), 2L, "certificate_file_1.pdf", "Certificate for Course English A1");
Certificate c2 = new Certificate(7L, Instant.parse("2023-04-17T14:15:00Z"), 3L, "certificate_file_3.pdf", "Certificate for Course English A2");
Certificate c3 = new Certificate(9L, Instant.parse("2023-04-23T14:15:00Z"), 3L, "certificate_file_4.pdf", "Certificate for Course English A2");
Certificate c4 = new Certificate(7L, Instant.parse("2023-04-28T14:15:00Z"), 4L, "certificate_file_5.pdf", "Certificate for Course English B1");
Certificate c5 = new Certificate(9L, Instant.parse("2023-04-29T14:15:00Z"), 4L, "certificate_file_6.pdf", "Certificate for Course English B1");
Certificate c1 = new Certificate(7L, Instant.parse("2023-04-12T10:30:00Z"), 2L, "certificate_file_1.pdf");
Certificate c2 = new Certificate(7L, Instant.parse("2023-04-17T14:15:00Z"), 3L, "certificate_file_3.pdf");
Certificate c3 = new Certificate(9L, Instant.parse("2023-04-23T14:15:00Z"), 3L, "certificate_file_4.pdf");
Certificate c4 = new Certificate(7L, Instant.parse("2023-04-28T14:15:00Z"), 4L, "certificate_file_5.pdf");
Certificate c5 = new Certificate(9L, Instant.parse("2023-04-29T14:15:00Z"), 4L, "certificate_file_6.pdf");
certificateRepository.saveAll(List.of(c1, c2, c3, c4, c5));
}
......
......@@ -2,6 +2,7 @@ package org.fuseri.modulecertificate;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.fuseri.model.dto.certificate.CertificateCreateDto;
import org.fuseri.model.dto.certificate.CertificateGenerateDto;
import org.fuseri.model.dto.certificate.CertificateSimpleDto;
import org.fuseri.model.dto.course.CourseCertificateDto;
import org.fuseri.model.dto.course.LanguageTypeDto;
......@@ -43,6 +44,8 @@ class CertificateControllerTests {
LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1);
private final CertificateCreateDto certificateCreateDto = new CertificateCreateDto(USER, COURSE);
private final CertificateSimpleDto certificateDto = new CertificateSimpleDto(0L, USER.getId(),
Instant.now(), COURSE.getId(), "");
private final CertificateGenerateDto certificateGenerateDto = new CertificateGenerateDto(0L,USER.getId(),
Instant.now(), COURSE.getId(), "", "");
@Autowired
......@@ -62,7 +65,7 @@ class CertificateControllerTests {
@Test
void generateCertificate() throws Exception {
Mockito.when(certificateFacade.generate(ArgumentMatchers.any(CertificateCreateDto.class)))
.thenReturn(certificateDto);
.thenReturn(certificateGenerateDto);
mockMvc.perform(post("/certificates")
.content(asJsonString(certificateCreateDto))
......@@ -70,9 +73,8 @@ class CertificateControllerTests {
.andExpect(status().is2xxSuccessful())
.andExpect(jsonPath("$.id").value(certificateDto.getId()))
.andExpect(jsonPath("$.userId").value(certificateDto.getUserId()))
.andExpect(jsonPath("$.generatedAt").value(certificateDto.getGeneratedAt().toString()))
.andExpect(jsonPath("$.generatedAt").isNotEmpty())
.andExpect(jsonPath("$.courseId").value(certificateDto.getCourseId()))
.andExpect(jsonPath("$.certificateFile").value(certificateDto.getCertificateFile()))
.andExpect(jsonPath("$.certificateFileName").value(certificateDto.getCertificateFileName()));
}
......
package org.fuseri.modulecertificate;
import org.fuseri.model.dto.certificate.CertificateCreateDto;
import org.fuseri.model.dto.certificate.CertificateGenerateDto;
import org.fuseri.model.dto.certificate.CertificateSimpleDto;
import org.fuseri.model.dto.course.CourseCertificateDto;
import org.fuseri.model.dto.course.LanguageTypeDto;
......@@ -27,6 +28,8 @@ import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
......@@ -39,6 +42,8 @@ final class CertificateFacadeTests {
LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1);
private final CertificateCreateDto certificateCreateDto = new CertificateCreateDto(USER, COURSE);
private final CertificateSimpleDto certificateDto = new CertificateSimpleDto(0L, USER.getId(),
Instant.now(), COURSE.getId(), "");
private final CertificateGenerateDto certificateGenerateDto = new CertificateGenerateDto(0L,USER.getId(),
Instant.now(), COURSE.getId(), "", "");
private final Certificate certificate = new Certificate();
......@@ -55,13 +60,13 @@ final class CertificateFacadeTests {
@Test
void generateCertificate() {
when(certificateMapper.mapToCertificate(certificateCreateDto)).thenReturn(certificate);
when(certificateService.save(certificate)).thenReturn(certificate);
when(certificateMapper.mapToSimpleDto(certificate)).thenReturn(certificateDto);
when(certificateMapper.mapToCertificate(any(CertificateCreateDto.class), any(Instant.class), anyString())).thenReturn(certificate);
when(certificateService.save(any(Certificate.class))).thenReturn(certificate);
when(certificateMapper.mapToCertificateGenerateDto(any(), any())).thenReturn(certificateGenerateDto);
CertificateSimpleDto actualDto = certificateFacade.generate(certificateCreateDto);
var actualDto = certificateFacade.generate(certificateCreateDto);
assertEquals(certificateDto, actualDto);
assertEquals(certificateGenerateDto, actualDto);
}
@Test
......
......@@ -33,9 +33,9 @@ final class CertificateMapperTests {
private final String fileName = "fileName";
private final String file = "file";
private final CertificateSimpleDto certificateDto = new CertificateSimpleDto(0L, USER.getId(),
instant, COURSE.getId(), file, fileName);
instant, COURSE.getId(), fileName);
private final Certificate certificate = new Certificate(USER.getId(),
instant, COURSE.getId(), file, fileName);
instant, COURSE.getId(), fileName);
private final CertificateCreateDto certificateCreateDto = new CertificateCreateDto(USER, COURSE);
@Autowired
private CertificateMapper certificateMapper;
......@@ -54,26 +54,23 @@ final class CertificateMapperTests {
Assertions.assertEquals(createdSimpleDto.getUserId(), certificateDto.getUserId());
Assertions.assertEquals(createdSimpleDto.getGeneratedAt(), certificateDto.getGeneratedAt());
Assertions.assertEquals(createdSimpleDto.getCourseId(), certificateDto.getCourseId());
Assertions.assertEquals(createdSimpleDto.getCertificateFile(), certificateDto.getCertificateFile());
Assertions.assertEquals(createdSimpleDto.getCertificateFileName(), certificateDto.getCertificateFileName());
}
@Test
void mapNullToCertificate() {
var createdCertificate = certificateMapper.mapToCertificate(null);
var createdCertificate = certificateMapper.mapToCertificate(null, Instant.now(), "");
Assertions.assertNull(createdCertificate);
}
@Test
void mapToCertificate() {
var createdCertificate = certificateMapper.mapToCertificate(certificateCreateDto);
var createdCertificate = certificateMapper.mapToCertificate(certificateCreateDto, Instant.now(), "");
Assertions.assertEquals(createdCertificate.getUserId(), certificateDto.getUserId());
Assertions.assertNotNull(createdCertificate.getGeneratedAt());
Assertions.assertEquals(createdCertificate.getCourseId(), certificateDto.getCourseId());
Assertions.assertNull(createdCertificate.getCertificateFile());
Assertions.assertNull(createdCertificate.getCertificateFileName());
}
@Test
......@@ -98,7 +95,6 @@ final class CertificateMapperTests {
Assertions.assertEquals(certificateSimpleDtos.get(0).getUserId(), certificateDto.getUserId());
Assertions.assertEquals(certificateSimpleDtos.get(0).getGeneratedAt(), certificateDto.getGeneratedAt());
Assertions.assertEquals(certificateSimpleDtos.get(0).getCourseId(), certificateDto.getCourseId());
Assertions.assertEquals(certificateSimpleDtos.get(0).getCertificateFile(), certificateDto.getCertificateFile());
Assertions.assertEquals(certificateSimpleDtos.get(0).getCertificateFileName(), certificateDto.getCertificateFileName());
......@@ -127,7 +123,6 @@ final class CertificateMapperTests {
Assertions.assertEquals(certificate.getGeneratedAt(), pageDto.getContent().get(0).getGeneratedAt());
Assertions.assertEquals(certificate.getUserId(), pageDto.getContent().get(0).getUserId());
Assertions.assertEquals(certificate.getCourseId(), pageDto.getContent().get(0).getCourseId());
Assertions.assertEquals(certificate.getCertificateFile(), pageDto.getContent().get(0).getCertificateFile());
Assertions.assertEquals(certificate.getCertificateFileName(), pageDto.getContent().get(0).getCertificateFileName());
}
......
......@@ -41,7 +41,7 @@ final class CertificateServiceTests {
private final CourseDto COURSE = new CourseDto("AJ1", 10,
LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1);
private final Certificate certificate = new Certificate(USER.getId(),
Instant.now(), COURSE.getId(), "file", "fileName");
Instant.now(), COURSE.getId(), "fileName");
private final List<Certificate> certificates = List.of(certificate, certificate);
@Test
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment