Skip to content
Snippets Groups Projects
Commit 9ce11355 authored by evilimkova's avatar evilimkova
Browse files

Implementing certificateFile + filename functionality

parent 6ff0ff6d
No related branches found
No related tags found
1 merge request!39Implementing certificateFile + filename functionality
Pipeline #
Showing
with 112 additions and 46 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);
......
package org.fuseri.modulecertificate.certificate;
import org.fuseri.model.dto.certificate.CertificateCreateDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
......@@ -41,7 +42,18 @@ public class CertificateService {
return certificateRepository.save(certificate);
}
@Transactional(readOnly = true)
public String generateCertificateFile()
{
return "JVBERi0xLjcNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFuZyhlbi1VUykgL1N0cnVjdFRyZWVSb290IDE1IDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4vTWV0YWRhdGEgMzkgMCBSL1ZpZXdlclByZWZlcmVuY2VzIDQwIDAgUj4+DQplbmRvYmoNCjIgMCBvYmoNCjw8L1R5cGUvUGFnZXMvQ291bnQgMS9LaWRzWyAzIDAgUl0gPj4NCmVuZG9iag0KMyAwIG9iag0KPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9SZXNvdXJjZXM8PC9Gb250PDwvRjEgNSAwIFIvRjIgMTIgMCBSPj4vRXh0R1N0YXRlPDwvR1MxMCAxMCAwIFIvR1MxMSAxMSAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSV0gPj4vTWVkaWFCb3hbIDAgMCA2MTIgNzkyXSAvQ29udGVudHMgNCAwIFIvR3JvdXA8PC9UeXBlL0dyb3VwL1MvVHJhbnNwYXJlbmN5L0NTL0RldmljZVJHQj4+L1RhYnMvUy9TdHJ1Y3RQYXJlbnRzIDA+Pg0KZW5kb2JqDQo0IDAgb2JqDQo8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDQ5ND4+DQpzdHJlYW0NCnicrVRNi9swEL0b/B/m2BaizIw+DUawsZ2lhYVtG+hh6am0ObXQ9v9DZ6wNJCE0WImxI2s0I73n9zKwfoa+Xz8N70fAnGEzDvC7bdCgXh0xIAT5jR3Dn+9t8+Ud/Gqbza5t1lsCZtj9aBuSJAQCSmyshdAl00XY/ZSkx8+EsP8rO8K+TOl1+tg2Lz0iB8SQEP2ESIOMDxLbytlWbomhk9tLLGpeZttrLIe+hLREU+dylpjM3aY8dspfYfehbSaB+7FtYHoaAI4I00LCfE7YcWdCPCY80yzk3sDb/x/Ptx5vMRj0EALVHG8Xyx3ZIPtTydkbz+BjNDYVCEZigEaworG6z/5C8NOr/KpZkT0Tyjy4Ir/aQkddF7lTWTvV8ybgzpMirgc+XDGXW6zuJZQpGF+L8qoD/GKI5C4Z0MvfIN0fXlhs0DN4lKROzInWWF9nTopjXknPoRjKKK2I0pBZDEnIOcnQPWg7oo0vGWE7r3S6sp038Ef1nfKwtUY+I8jRGvJ1BGElZ0ZR7duLwhtniHeClaJJlbD0u9/v+3Q0+7MSCKWuiIasws0qi37kxxM/KN4Vnyp/bJeDMXQXj5mcvNNUyuZ3LCXjnVg7dIZiPesD3oPNlTJNc8z6dKXtxVt7irPSBlMl+os95R+8JLaKDQplbmRzdHJlYW0NCmVuZG9iag0KNSAwIG9iag0KPDwvVHlwZS9Gb250L1N1YnR5cGUvVHlwZTAvQmFzZUZvbnQvQkNERUVFK0NhbGlicmkvRW5jb2RpbmcvSWRlbnRpdHktSC9EZXNjZW5kYW50Rm9udHMgNiAwIFIvVG9Vbmljb2RlIDM1IDAgUj4+DQplbmRvYmoNCjYgMCBvYmoNClsgNyAwIFJdIA0KZW5kb2JqDQo3IDAgb2JqDQo8PC9CYXNlRm9udC9CQ0RFRUUrQ2FsaWJyaS9TdWJ0eXBlL0NJREZvbnRUeXBlMi9UeXBlL0ZvbnQvQ0lEVG9HSURNYXAvSWRlbnRpdHkvRFcgMTAwMC9DSURTeXN0ZW1JbmZvIDggMCBSL0ZvbnREZXNjcmlwdG9yIDkgMCBSL1cgMzcgMCBSPj4NCmVuZG9iag0KOCAwIG9iag0KPDwvT3JkZXJpbmcoSWRlbnRpdHkpIC9SZWdpc3RyeShBZG9iZSkgL1N1cHBsZW1lbnQgMD4+DQplbmRvYmoNCjkgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvQkNERUVFK0NhbGlicmkvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQgNzUwL0Rlc2NlbnQgLTI1MC9DYXBIZWlnaHQgNzUwL0F2Z1dpZHRoIDUyMS9NYXhXaWR0aCAxNzQzL0ZvbnRXZWlnaHQgNDAwL1hIZWlnaHQgMjUwL1N0ZW1WIDUyL0ZvbnRCQm94WyAtNTAzIC0yNTAgMTI0MCA3NTBdIC9Gb250RmlsZTIgMzYgMCBSPj4NCmVuZG9iag0KMTAgMCBvYmoNCjw8L1R5cGUvRXh0R1N0YXRlL0JNL05vcm1hbC9jYSAxPj4NCmVuZG9iag0KMTEgMCBvYmoNCjw8L1R5cGUvRXh0R1N0YXRlL0JNL05vcm1hbC9DQSAxPj4NCmVuZG9i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IDkwWyA1NDNdICA5NFsgNDU5XSAgMTAwWyA0ODddICAxMDRbIDY0Ml0gIDI1OFsgNDc5XSAgMjcyWyA0MjNdICAyODZbIDQ5OF0gIDMzNlsgNDcxXSAgMzQ5WyAyMzBdICAzNjdbIDIzMF0gIDM3NFsgNTI1XSAgMzgxWyA1MjddICAzOTNbIDUyNV0gIDM5NlsgMzQ5XSAgNDAwWyAzOTFdICA0MTBbIDMzNV0gIDQxNVsgNTU3XSAgNDM3WyA1MjVdICA4NTZbIDI1Ml0gXSANCmVuZG9iag0KMzggMCBvYmoNClsgMjI2XSANCmVuZG9iag0KMzkgMCBvYmoNCjw8L1R5cGUvTWV0YWRhdGEvU3VidHlwZS9YTUwvTGVuZ3RoIDMwOTM+Pg0Kc3RyZWFtDQo8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IjMuMS03MDEiPgo8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgo8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiAgeG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvIj4KPHBkZjpQcm9kdWNlcj5NaWNyb3NvZnTCriBXb3JkIGZvciBNaWNyb3NvZnQgMzY1PC9wZGY6UHJvZHVjZXI+PC9yZGY6RGVzY3JpcHRpb24+CjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgo8ZGM6Y3JlYXRvcj48cmRmOlNlcT48cmRmOmxpPkVzdGVyIFZpbMOtbWtvdsOhPC9yZGY6bGk+PC9yZGY6U2VxPjwvZGM6Y3JlYXRvcj48L3JkZjpEZXNjcmlwdGlvbj4KPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+Cjx4bXA6Q3JlYXRvclRvb2w+TWljcm9zb2Z0wq4gV29yZCBmb3IgTWljcm9zb2Z0IDM2NTwveG1wOkNyZWF0b3JUb29sPjx4bXA6Q3JlYXRlRGF0ZT4yMDIzLTA0LTMwVDEzOjM2OjAwKzAyOjAwPC94bXA6Q3JlYXRlRGF0ZT48eG1wOk1vZGlmeURhdGU+MjAyMy0wNC0zMFQxMzozNjowMCswMjowMDwveG1wOk1vZGlmeURhdGU+PC9yZGY6RGVzY3JpcHRpb24+CjxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyI+Cjx4bXBNTTpEb2N1bWVudElEPnV1aWQ6MDE0REFBQUEtM0RFNC00REIyLUFERjItODVCOEQ0QjM5OTM2PC94bXBNTTpEb2N1bWVudElEPjx4bXBNTTpJbnN0YW5jZUlEPnV1aWQ6MDE0REFBQUEtM0RFNC00REIyLUFERjItODVCOEQ0QjM5OTM2PC94bXBNTTpJbnN0YW5jZUlEPjwvcmRmOkRlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPC9yZGY6UkRGPjwveDp4bXBtZXRhPjw/eHBhY2tldCBlbmQ9InciPz4NCmVuZHN0cmVhbQ0KZW5kb2JqDQo0MCAwIG9iag0KPDwvRGlzcGxheURvY1RpdGxlIHRydWU+Pg0KZW5kb2JqDQo0MSAwIG9iag0KPDwvVHlwZS9YUmVmL1NpemUgNDEvV1sgMSA0IDJdIC9Sb290IDEgMCBSL0luZm8gMTQgMCBSL0lEWzxBQUFBNEQwMUU0M0RCMjREQURGMjg1QjhENEIzOTkzNj48QUFBQTREMDFFNDNEQjI0REFERjI4NUI4RDRCMzk5MzY+XSAvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxMzM+Pg0Kc3RyZWFtDQp4nDXOPRLBYBDG8X0jeZPIh0TjEjqHchBHoGbMGKVROEUKnVbjCvpYz58t9jdbPM+smc84Bt+92ZczPEV4i3QJFxhEtoariAd4iLyCmyhOZol3LqyFGXTQQwMJ/AJzj5f3/xUghQnkkEGEEgqoYQqVd9atPmteYrsSuw3sxTGafQCPdxKFDQplbmRzdHJlYW0NCmVuZG9iag0KeHJlZg0KMCA0Mg0KMDAwMDAwMDAxNSA2NTUzNSBmDQowMDAwMDAwMDE3IDAwMDAwIG4NCjAwMDAwMDAxNjYgMDAwMDAgbg0KMDAwMDAwMDIyMiAwMDAwMCBuDQowMDAwMDAwNTAwIDAwMDAwIG4NCjAwMDAwMDEwNjggMDAwMDAgbg0KMDAwMDAwMTE5OCAwMDAwMCBuDQowMDAwMDAxMjI2IDAwMDAwIG4NCjAwMDAwMDEzODMgMDAwMDAgbg0KMDAwMDAwMTQ1NiAwMDAwMCBuDQowMDAwMDAxNjk1IDAwMDAwIG4NCjAwMDAwMDE3NDkgMDAwMDAgbg0KMDAwMDAwMTgwMyAwMDAwMCBuDQowMDAwMDAxOTcyIDAwMDAwIG4NCjAwMDAwMDIyMTIgMDAwMDAgbg0KMDAwMDAwMDAxNiA2NTUzNSBmDQowMDAwMDAwMDE3IDY1NTM1IGYNCjAwMDAwMDAwMTggNjU1MzUgZg0KMDAwMDAwMDAxOSA2NTUzNSBmDQowMDAwMDAwMDIwIDY1NTM1IGYNCjAwMDAwMDAwMjEgNjU1MzUgZg0KMDAwMDAwMDAyMiA2NTUzNSBmDQowMDAwMDAwMDIzIDY1NTM1IGYNCjAwMDAwMDAwMjQgNjU1MzUgZg0KMDAwMDAwMDAyNSA2NTUzNSBmDQowMDAwMDAwMDI2IDY1NTM1IGYNCjAwMDAwMDAwMjcgNjU1MzUgZg0KMDAwMDAwMDAyOCA2NTUzNSBmDQowMDAwMDAwMDI5IDY1NTM1IGYNCjAwMDAwMDAwMzAgNjU1MzUgZg0KMDAwMDAwMDAzMSA2NTUzNSBmDQowMDAwMDAwMDMyIDY1NTM1IGYNCjAwMDAwMDAwMzMgNjU1MzUgZg0KMDAwMDAwMDAzNCA2NTUzNSBmDQowMDAwMDAwMDAwIDY1NTM1IGYNCjAwMDAwMDMwODYgMDAwMDAgbg0KMDAwMDAwMzU1NSAwMDAwMCBuDQowMDAwMDM3NjgzIDAwMDAwIG4NCjAwMDAwMzgwMTkgMDAwMDAgbg0KMDAwMDAzODA0NiAwMDAwMCBuDQowMDAwMDQxMjIyIDAwMDAwIG4NCjAwMDAwNDEyNjcgMDAwMDAgbg0KdHJhaWxlcg0KPDwvU2l6ZSA0Mi9Sb290IDEgMCBSL0luZm8gMTQgMCBSL0lEWzxBQUFBNEQwMUU0M0RCMjREQURGMjg1QjhENEIzOTkzNj48QUFBQTREMDFFNDNEQjI0REFERjI4NUI4RDRCMzk5MzY+XSA+Pg0Kc3RhcnR4cmVmDQo0MTYwMQ0KJSVFT0YNCnhyZWYNCjAgMA0KdHJhaWxlcg0KPDwvU2l6ZSA0Mi9Sb290IDEgMCBSL0luZm8gMTQgMCBSL0lEWzxBQUFBNEQwMUU0M0RCMjREQURGMjg1QjhENEIzOTkzNj48QUFBQTREMDFFNDNEQjI0REFERjI4NUI4RDRCMzk5MzY+XSAvUHJldiA0MTYwMS9YUmVmU3RtIDQxMjY3Pj4NCnN0YXJ0eHJlZg0KNDI1OTgNCiUlRU9G";
}
public String generateCertificateFileName(CertificateCreateDto certificateCreateDto) {
var fileName = certificateCreateDto.getCourse().getName() +
certificateCreateDto.getUser().getUsername() + ".pdf";
return fileName.replace(" ","_");
}
@Transactional(readOnly = true)
public void delete(Long certificateId) {
certificateRepository.deleteById(certificateId);
}
......
......@@ -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))
......@@ -72,7 +75,6 @@ class CertificateControllerTests {
.andExpect(jsonPath("$.userId").value(certificateDto.getUserId()))
.andExpect(jsonPath("$.generatedAt").value(certificateDto.getGeneratedAt().toString()))
.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