diff --git a/src/main/java/org/datasurvey/repository/UserRepository.java b/src/main/java/org/datasurvey/repository/UserRepository.java index 3f929fb..6a33ce2 100644 --- a/src/main/java/org/datasurvey/repository/UserRepository.java +++ b/src/main/java/org/datasurvey/repository/UserRepository.java @@ -31,7 +31,7 @@ public interface UserRepository extends JpaRepository { Optional findOneByLogin(String login); @EntityGraph(attributePaths = "authorities") - @Cacheable(cacheNames = USERS_BY_LOGIN_CACHE) + //@Cacheable(cacheNames = USERS_BY_LOGIN_CACHE) Optional findOneWithAuthoritiesByLogin(String login); @EntityGraph(attributePaths = "authorities") diff --git a/src/main/java/org/datasurvey/service/MailService.java b/src/main/java/org/datasurvey/service/MailService.java index c40c4fe..cf8f62b 100644 --- a/src/main/java/org/datasurvey/service/MailService.java +++ b/src/main/java/org/datasurvey/service/MailService.java @@ -5,6 +5,7 @@ import java.util.Locale; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import org.datasurvey.domain.User; +import org.datasurvey.domain.UsuarioExtra; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.MessageSource; @@ -115,4 +116,16 @@ public class MailService { log.debug("Sending password restored email to '{}'", user.getEmail()); sendEmailFromTemplate(user, "mail/passwordRestoredEmail", "email.restored.title"); } + + @Async + public void sendSuspendedAccountMail(UsuarioExtra user) { + log.debug("Sending suspended account mail to '{}'", user.getUser().getEmail()); + sendEmailFromTemplate(user.getUser(), "mail/suspendedAccountEmail", "email.suspended.title"); + } + + @Async + public void sendActivatedAccountMail(UsuarioExtra user) { + log.debug("Sending reactivated account mail to '{}'", user.getUser().getEmail()); + sendEmailFromTemplate(user.getUser(), "mail/reactivatedAccountEmail", "email.reactivation.title"); + } } diff --git a/src/main/java/org/datasurvey/service/UserService.java b/src/main/java/org/datasurvey/service/UserService.java index 227c590..394274c 100644 --- a/src/main/java/org/datasurvey/service/UserService.java +++ b/src/main/java/org/datasurvey/service/UserService.java @@ -76,6 +76,19 @@ public class UserService { ); } + public Optional modifyStatus(String login, Boolean estado) { + return userRepository + .findOneByLogin(login) + .map( + user -> { + // activate given user for the registration key. + user.setActivated(estado); + log.debug("Activated user: {}", user); + return user; + } + ); + } + public Optional completePasswordReset(String newPassword, String key) { log.debug("Reset user password for reset key {}", key); return userRepository @@ -386,6 +399,7 @@ public class UserService { @Transactional(readOnly = true) public Optional getUserWithAuthorities() { return SecurityUtils.getCurrentUserLogin().flatMap(userRepository::findOneWithAuthoritiesByLogin); + //findOneWithAuthoritiesByLogin } /** diff --git a/src/main/java/org/datasurvey/web/rest/UserJWTController.java b/src/main/java/org/datasurvey/web/rest/UserJWTController.java index 3ab2601..441b8dd 100644 --- a/src/main/java/org/datasurvey/web/rest/UserJWTController.java +++ b/src/main/java/org/datasurvey/web/rest/UserJWTController.java @@ -40,6 +40,7 @@ public class UserJWTController { Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); SecurityContextHolder.getContext().setAuthentication(authentication); String jwt = tokenProvider.createToken(authentication, loginVM.isRememberMe()); + HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK); diff --git a/src/main/java/org/datasurvey/web/rest/UsuarioExtraResource.java b/src/main/java/org/datasurvey/web/rest/UsuarioExtraResource.java index 9914108..78b9e32 100644 --- a/src/main/java/org/datasurvey/web/rest/UsuarioExtraResource.java +++ b/src/main/java/org/datasurvey/web/rest/UsuarioExtraResource.java @@ -9,6 +9,8 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; import org.datasurvey.domain.UsuarioExtra; import org.datasurvey.repository.UsuarioExtraRepository; +import org.datasurvey.service.MailService; +import org.datasurvey.service.UserService; import org.datasurvey.service.UsuarioExtraQueryService; import org.datasurvey.service.UsuarioExtraService; import org.datasurvey.service.criteria.UsuarioExtraCriteria; @@ -41,14 +43,22 @@ public class UsuarioExtraResource { private final UsuarioExtraQueryService usuarioExtraQueryService; + private final MailService mailService; + + private final UserService userService; + public UsuarioExtraResource( UsuarioExtraService usuarioExtraService, UsuarioExtraRepository usuarioExtraRepository, - UsuarioExtraQueryService usuarioExtraQueryService + UsuarioExtraQueryService usuarioExtraQueryService, + MailService mailService, + UserService userService ) { this.usuarioExtraService = usuarioExtraService; this.usuarioExtraRepository = usuarioExtraRepository; this.usuarioExtraQueryService = usuarioExtraQueryService; + this.mailService = mailService; + this.userService = userService; } /** @@ -99,6 +109,40 @@ public class UsuarioExtraResource { } UsuarioExtra result = usuarioExtraService.save(usuarioExtra); + + return ResponseEntity + .ok() + .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, usuarioExtra.getId().toString())) + .body(result); + } + + @PutMapping("/usuario-extras-estado/{id}") + public ResponseEntity updateUsuarioExtraEstado( + @PathVariable(value = "id", required = false) final Long id, + @Valid @RequestBody UsuarioExtra usuarioExtra + ) throws URISyntaxException { + log.debug("REST request to update UsuarioExtra : {}, {}", id, usuarioExtra); + if (usuarioExtra.getId() == null) { + throw new BadRequestAlertException("Invalid id", ENTITY_NAME, "idnull"); + } + if (!Objects.equals(id, usuarioExtra.getId())) { + throw new BadRequestAlertException("Invalid ID", ENTITY_NAME, "idinvalid"); + } + + if (!usuarioExtraRepository.existsById(id)) { + throw new BadRequestAlertException("Entity not found", ENTITY_NAME, "idnotfound"); + } + + UsuarioExtra result = usuarioExtraService.save(usuarioExtra); + + if (usuarioExtra.getEstado().name().equals("SUSPENDED")) { + this.userService.modifyStatus(usuarioExtra.getUser().getLogin(), false); + mailService.sendSuspendedAccountMail(usuarioExtra); //se manda el correo de la suspecion + } else { + this.userService.modifyStatus(usuarioExtra.getUser().getLogin(), true); + mailService.sendActivatedAccountMail(usuarioExtra); //se manda el correo de reactivacion + } + return ResponseEntity .ok() .headers(HeaderUtil.createEntityUpdateAlert(applicationName, true, ENTITY_NAME, usuarioExtra.getId().toString())) diff --git a/src/main/resources/i18n/messages.properties b/src/main/resources/i18n/messages.properties index 52b6575..7ff70ce 100644 --- a/src/main/resources/i18n/messages.properties +++ b/src/main/resources/i18n/messages.properties @@ -27,3 +27,15 @@ email.restored.text1=Your DataSurvey password has been successfully reset.. email.restored.text2=Regards, email.restored.text3=If you did not make this change, please notify the following email immediately: email.restored.email=datasurvey@gmail.com + +#reactivar la cuenta +email.reactivation.title=Your account has been reactivated +email.reactivation.greeting=Hello, {0}! +email.reactivation.text1=Your account has been reactivated. Please click on the link so you can keep enjoying DataSurvey: +email.reactivation.text2=Regards, + +#suspended accounr +email.suspended.title=Your account has been suspended +email.suspended.greeting=Dear {0} +email.suspended.text1=Su cuenta en DatSurvey se encuentra temporalmente suspendida. Si cree que es un error por favor haga clic en el siguiente enlace para enviar una solicitud para reactivar su cuenta: +email.suspended.text2=Saludos, diff --git a/src/main/resources/i18n/messages_es.properties b/src/main/resources/i18n/messages_es.properties index 77121fd..4406c99 100644 --- a/src/main/resources/i18n/messages_es.properties +++ b/src/main/resources/i18n/messages_es.properties @@ -28,3 +28,15 @@ email.restored.text2=Saludos, email.restored.text3=Si usted no realizó este cambio, favor notifique inmediatamente al siguiente correo: email.restored.email=datasurvey@gmail.com +#reactivate account +email.reactivation.title=Su cuenta ha sido reactivada +email.reactivation.greeting=¡Hola, {0}! +email.reactivation.text1=Su cuenta en DataSurvey ha sido reactivada. Por favor haga clic en el siguiente enlace para iniciar sesión y disfrutar de DataSurvey: +email.reactivation.text2=Saludos, + + +#suspended accounr +email.suspended.title=Su cuenta ha sido suspendida +email.suspended.greeting=Estimado {0} +email.suspended.text1=Lamentamos informarle que su cuenta en DatSurvey se encuentra temporalmente suspendida. Si cree que es un error por favor responda a este correo +email.suspended.text2=Saludos, diff --git a/src/main/resources/templates/mail/creationEmail.html b/src/main/resources/templates/mail/creationEmail.html index 68b86f5..e46861a 100644 --- a/src/main/resources/templates/mail/creationEmail.html +++ b/src/main/resources/templates/mail/creationEmail.html @@ -264,7 +264,7 @@ th:with="url=(@{|${baseUrl}/account/reset/finish?key=${user.resetKey}|})" th:href="${url}" class="btn btn-primary" - >Iniciar sesiónIniciar Sesión

diff --git a/src/main/resources/templates/mail/reactivatedAccountEmail.html b/src/main/resources/templates/mail/reactivatedAccountEmail.html new file mode 100644 index 0000000..8226a4d --- /dev/null +++ b/src/main/resources/templates/mail/reactivatedAccountEmail.html @@ -0,0 +1,322 @@ + + + + + + + + + + + JHipster activation + + + + + + + +
+
+ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌  +
+ +
+ + diff --git a/src/main/resources/templates/mail/suspendedAccountEmail.html b/src/main/resources/templates/mail/suspendedAccountEmail.html new file mode 100644 index 0000000..5cc146b --- /dev/null +++ b/src/main/resources/templates/mail/suspendedAccountEmail.html @@ -0,0 +1,319 @@ + + + + + + + + + + + JHipster activation + + + + + + + +
+
+ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌  +
+ +
+ + diff --git a/src/main/webapp/app/config/error.constants.ts b/src/main/webapp/app/config/error.constants.ts index ea24e19..e0721f2 100644 --- a/src/main/webapp/app/config/error.constants.ts +++ b/src/main/webapp/app/config/error.constants.ts @@ -3,3 +3,4 @@ export const EMAIL_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/email-already-used'; export const LOGIN_ALREADY_USED_TYPE = PROBLEM_BASE_URL + '/login-already-used'; export const EMAIL_NOT_EXISTS_TYPE = PROBLEM_BASE_URL + '/email-not-exists'; export const USER_IS_GOOGLE_TYPE = PROBLEM_BASE_URL + '/user-is-google'; +export const USER_IS_SUSPENDED = PROBLEM_BASE_URL + '/user-is-suspended'; diff --git a/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.html b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.html index dfe7349..5ac2f58 100644 --- a/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.html +++ b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.html @@ -1,4 +1,4 @@ -
+ diff --git a/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.spec.ts b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.spec.ts deleted file mode 100644 index cee92bc..0000000 --- a/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.spec.ts +++ /dev/null @@ -1,65 +0,0 @@ -jest.mock('@ng-bootstrap/ng-bootstrap'); - -import { ComponentFixture, TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; -import { HttpResponse } from '@angular/common/http'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { of } from 'rxjs'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import { EncuestaService } from '../service/encuesta.service'; - -import { EncuestaDeleteDialogComponent } from './encuesta-delete-dialog.component'; - -describe('Component Tests', () => { - describe('Encuesta Management Delete Component', () => { - let comp: EncuestaDeleteDialogComponent; - let fixture: ComponentFixture; - let service: EncuestaService; - let mockActiveModal: NgbActiveModal; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule], - declarations: [EncuestaDeleteDialogComponent], - providers: [NgbActiveModal], - }) - .overrideTemplate(EncuestaDeleteDialogComponent, '') - .compileComponents(); - fixture = TestBed.createComponent(EncuestaDeleteDialogComponent); - comp = fixture.componentInstance; - service = TestBed.inject(EncuestaService); - mockActiveModal = TestBed.inject(NgbActiveModal); - }); - - describe('confirmDelete', () => { - it('Should call delete service on confirmDelete', inject( - [], - fakeAsync(() => { - // GIVEN - jest.spyOn(service, 'delete').mockReturnValue(of(new HttpResponse({}))); - - // WHEN - comp.confirmDelete(123); - tick(); - - // THEN - expect(service.delete).toHaveBeenCalledWith(123); - expect(mockActiveModal.close).toHaveBeenCalledWith('deleted'); - }) - )); - - it('Should not call delete service on clear', () => { - // GIVEN - jest.spyOn(service, 'delete'); - - // WHEN - comp.cancel(); - - // THEN - expect(service.delete).not.toHaveBeenCalled(); - expect(mockActiveModal.close).not.toHaveBeenCalled(); - expect(mockActiveModal.dismiss).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.ts b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.ts index 573c319..9c56c0e 100644 --- a/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.ts +++ b/src/main/webapp/app/entities/encuesta/delete/encuesta-delete-dialog.component.ts @@ -1,5 +1,6 @@ import { Component } from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { EstadoEncuesta } from 'app/entities/enumerations/estado-encuesta.model'; import { IEncuesta } from '../encuesta.model'; import { EncuestaService } from '../service/encuesta.service'; @@ -16,8 +17,9 @@ export class EncuestaDeleteDialogComponent { this.activeModal.dismiss(); } - confirmDelete(id: number): void { - this.encuestaService.delete(id).subscribe(() => { + confirmDelete(encuesta: IEncuesta): void { + encuesta.estado = EstadoEncuesta.DELETED; + this.encuestaService.update(encuesta).subscribe(() => { this.activeModal.close('deleted'); }); } diff --git a/src/main/webapp/app/entities/encuesta/encuesta-publish-dialog/encuesta-publish-dialog.component.html b/src/main/webapp/app/entities/encuesta/encuesta-publish-dialog/encuesta-publish-dialog.component.html new file mode 100644 index 0000000..8330f1a --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/encuesta-publish-dialog/encuesta-publish-dialog.component.html @@ -0,0 +1,21 @@ + + + + + + + diff --git a/src/main/webapp/app/entities/encuesta/encuesta-publish-dialog/encuesta-publish-dialog.component.scss b/src/main/webapp/app/entities/encuesta/encuesta-publish-dialog/encuesta-publish-dialog.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/main/webapp/app/entities/encuesta/encuesta-publish-dialog/encuesta-publish-dialog.component.ts b/src/main/webapp/app/entities/encuesta/encuesta-publish-dialog/encuesta-publish-dialog.component.ts new file mode 100644 index 0000000..ff2d3b5 --- /dev/null +++ b/src/main/webapp/app/entities/encuesta/encuesta-publish-dialog/encuesta-publish-dialog.component.ts @@ -0,0 +1,33 @@ +import { Component, OnInit } from '@angular/core'; +import { IEncuesta } from '../encuesta.model'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { EncuestaService } from '../service/encuesta.service'; +import { EstadoEncuesta } from '../../enumerations/estado-encuesta.model'; + +@Component({ + selector: 'jhi-encuesta-publish-dialog', + templateUrl: './encuesta-publish-dialog.component.html', + styleUrls: ['./encuesta-publish-dialog.component.scss'], +}) +export class EncuestaPublishDialogComponent implements OnInit { + encuesta?: IEncuesta; + + constructor(protected encuestaService: EncuestaService, protected activeModal: NgbActiveModal) {} + + cancel(): void { + this.activeModal.dismiss(); + } + + confirmPublish(encuesta: IEncuesta): void { + debugger; + if (encuesta.estado === 'DRAFT') { + encuesta.estado = EstadoEncuesta.ACTIVE; + } + + this.encuestaService.update(encuesta).subscribe(() => { + this.activeModal.close('published'); + }); + } + + ngOnInit(): void {} +} diff --git a/src/main/webapp/app/entities/encuesta/encuesta.module.ts b/src/main/webapp/app/entities/encuesta/encuesta.module.ts index 6cd231e..7b1d91e 100644 --- a/src/main/webapp/app/entities/encuesta/encuesta.module.ts +++ b/src/main/webapp/app/entities/encuesta/encuesta.module.ts @@ -6,10 +6,17 @@ import { EncuestaUpdateComponent } from './update/encuesta-update.component'; import { EncuestaDeleteDialogComponent } from './delete/encuesta-delete-dialog.component'; import { EncuestaRoutingModule } from './route/encuesta-routing.module'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { EncuestaPublishDialogComponent } from './encuesta-publish-dialog/encuesta-publish-dialog.component'; @NgModule({ imports: [SharedModule, EncuestaRoutingModule, FontAwesomeModule], - declarations: [EncuestaComponent, EncuestaDetailComponent, EncuestaUpdateComponent, EncuestaDeleteDialogComponent], + declarations: [ + EncuestaComponent, + EncuestaDetailComponent, + EncuestaUpdateComponent, + EncuestaDeleteDialogComponent, + EncuestaPublishDialogComponent, + ], entryComponents: [EncuestaDeleteDialogComponent], }) export class EncuestaModule {} diff --git a/src/main/webapp/app/entities/encuesta/list/encuesta.component.html b/src/main/webapp/app/entities/encuesta/list/encuesta.component.html index 33c2c3d..44b63fc 100644 --- a/src/main/webapp/app/entities/encuesta/list/encuesta.component.html +++ b/src/main/webapp/app/entities/encuesta/list/encuesta.component.html @@ -29,38 +29,43 @@ - +
- No encuestas found + No surveys found
-
-
-
-
-
- -
-
-
- -
-
-
- -
- -
-
+
+ + + +
+ +
+
    +
    +
  • + +
  • +
    +
    +
  • + +
  • +
    +
+
@@ -123,7 +154,7 @@
Delete
-
--> +
+ + +
+
+ + + + + +
+
--> - - + - + - -