Add edition of user name or user email

This commit is contained in:
Florian
2018-06-07 21:05:36 +02:00
parent b46dcb1bda
commit 8a10fa0451
7 changed files with 213 additions and 6 deletions

View File

@@ -70,6 +70,13 @@
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>

View File

@@ -87,4 +87,10 @@ public class AccountController {
public UserDTO signin(@RequestBody final UserDTO pUser, final HttpServletResponse pResponse) throws IOException {
return accountService.signin(pUser, pResponse);
}
@PutMapping("/")
public void update(@RequestBody final UserDTO pUser, final HttpServletRequest pRequest,
final HttpServletResponse pResponse) throws IOException {
accountService.updateUser(pUser, pRequest, pResponse);
}
}

View File

@@ -140,4 +140,32 @@ public class AccountService {
return new UserDTO(user);
}
public void updateUser(final UserDTO pUser, final HttpServletRequest pRequest,
final HttpServletResponse pResponse) throws IOException {
final Optional<User> connectedUserOpt = tokenService.getAuthenticatedUserByToken(pRequest);
if(connectedUserOpt.isPresent()) {
final User connectedUser = connectedUserOpt.get();
final Optional<User> userFromDb = userRepository.findByEmail(pUser.getEmail());
/*
* If a user is returned by the repository, that's the email adress is used, but
* if it is not the same as the connected user, that's the email adress
* corresponds to another user. So a 409 error is sent. Otherwise, if no user is
* returned by the repository, that's the email adress is free to be used. So,
* user can change him email adress.
*/
if(userFromDb.isPresent() && !connectedUser.getEmail().equals(userFromDb.get().getEmail())) {
pResponse.sendError(HttpServletResponse.SC_CONFLICT);
} else {
connectedUser.setName(pUser.getName());
connectedUser.setEmail(pUser.getEmail());
userRepository.save(connectedUser);
}
} else {
pResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
}

View File

@@ -7,7 +7,7 @@
alt="Card image cap"
mdbTooltip="Modifier mon image de profil"
placement="bottom">
<div class="card-body">
<div id="form" class="card-body">
<form (ngSubmit)="onSubmit()" #profilEditionForm="ngForm">
<div class="md-form">
<input mdbActive
@@ -19,7 +19,7 @@
#name="ngModel"
data-error="Veuillez saisir votre nom d'utilisateur"
data-sucess=""
required disabled />
required />
<label for="name">Nom d'utilisateur</label>
</div>
<div class="md-form">
@@ -32,15 +32,25 @@
#email="ngModel"
data-error="Veuillez saisir votre adresse email"
data-sucess=""
required disabled />
required />
<label for="email">Email</label>
</div>
<div id="errorMsg" class="card red lighten-2 text-center z-depth-2">
<div class="card-body">
<p class="white-text mb-0">{{modelError}}</p>
</div>
</div>
<div id="resultMsg" class="card green lighten-2 text-center z-depth-2" >
<div class="card-body">
<p class="white-text mb-0">{{result}}</p>
</div>
</div>
<div class="col submitFormArea">
<a routerLink="/accountSettings" class="indigo-text">
Annuler
</a>
<button class="float-right waves-effect waves-light indigo btn"
type="submit" [disabled]="!profilEditionForm.form.valid || true" disabled>
type="submit" [disabled]="!profilEditionForm.form.valid">
Suivant
</button>
</div>

View File

@@ -10,7 +10,7 @@ import { environment } from '../../../environments/environment';
selector: 'app-profil-edition',
templateUrl: './profil-edition.component.html',
styles: [`
.card-body {
#form {
padding-bottom: 10px;
}
@@ -21,6 +21,13 @@ import { environment } from '../../../environments/environment';
#profil-image {
cursor: pointer;
}
#resultMsg, #errorMsg {
max-height: 0;
overflow: hidden;
transition: max-height 0.5s ease-out;
margin: 0;
}
`]
})
export class ProfilEditionComponent implements OnInit {
@@ -69,6 +76,24 @@ export class ProfilEditionComponent implements OnInit {
}
onSubmit(): void {
// TODO
this.profilEditionService.updateUser(this.model).subscribe(() => {
this.setMessage('Modification enregistrée.', false);
}, error => {
this.setMessage('L\'adresse mail saisie n\'est pas disponible.', true);
});
}
setMessage(message: string, error: boolean): void {
this[error ? 'modelError' : 'result'] = message;
const resultMsgDiv = document.getElementById(error ? 'errorMsg' : 'resultMsg');
resultMsgDiv.style.maxHeight = '64px';
setTimeout(() => {
resultMsgDiv.style.maxHeight = '0px';
setTimeout(() => {
this[error ? 'modelError' : 'result'] = undefined;
}, 550);
}, 3000);
}
}

View File

@@ -2,8 +2,10 @@ import { Injectable } from '@angular/core';
import {HttpClient, HttpRequest, HttpEvent} from '@angular/common/http';
import {Observable} from 'rxjs/Observable';
import { environment } from '../../../environments/environment';
import { User } from '../../core/entities';
const IMAGES_URL = environment.apiUrl + '/api/images';
const ACCOUNT_URL = environment.apiUrl + '/api/account';
@Injectable()
export class ProfilEditionService {
@@ -21,4 +23,8 @@ export class ProfilEditionService {
}
));
}
updateUser(user: User): Observable<any> {
return this.http.put<any>(`${ACCOUNT_URL}/`, user);
}
}

View File

@@ -0,0 +1,125 @@
package org.codiki.account;
import java.io.IOException;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.codiki.core.entities.dto.UserDTO;
import org.codiki.core.entities.persistence.User;
import org.codiki.core.repositories.UserRepository;
import org.codiki.core.security.TokenService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class AccountServiceTest {
@InjectMocks
private AccountService service;
@Mock
private UserRepository repository;
@Mock
private TokenService tokenService;
@Mock
private HttpServletRequest request;
@Mock
private HttpServletResponse response;
@Before
public void before() {
MockitoAnnotations.initMocks(AccountServiceTest.class);
}
private Optional<User> buildUser() {
final User u = new User();
u.setId(1L);
u.setName("name");
u.setEmail("test@test.te");
return Optional.of(u);
}
@Test
public void test_updateUser_ok_diff_name() throws IOException {
final UserDTO userDto = new UserDTO();
userDto.setName("anotherName");
userDto.setEmail("test@test.te");
final Optional<User> connectedUser = buildUser();
final Optional<User> userFromDb = buildUser();
Mockito.when(tokenService.getAuthenticatedUserByToken(Mockito.any())).thenReturn(connectedUser);
Mockito.when(repository.findByEmail(Mockito.anyString())).thenReturn(userFromDb);
service.updateUser(userDto, request, response);
Mockito.verify(response, Mockito.times(0)).sendError(Mockito.anyInt());
}
@Test
public void test_updateUser_ok_diff_email() throws IOException {
final UserDTO userDto = new UserDTO();
userDto.setName("name");
userDto.setEmail("autre_adresse@test.te");
final Optional<User> connectedUser = buildUser();
final Optional<User> userFromDb = buildUser();
Mockito.when(tokenService.getAuthenticatedUserByToken(Mockito.any())).thenReturn(connectedUser);
Mockito.when(repository.findByEmail(Mockito.anyString())).thenReturn(userFromDb);
service.updateUser(userDto, request, response);
Mockito.verify(response, Mockito.times(0)).sendError(Mockito.anyInt());
}
@Test
public void test_updateUser_ok_diff_all() throws IOException {
final UserDTO userDto = new UserDTO();
userDto.setName("anotherName");
userDto.setEmail("another_adress@test.te");
final Optional<User> connectedUser = buildUser();
final Optional<User> userFromDb = buildUser();
Mockito.when(tokenService.getAuthenticatedUserByToken(Mockito.any())).thenReturn(connectedUser);
Mockito.when(repository.findByEmail(Mockito.anyString())).thenReturn(userFromDb);
service.updateUser(userDto, request, response);
Mockito.verify(response, Mockito.times(0)).sendError(Mockito.anyInt());
}
@Test
public void test_updateUser_error_email() throws IOException {
final UserDTO userDto = new UserDTO();
userDto.setName("name");
userDto.setEmail("test@test.te");
final Optional<User> connectedUser = buildUser();
final Optional<User> userFromDb = buildUser();
userFromDb.get().setEmail("another_adress@test.te");
Mockito.when(tokenService.getAuthenticatedUserByToken(Mockito.any())).thenReturn(connectedUser);
Mockito.when(repository.findByEmail(Mockito.anyString())).thenReturn(userFromDb);
service.updateUser(userDto, request, response);
Mockito.verify(response, Mockito.times(1)).sendError(Mockito.anyInt());
}
@Test
public void test_updateUser_error_disconnected() throws IOException {
Mockito.when(tokenService.getAuthenticatedUserByToken(Mockito.any())).thenReturn(Optional.empty());
service.updateUser(null, request, response);
Mockito.verify(response, Mockito.times(1)).sendError(Mockito.anyInt());
}
}