feat: created a better account creation flow
This commit is contained in:
@ -24,6 +24,7 @@ public class AdminApiService {
|
||||
private final ProjectService projectService;
|
||||
private final UserService userService;
|
||||
private final AdministratorService administratorService;
|
||||
private final EntrepreneurService entrepreneurService;
|
||||
private final UtilsService utilsService;
|
||||
private final AppointmentService appointmentService;
|
||||
private final ReportService reportService;
|
||||
@ -35,6 +36,7 @@ public class AdminApiService {
|
||||
UserService userService,
|
||||
AdministratorService administratorService,
|
||||
UtilsService utilsService,
|
||||
EntrepreneurService entrepreneurService,
|
||||
AppointmentService appointmentService,
|
||||
ReportService reportService,
|
||||
SectionCellService sectionCellService) {
|
||||
@ -45,6 +47,7 @@ public class AdminApiService {
|
||||
this.appointmentService = appointmentService;
|
||||
this.reportService = reportService;
|
||||
this.sectionCellService = sectionCellService;
|
||||
this.entrepreneurService = entrepreneurService;
|
||||
}
|
||||
|
||||
// TODO: check if tests are sufficient - peer verification required
|
||||
@ -75,6 +78,12 @@ public class AdminApiService {
|
||||
}
|
||||
if (user instanceof Entrepreneur) {
|
||||
Project project = ((Entrepreneur) user).getProjectParticipation();
|
||||
if (project == null) {
|
||||
throw new ResponseStatusException(
|
||||
HttpStatus.NOT_FOUND,
|
||||
"The user has no project, thus no appointments. No users should have no project");
|
||||
}
|
||||
|
||||
project.getListSectionCell()
|
||||
.forEach(
|
||||
sectionCell -> {
|
||||
@ -104,7 +113,7 @@ public class AdminApiService {
|
||||
}
|
||||
|
||||
// TODO: check if tests are sufficient - peer verification required
|
||||
public void addNewProject(Project project) {
|
||||
public Project addNewProject(Project project) {
|
||||
project.setIdProject(null);
|
||||
// We remove the ID from the request to be sure that it will be auto generated
|
||||
try {
|
||||
@ -136,6 +145,7 @@ public class AdminApiService {
|
||||
sectionCell -> {
|
||||
sectionCell.setProjectSectionCell(newProject);
|
||||
});
|
||||
return newProject;
|
||||
}
|
||||
|
||||
public void createAppointmentReport(long appointmentId, Report report, String mail) {
|
||||
@ -164,4 +174,36 @@ public class AdminApiService {
|
||||
public void deleteProject(long projectId) {
|
||||
this.projectService.deleteProjectById(projectId);
|
||||
}
|
||||
|
||||
public void setAdmin(long userId, String token) {
|
||||
Entrepreneur e = this.entrepreneurService.getEntrepreneurById(userId);
|
||||
Administrator a =
|
||||
new Administrator(
|
||||
e.getUserSurname(),
|
||||
e.getUserName(),
|
||||
e.getPrimaryMail(),
|
||||
e.getSecondaryMail(),
|
||||
e.getPhoneNumber());
|
||||
this.entrepreneurService.deleteEntrepreneur(e);
|
||||
this.administratorService.addAdministrator(a);
|
||||
try {
|
||||
KeycloakApi.setRoleToUser(a.getUserName(), "MyINPulse-admin", token);
|
||||
} catch (Exception err) {
|
||||
logger.error(err);
|
||||
}
|
||||
}
|
||||
|
||||
public void validateEntrepreneurAccount(long userId, String token) {
|
||||
Entrepreneur e = this.entrepreneurService.getEntrepreneurById(userId);
|
||||
try {
|
||||
KeycloakApi.setRoleToUser(e.getUserName(), "MyINPulse-entrepreneur", token);
|
||||
} catch (Exception err) {
|
||||
logger.error(err);
|
||||
}
|
||||
this.entrepreneurService.validateEntrepreneurById(userId);
|
||||
}
|
||||
|
||||
public Iterable<User> getPendingUsers() {
|
||||
return this.userService.getPendingAccounts();
|
||||
}
|
||||
}
|
||||
|
@ -2,10 +2,13 @@ package enseirb.myinpulse.service;
|
||||
|
||||
import static enseirb.myinpulse.model.ProjectDecisionValue.PENDING;
|
||||
|
||||
import enseirb.myinpulse.model.Entrepreneur;
|
||||
import enseirb.myinpulse.model.Project;
|
||||
import enseirb.myinpulse.model.SectionCell;
|
||||
import enseirb.myinpulse.service.database.EntrepreneurService;
|
||||
import enseirb.myinpulse.service.database.ProjectService;
|
||||
import enseirb.myinpulse.service.database.SectionCellService;
|
||||
import enseirb.myinpulse.service.database.UserService;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
@ -22,15 +25,21 @@ public class EntrepreneurApiService {
|
||||
private final SectionCellService sectionCellService;
|
||||
private final ProjectService projectService;
|
||||
private final UtilsService utilsService;
|
||||
private final UserService userService;
|
||||
private final EntrepreneurService entrepreneurService;
|
||||
|
||||
@Autowired
|
||||
EntrepreneurApiService(
|
||||
SectionCellService sectionCellService,
|
||||
ProjectService projectService,
|
||||
UtilsService utilsService) {
|
||||
UtilsService utilsService,
|
||||
UserService userService,
|
||||
EntrepreneurService entrepreneurService) {
|
||||
this.sectionCellService = sectionCellService;
|
||||
this.projectService = projectService;
|
||||
this.utilsService = utilsService;
|
||||
this.userService = userService;
|
||||
this.entrepreneurService = entrepreneurService;
|
||||
}
|
||||
|
||||
public void editSectionCell(Long sectionCellId, String content, String mail) {
|
||||
@ -128,4 +137,15 @@ public class EntrepreneurApiService {
|
||||
project.setProjectStatus(PENDING);
|
||||
projectService.addNewProject(project);
|
||||
}
|
||||
|
||||
public void createAccount(Entrepreneur e) {
|
||||
try {
|
||||
userService.getUserByEmail(e.getPrimaryMail());
|
||||
logger.error("The user {} already exists in the system", e.getPrimaryMail());
|
||||
} catch (ResponseStatusException err) {
|
||||
this.entrepreneurService.addEntrepreneur(e);
|
||||
return;
|
||||
}
|
||||
throw new ResponseStatusException(HttpStatus.CONFLICT, "User already exists in the system");
|
||||
}
|
||||
}
|
||||
|
@ -6,12 +6,17 @@ import enseirb.myinpulse.exception.UserNotFoundException;
|
||||
import enseirb.myinpulse.model.RoleRepresentation;
|
||||
import enseirb.myinpulse.model.UserRepresentation;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.springframework.web.client.RestClient;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.management.relation.RoleNotFoundException;
|
||||
|
||||
public class KeycloakApi {
|
||||
|
||||
protected static final Logger logger = LogManager.getLogger();
|
||||
static final String keycloakUrl;
|
||||
static final String realmName;
|
||||
|
||||
@ -29,44 +34,48 @@ public class KeycloakApi {
|
||||
realmName = System.getenv("VITE_KEYCLOAK_REALM");
|
||||
}
|
||||
|
||||
static String toBearer(String b) {
|
||||
return "Bearer " + b;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses Keycloak API to retrieve a role representation of a role by its name
|
||||
*
|
||||
* @param roleName name of the role
|
||||
* @param bearer authorization header used by the client to authenticate to keycloak
|
||||
* @param token authorization header used by the client to authenticate to keycloak
|
||||
*/
|
||||
public static RoleRepresentation getRoleRepresentationByName(String roleName, String bearer)
|
||||
public static RoleRepresentation getRoleRepresentationByName(String roleName, String token)
|
||||
throws RoleNotFoundException {
|
||||
RoleRepresentation[] response =
|
||||
RoleRepresentation response =
|
||||
RestClient.builder()
|
||||
.baseUrl(keycloakUrl)
|
||||
.defaultHeader("Authorization", bearer)
|
||||
.defaultHeader("Authorization", toBearer(token))
|
||||
.build()
|
||||
.get()
|
||||
.uri("/admin/realms/{realmName}/roles/{roleName}", realmName, roleName)
|
||||
.retrieve()
|
||||
.body(RoleRepresentation[].class);
|
||||
|
||||
if (response == null || response.length == 0) {
|
||||
throw new RoleNotFoundException("Role not found");
|
||||
}
|
||||
return response[0];
|
||||
.body(RoleRepresentation.class);
|
||||
/*
|
||||
{"id":"7a845f2e-c832-4465-8cd8-894d72bc13f1","name":"MyINPulse-entrepreneur","description":"Role for entrepreneur","composite":false,"clientRole":false,"containerId":"0d6f691b-e328-471a-b89e-c30bd7e5b6b0","attributes":{}}
|
||||
*/
|
||||
// TODO: check what happens when role does not exist
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use keycloak API to to retreive a userID via his name or email.
|
||||
*
|
||||
* @param username username or mail of the user
|
||||
* @param bearer bearer of the user, allowing access to database
|
||||
* @param token bearer of the user, allowing access to database
|
||||
* @return the userid, as a String
|
||||
* @throws UserNotFoundException
|
||||
*/
|
||||
public static String getUserIdByName(String username, String bearer)
|
||||
public static String getUserIdByName(String username, String token)
|
||||
throws UserNotFoundException {
|
||||
UserRepresentation[] response =
|
||||
RestClient.builder()
|
||||
.baseUrl(keycloakUrl)
|
||||
.defaultHeader("Authorization", bearer)
|
||||
.defaultHeader("Authorization", toBearer(token))
|
||||
.build()
|
||||
.get()
|
||||
.uri(
|
||||
@ -91,27 +100,26 @@ public class KeycloakApi {
|
||||
*
|
||||
* @param username
|
||||
* @param roleName
|
||||
* @param bearer
|
||||
* @param token
|
||||
* @throws RoleNotFoundException
|
||||
* @throws UserNotFoundException
|
||||
*/
|
||||
public static void setRoleToUser(String username, String roleName, String bearer)
|
||||
public static void setRoleToUser(String username, String roleName, String token)
|
||||
throws RoleNotFoundException, UserNotFoundException {
|
||||
RoleRepresentation roleRepresentation = getRoleRepresentationByName(roleName, bearer);
|
||||
String userId = getUserIdByName(username, bearer);
|
||||
|
||||
RoleRepresentation roleRepresentation = getRoleRepresentationByName(roleName, token);
|
||||
String userId = getUserIdByName(username, token);
|
||||
List<RoleRepresentation> rolesToAdd = List.of(roleRepresentation);
|
||||
logger.debug("Adding role {} to user {}", roleRepresentation.id, userId);
|
||||
RestClient.builder()
|
||||
.baseUrl(keycloakUrl)
|
||||
.defaultHeader("Authorization", bearer)
|
||||
.defaultHeader("Authorization", toBearer(token))
|
||||
.build()
|
||||
.post()
|
||||
.uri(
|
||||
"/admin/realms/${realmName}/users/${userId}/role-mappings/realm",
|
||||
realmName,
|
||||
userId)
|
||||
.body(roleRepresentation)
|
||||
.uri("/admin/realms/" + realmName + "/users/" + userId + "/role-mappings/realm")
|
||||
.body(rolesToAdd)
|
||||
.contentType(APPLICATION_JSON)
|
||||
.retrieve();
|
||||
.retrieve()
|
||||
.toBodilessEntity();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -122,4 +122,17 @@ public class EntrepreneurService {
|
||||
public Iterable<Entrepreneur> GetEntrepreneurByProject(Project project) {
|
||||
return this.entrepreneurRepository.getEntrepreneurByProjectParticipation(project);
|
||||
}
|
||||
|
||||
public void deleteEntrepreneur(Entrepreneur e) {
|
||||
this.entrepreneurRepository.delete(e);
|
||||
}
|
||||
|
||||
public void validateEntrepreneurById(Long id) {
|
||||
Optional<Entrepreneur> e = this.entrepreneurRepository.findById(id);
|
||||
if (e.isEmpty()) {
|
||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Entrepreneur n'existe pas");
|
||||
}
|
||||
e.get().setPending(false);
|
||||
this.entrepreneurRepository.save(e.get());
|
||||
}
|
||||
}
|
||||
|
@ -117,4 +117,8 @@ public class UserService {
|
||||
}
|
||||
return this.userRepository.save(user.get());
|
||||
}
|
||||
|
||||
public Iterable<User> getPendingAccounts() {
|
||||
return this.userRepository.findAllByPendingEquals(true);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user