Commit 557ef9c5 authored by RenanMontenegro3's avatar RenanMontenegro3

feat: ajustes no AcceptRestController e serviços relacionados

- Atualizado AcceptRestController removendo operações com imagem e mantendo path anterior.
- Ajustado CadastroAcceptService para refletir as novas regras de atualização de Accept.
- Revisado VesselRestController com mesmo padrão de tratamento de imagem.
- Atualizado configurações auxiliares (AsyncConfig, CorsConfig, EmailService, FileStorageService).
- Ajuste geral em variáveis de ambiente (.env).
parent 501e71ad
...@@ -9,8 +9,8 @@ SPRING_SERVLET_MULTIPART_MAX_REQUEST_SIZE="2GB" ...@@ -9,8 +9,8 @@ SPRING_SERVLET_MULTIPART_MAX_REQUEST_SIZE="2GB"
MAIL_HOST="smtp.gmail.com" MAIL_HOST="smtp.gmail.com"
MAIL_PORT="587" MAIL_PORT="587"
MAIL_USERNAME="pauloacb2020@gmail.com" MAIL_USERNAME="paulowrkstdy@gmail.com"
MAIL_PASSWORD="ehyn ryqu utgv ntjd" MAIL_PASSWORD="rxhb oqzm lwho izgg"
MAIL_SMTP_AUTH="true" MAIL_SMTP_AUTH="true"
MAIL_SMTP_STARTTLS_ENABLE="true" MAIL_SMTP_STARTTLS_ENABLE="true"
...@@ -28,7 +28,7 @@ JWT_ACCESS_EXPIRES_IN="3600" ...@@ -28,7 +28,7 @@ JWT_ACCESS_EXPIRES_IN="3600"
JWT_REFRESH_SECRET="5893d555ee0b886b14929d630c2027b912c104ca29295bf9fd126666baf5bff1" JWT_REFRESH_SECRET="5893d555ee0b886b14929d630c2027b912c104ca29295bf9fd126666baf5bff1"
JWT_REFRESH_EXPIRES_IN="7200" JWT_REFRESH_EXPIRES_IN="7200"
DISCO_RAIZ=C:\Users\Renan\laps2\v3\aceite-tecnico-backend\src\main\imagens DISCO_RAIZ=...\aceite-tecnico-backend\src\main\arquivos
DISCO_DIRETORIO_FOTOS=contato-disco DISCO_DIRETORIO_FOTOS=contato-disco
SPRINGDOC_SWAGGER_UI_PATH=/swagge r-ui-custom.html SPRINGDOC_SWAGGER_UI_PATH=/swagge r-ui-custom.html
......
...@@ -148,7 +148,7 @@ public class AcceptRestController { ...@@ -148,7 +148,7 @@ public class AcceptRestController {
@PostMapping @PostMapping
@ResponseStatus(code = HttpStatus.CREATED) @ResponseStatus(code = HttpStatus.CREATED)
public EntityModel<AcceptResponse> public EntityModel<AcceptResponse>
create(@Valid @RequestParam(name="acceptRequestForm", required=true) String acceptRequestForm, @RequestParam(name="foto", required=false) MultipartFile foto) throws JsonProcessingException {return cadastroAcceptService.salvar(acceptRequestForm, foto,"pauloacb2020@gmail.com");} create(@Valid @RequestParam(name="acceptRequestForm", required=true) String acceptRequestForm, @RequestParam(name="foto", required=false) MultipartFile foto) throws JsonProcessingException {return cadastroAcceptService.salvar(acceptRequestForm, foto,"paulowrkstdy@gmail.com");}
// renan.montenegro2018@gmail.com // renan.montenegro2018@gmail.com
@PutMapping("/{id}") @PutMapping("/{id}")
...@@ -159,29 +159,6 @@ public class AcceptRestController { ...@@ -159,29 +159,6 @@ public class AcceptRestController {
@RequestParam(name = "foto", required = false) MultipartFile foto @RequestParam(name = "foto", required = false) MultipartFile foto
) throws JsonProcessingException { ) throws JsonProcessingException {
// Verifica extensão do arquivo (se houver)
String filename = foto.getOriginalFilename();
String extension = null;
int dotIndex = filename.lastIndexOf(".");
if (dotIndex >= 0) {
extension = filename.substring(dotIndex + 1);
}
String[] extensions = {"txt", "zip", "pdf"};
Boolean verifica = false;
if (extension != null) {
for (String i : extensions) {
if (i.equals(extension)) {
verifica = true;
break;
}
}
if (!verifica) {
throw new NegocioException(extension);
}
}
AcceptRequest acceptRequest = mapper.readValue(acceptRequestForm, AcceptRequest.class); AcceptRequest acceptRequest = mapper.readValue(acceptRequestForm, AcceptRequest.class);
User user = securityService.getCurrentUser(); User user = securityService.getCurrentUser();
...@@ -195,6 +172,7 @@ public class AcceptRestController { ...@@ -195,6 +172,7 @@ public class AcceptRestController {
acceptData.setData_update(String.valueOf(LocalDate.now())); acceptData.setData_update(String.valueOf(LocalDate.now()));
acceptData.setTime_update(String.valueOf(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")))); acceptData.setTime_update(String.valueOf(LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"))));
// Mantém o horário de aceite se já existir
if (acceptData.getTime_accept() == null || acceptData.getTime_accept().isBlank()) { if (acceptData.getTime_accept() == null || acceptData.getTime_accept().isBlank()) {
String valorExistente = accept.getTime_accept(); String valorExistente = accept.getTime_accept();
if (valorExistente != null && !valorExistente.isBlank()) { if (valorExistente != null && !valorExistente.isBlank()) {
...@@ -204,20 +182,19 @@ public class AcceptRestController { ...@@ -204,20 +182,19 @@ public class AcceptRestController {
} }
} }
var path = accept.getPath(); // ✅ Mantém a imagem anterior se não vier nova foto
if (foto != null && !foto.isEmpty()) {
if (foto != null) {
acceptData.setPath(foto.getOriginalFilename()); acceptData.setPath(foto.getOriginalFilename());
fileManagerController.uploadFile(foto); // Se quiser, poderia subir a nova imagem aqui:
// fileManagerController.uploadFile(foto);
} else { } else {
accept.setPath(path); acceptData.setPath(accept.getPath());
} }
// Copia campos definidos de acceptData para accept (exceto campos protegidos) // Copia os campos atualizados
BeanUtils.copyProperties(acceptData, accept, BeanUtils.copyProperties(acceptData, accept,
"id", "dataAccept", "data_create", "time_create", "vessel", "user", "bercos"); "id", "dataAccept", "data_create", "time_create", "vessel", "user", "bercos");
accept = acceptRepository.save(accept); accept = acceptRepository.save(accept);
var acceptResponse = acceptMapper.toAcceptResponse(accept); var acceptResponse = acceptMapper.toAcceptResponse(accept);
...@@ -225,6 +202,7 @@ public class AcceptRestController { ...@@ -225,6 +202,7 @@ public class AcceptRestController {
} }
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
// @TWJobsPermissions.IsOwner // @TWJobsPermissions.IsOwner
@TWJobsPermissions.IsCompany @TWJobsPermissions.IsCompany
......
...@@ -14,7 +14,7 @@ import java.util.Objects; ...@@ -14,7 +14,7 @@ import java.util.Objects;
@Service @Service
public class FileStorageService { public class FileStorageService {
private static final String STORAGE_DIRECTORY = "C:\\Users\\Renan\\laps2\\v3\\aceite-tecnico-backend\\src\\main\\arquivos"; private static final String STORAGE_DIRECTORY = "..\\aceite-tecnico-backend\\src\\main\\arquivos";
public void saveFile(MultipartFile fileToSave) throws IOException { public void saveFile(MultipartFile fileToSave) throws IOException {
......
...@@ -18,7 +18,9 @@ import br.com.treinaweb.twjobs.core.models.Disco; ...@@ -18,7 +18,9 @@ import br.com.treinaweb.twjobs.core.models.Disco;
import br.com.treinaweb.twjobs.core.models.User; import br.com.treinaweb.twjobs.core.models.User;
import br.com.treinaweb.twjobs.core.models.Vessel; import br.com.treinaweb.twjobs.core.models.Vessel;
import br.com.treinaweb.twjobs.core.permissions.TWJobsPermissions; import br.com.treinaweb.twjobs.core.permissions.TWJobsPermissions;
import br.com.treinaweb.twjobs.core.repositories.UserRepository;
import br.com.treinaweb.twjobs.core.repositories.VesselCustomRepository; import br.com.treinaweb.twjobs.core.repositories.VesselCustomRepository;
import br.com.treinaweb.twjobs.core.service.EmailService;
import br.com.treinaweb.twjobs.core.services.auth.SecurityService; import br.com.treinaweb.twjobs.core.services.auth.SecurityService;
import br.com.treinaweb.twjobs.core.repositories.VesselRepository; import br.com.treinaweb.twjobs.core.repositories.VesselRepository;
...@@ -76,6 +78,10 @@ public class VesselRestController { ...@@ -76,6 +78,10 @@ public class VesselRestController {
private final FileManagerController fileManagerController; private final FileManagerController fileManagerController;
private final VesselCustomRepository vesselCustomRepository; private final VesselCustomRepository vesselCustomRepository;
private final EmailService emailService;
private final UserRepository userRepository;
@Autowired @Autowired
private ObjectMapper mapper; private ObjectMapper mapper;
...@@ -328,9 +334,44 @@ public class VesselRestController { ...@@ -328,9 +334,44 @@ public class VesselRestController {
// if(lastNumber != newOperation[nOpeLen -1]) { // if(lastNumber != newOperation[nOpeLen -1]) {
// throw new NegocioException("O IMO não segue o padrão"); // throw new NegocioException("O IMO não segue o padrão");
// } // }
User destinatarioUser = userRepository.findBySendEmail(Boolean.TRUE)
.orElseGet(() -> {
User fallback = new User();
fallback.setEmail("suporte@sistema.com");
return fallback;
});
String destinatario = destinatarioUser.getEmail();
vessel = vesselRepository.save(vessel); vessel = vesselRepository.save(vessel);
var vesselResponse = vesselMapper.toVesselResponse(vessel); var vesselResponse = vesselMapper.toVesselResponse(vessel);
String msg =
"ID DO NAVIO: " + vessel.getId() + "\n" +
"IMO DO NAVIO: " + vessel.getImo() + "\n" +
"DETALHES DO NAVIO (SISTEMA):\n" +
" Nome: " + (vessel.getNome() != null ? vessel.getNome() : "N/D") + "\n" +
" Categoria: " + (vessel.getCategoria() != null ? vessel.getCategoria() : "N/D") + "\n" +
" Bandeira: " + (vessel.getFlag() != null ? vessel.getFlag() : "N/D") + "\n" +
" MMSI: " + (vessel.getMmsi() != null ? vessel.getMmsi() : "N/D") + "\n" +
" LOA: " + (vessel.getLoa() != null ? vessel.getLoa() + " m" : "N/D") + "\n" +
" BOCA: " + (vessel.getBoca() != null ? vessel.getBoca() + " m" : "N/D") + "\n" +
" DWT: " + (vessel.getDwt() != null ? vessel.getDwt() + " t" : "N/D") + "\n" +
" Pontal: " + (vessel.getPontal() != null ? vessel.getPontal() + " m" : "N/D") + "\n" +
" Calado (Entrada): " + (vessel.getCalado_entrada() != null ? vessel.getCalado_entrada() + " m" : "N/D") + "\n" +
" Calado (Saída): " + (vessel.getCalado_saida() != null ? vessel.getCalado_saida() + " m" : "N/D") + "\n" +
" Calado Máximo: " + (vessel.getCalado_max() != null ? vessel.getCalado_max() + " m" : "N/D") + "\n" +
" Caminho do Arquivo: " + (vessel.getPath() != null ? vessel.getPath() : "Nenhum arquivo") + "\n" +
" Verificação do Sistema: " + (vessel.getSt_ver_vessel() != null ? vessel.getSt_ver_vessel() : "N/D") + "\n" +
"\n" +
"STATUS INPUTADO PARA O NAVIO(SISTEMA): " + (vessel.getStatus() != null ? vessel.getStatus() : "N/D") + "\n" +
"OBS DO USUÁRIO: " + (vessel.getObs() != null ? vessel.getObs() : "Nenhuma");
emailService.enviarEmailTexto(destinatario, "Navio Cadastrado no Sistema", msg);
return vesselAssembler.toModel(vesselResponse); return vesselAssembler.toModel(vesselResponse);
} }
......
package br.com.treinaweb.twjobs.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@Configuration
public class AsyncConfig {
}
...@@ -76,18 +76,23 @@ public class CadastroAcceptService { ...@@ -76,18 +76,23 @@ public class CadastroAcceptService {
// @SuppressWarnings("null")
@Transactional @Transactional
public EntityModel<AcceptResponse> salvar(String acceptRequestForm, MultipartFile foto, String destinatario) throws JsonProcessingException { public EntityModel<AcceptResponse> salvar(String acceptRequestForm, MultipartFile foto, String destinatario) throws JsonProcessingException {
String msg;
//verifica extensao //verifica extensao --> Desabilitado momentâneamente
String filename = foto.getOriginalFilename(); String filename = foto.getOriginalFilename();
// String filename = "Teste";
String extension = null; String extension = null;
int dotIndex = filename.lastIndexOf("."); int dotIndex = filename.lastIndexOf(".");
if (dotIndex >= 0) { if (dotIndex >= 0) {
extension = filename.substring(dotIndex + 1); extension = filename.substring(dotIndex + 1);
} }
System.out.println("***"); System.out.println("*");
System.out.println("FILENAME"); System.out.println("FILENAME");
System.out.println(filename); System.out.println(filename);
...@@ -108,11 +113,23 @@ public class CadastroAcceptService { ...@@ -108,11 +113,23 @@ public class CadastroAcceptService {
} }
// destinatario = String.valueOf(emailSendRepository.findByStatus(EmailActivation.enable)); User destinatarioUser = userRepository.findBySendEmail(Boolean.TRUE)
//if you are using optional and want to get or set an attribute, you must use the "get()" before .orElseGet(() -> {
destinatario = String.valueOf(userRepository.findBySendEmail(Boolean.TRUE).get().getEmail()); // fallback: destinatário padrão (ex: e-mail institucional)
User fallback = new User();
fallback.setEmail("suporte@sistema.com");
return fallback;
});
// Define o e-mail do destinatário dinamicamente
destinatario = destinatarioUser.getEmail();
System.out.println("*");
System.out.println("DESTINATÁRIO");
System.out.println(destinatario);
System.out.println("***"); System.out.println("*");
System.out.println("DESTINATÁRIO"); System.out.println("DESTINATÁRIO");
System.out.println(destinatario); System.out.println(destinatario);
...@@ -120,7 +137,7 @@ public class CadastroAcceptService { ...@@ -120,7 +137,7 @@ public class CadastroAcceptService {
User user = securityService.getCurrentUser(); User user = securityService.getCurrentUser();
Long userId = user.getId(); // Long userId = user.getId();
var accept = acceptMapper.toAccept(acceptRequest); var accept = acceptMapper.toAccept(acceptRequest);
accept.setUser(user); accept.setUser(user);
...@@ -197,7 +214,13 @@ public class CadastroAcceptService { ...@@ -197,7 +214,13 @@ public class CadastroAcceptService {
// <PARTE-NOVA> // <PARTE-NOVA>
// ADICIONA BERCOS DE RESTRICAO AOS BERCOS COM RESTRICAO (*) // ADICIONA BERCOS DE RESTRICAO AOS BERCOS COM RESTRICAO (*)
if (acceptRequest.getBercosSelecionados() != null && !acceptRequest.getBercosSelecionados().isEmpty()) {
// Desabilita --> era do código original antes de "alteracao-email"
// if(!acceptRequest.getBercosSelecionados().isEmpty()) {
// <PARTE-NOVA-2>
if(acceptRequest.getBercosSelecionados() != null) {
// </PARTE-NOVA-2>
// SE acceptRequest.getBercosSelecionados() NÃO ESTÁ VAZIO // SE acceptRequest.getBercosSelecionados() NÃO ESTÁ VAZIO
for(Long nome : acceptRequest.getBercosSelecionados()) { for(Long nome : acceptRequest.getBercosSelecionados()) {
if(berco.getNome()==nome) { if(berco.getNome()==nome) {
...@@ -209,13 +232,6 @@ public class CadastroAcceptService { ...@@ -209,13 +232,6 @@ public class CadastroAcceptService {
// </PARTE-NOVA> // </PARTE-NOVA>
} }
if ((vessel.getCalado_max() != null &&
(accept.getCalado_entrada() > vessel.getCalado_max() || accept.
getCalado_saida() > vessel.getCalado_max()))) {
hasRestrics = true;
}
// <PARTE-NOVA> // <PARTE-NOVA>
Accept lastAccept = acceptRepository.findFirstByOrderByDataAcceptDesc(); Accept lastAccept = acceptRepository.findFirstByOrderByDataAcceptDesc();
...@@ -224,6 +240,7 @@ public class CadastroAcceptService { ...@@ -224,6 +240,7 @@ public class CadastroAcceptService {
var currentAcceptId = lastAcceptId +1; var currentAcceptId = lastAcceptId +1;
// FAZ PRIMEIRO AS RESTRIÇÕES // FAZ PRIMEIRO AS RESTRIÇÕES
if(hasRestrics) { if(hasRestrics) {
...@@ -248,7 +265,6 @@ public class CadastroAcceptService { ...@@ -248,7 +265,6 @@ public class CadastroAcceptService {
accept.setStatus("N"); accept.setStatus("N");
// CRIA & ENVIA E-MAIL // CRIA & ENVIA E-MAIL
String msg;
msg = msg =
"ID DO ACEITE: "+currentAcceptId+"\n"+ "ID DO ACEITE: "+currentAcceptId+"\n"+
...@@ -266,11 +282,44 @@ public class CadastroAcceptService { ...@@ -266,11 +282,44 @@ public class CadastroAcceptService {
} else if (!bercosCompativeis.isEmpty()) { } else if (!bercosCompativeis.isEmpty()) {
// </PARTE NOVA> // </PARTE NOVA>
// <PARTE-NOVA-2>
// CRIA & ENVIA E-MAIL
String nome_bercos = "";
for(Berco berco : bercosCompativeis) {
// GUARDA O NOME DOS BERCOS
nome_bercos = nome_bercos + berco.getNome() + ", ";
// COLOCA BERCOS COM RESTRICAÇÃO JUNTO AO COMPATÍVEIS
}
msg =
"ID DO ACEITE: "+currentAcceptId+"\n"+
"IMO DO NAVIO: "+accept.getImo()+"\n"+
"CAUSA IDENTIFICADA(SISTEMA): Navio aceito com sucesso! O Ag. Marítimo solicita atracação e o sistema pode inputar berços automaticamente."+"\n"+
"BERCOS COMPATÍVEIS(SISTEMA): "+nome_bercos+"\n"+
"STATUS INPUTADO PARA O ACEITE(SISTEMA): Aceito"+"\n"+
"OBS DO USUÁRIO: "+accept.getObs()+"\n"+
"DATA CRIAÇÃO DO REGISTRO DE ACEITE: "+accept.getData_create()+"\n"+
"DADOS DO USUÁRIO: "+"ID: "+user.getId()+" E-MAIL: "+user.getEmail()+" NOME: "+user.getName()+" PAPEL: "+user.getRole();
emailService.enviarEmailTexto(destinatario, "Aceite de Navio - ACEITO", msg);
// </PARTE-NOVA-2>
accept.setBercos(bercosCompativeis); accept.setBercos(bercosCompativeis);
accept.setStatus("Y"); accept.setStatus("Y");
} else { } else {
// id, imo, user, status, obs, data de criacao, local hospedagem + URIs // id, imo, user, status, obs, data de criacao, local hospedagem + URIs
String msg;
if(blackListed) { if(blackListed) {
msg = "ID DO ACEITE: "+currentAcceptId+"\n"+ msg = "ID DO ACEITE: "+currentAcceptId+"\n"+
"IMO DO NAVIO: "+accept.getImo()+"\n"+ "IMO DO NAVIO: "+accept.getImo()+"\n"+
...@@ -292,8 +341,28 @@ public class CadastroAcceptService { ...@@ -292,8 +341,28 @@ public class CadastroAcceptService {
} }
emailService.enviarEmailTexto(destinatario, "Aceite de Navio - BLOQUEADO", msg); emailService.enviarEmailTexto(destinatario, "Aceite de Navio - BLOQUEADO", msg);
accept.setStatus("N"); accept.setStatus("N");
} }
if(msg == null){
msg =
"O navio de IMO " + accept.getImo() + " solicitou um aceite.\n\n" +
"ID do Aceite: " + currentAcceptId + "\n" +
"Status atual: Aceito.\n\n" +
"Observação do usuário: " + accept.getObs() + "\n" +
"Data de criação: " + accept.getData_create() + "\n\n" +
"Usuário responsável:\n" +
"ID: " + user.getId() + "\n" +
"Nome: " + user.getName() + "\n" +
"E-mail: " + user.getEmail() + "\n" +
"Papel: " + user.getRole();
emailService.enviarEmailTexto(destinatario, "Solicitação de Aceite Cadastrada", msg);
}
accept = acceptRepository.save(accept); accept = acceptRepository.save(accept);
var acceptResponse = acceptMapper.toAcceptResponse(accept); var acceptResponse = acceptMapper.toAcceptResponse(accept);
return acceptAssembler.toModel(acceptResponse); return acceptAssembler.toModel(acceptResponse);
...@@ -562,4 +631,4 @@ public class CadastroAcceptService { ...@@ -562,4 +631,4 @@ public class CadastroAcceptService {
// //
// //
// } // }
// accept.setStatus(VeriStatus.valueOf("N")); // accept.setStatus(VeriStatus.valueOf("N"));
\ No newline at end of file
...@@ -2,6 +2,7 @@ package br.com.treinaweb.twjobs.core.service; ...@@ -2,6 +2,7 @@ package br.com.treinaweb.twjobs.core.service;
import br.com.treinaweb.twjobs.core.exceptions.NegocioException; import br.com.treinaweb.twjobs.core.exceptions.NegocioException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.SimpleMailMessage;
...@@ -9,6 +10,7 @@ import org.springframework.mail.javamail.JavaMailSender; ...@@ -9,6 +10,7 @@ import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Slf4j
@Service @Service
public class EmailService { public class EmailService {
...@@ -21,23 +23,24 @@ public class EmailService { ...@@ -21,23 +23,24 @@ public class EmailService {
@Async @Async
public String enviarEmailTexto(String destinatario, String assunto, String mensagem){ public void enviarEmailTexto(String destinatario, String assunto, String mensagem) {
// throw new NegocioException("Teste.");
try { try {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom(remetente); simpleMailMessage.setFrom(remetente);
simpleMailMessage.setTo(destinatario); simpleMailMessage.setTo(destinatario);
simpleMailMessage.setSubject(assunto); simpleMailMessage.setSubject(assunto);
simpleMailMessage.setText(mensagem); simpleMailMessage.setText(mensagem);
javaMailSender.send(simpleMailMessage); javaMailSender.send(simpleMailMessage);
return "Email enviado";
} catch(Exception e){ log.info("Email enviado com sucesso para: {}", destinatario);
return "Erro ao tentar enviar e-mail" + e.getLocalizedMessage(); } catch (Exception e) {
log.error("Erro ao enviar email para o destinatário {}: {}", destinatario, e.getMessage(), e);
} }
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment