mirror of https://github.com/bvn13/VoidForum.git
134 lines
5.1 KiB
Java
134 lines
5.1 KiB
Java
package ru.bvn13.voidforum.support;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.context.ApplicationListener;
|
|
import org.springframework.context.event.ContextRefreshedEvent;
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
|
import org.springframework.stereotype.Component;
|
|
import ru.bvn13.voidforum.Constants;
|
|
import ru.bvn13.voidforum.models.Privilege;
|
|
import ru.bvn13.voidforum.models.User;
|
|
import ru.bvn13.voidforum.models.Role;
|
|
import ru.bvn13.voidforum.repositories.PrivilegeRepository;
|
|
import ru.bvn13.voidforum.repositories.UserRepository;
|
|
import ru.bvn13.voidforum.repositories.RoleRepository;
|
|
import ru.bvn13.voidforum.services.PrivilegeService;
|
|
import ru.bvn13.voidforum.services.RoleService;
|
|
|
|
import javax.transaction.Transactional;
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.Collection;
|
|
import java.util.List;
|
|
|
|
@Component
|
|
public class InitialDataLoader implements ApplicationListener<ContextRefreshedEvent> {
|
|
|
|
boolean alreadySetup = false;
|
|
|
|
@Autowired
|
|
private UserRepository userRepository;
|
|
|
|
@Autowired
|
|
private RoleRepository roleRepository;
|
|
|
|
@Autowired
|
|
private PrivilegeRepository privilegeRepository;
|
|
|
|
@Autowired
|
|
private PasswordEncoder passwordEncoder;
|
|
|
|
@Override
|
|
@Transactional
|
|
public void onApplicationEvent(ContextRefreshedEvent event) {
|
|
|
|
if (alreadySetup)
|
|
return;
|
|
|
|
Privilege ownerPrivilege = createPrivilegeIfNotFound(PrivilegeService.PRIVILEGE_OWNER);
|
|
Privilege adminPrivilege = createPrivilegeIfNotFound(PrivilegeService.PRIVILEGE_ADMIN);
|
|
Privilege readPrivilege = createPrivilegeIfNotFound(PrivilegeService.PRIVILEGE_READ);
|
|
Privilege writePrivilege = createPrivilegeIfNotFound(PrivilegeService.PRIVILEGE_WRITE);
|
|
Privilege writeHtmlPrivilege = createPrivilegeIfNotFound(PrivilegeService.PRIVILEGE_WRITE_HTML);
|
|
Privilege blockedPrivilege = createPrivilegeIfNotFound(PrivilegeService.PRIVILEGE_BLOCKED);
|
|
|
|
|
|
Role roleOwner = createRoleIfNotFound(RoleService.ROLE_OWNER, Arrays.asList(ownerPrivilege, adminPrivilege, writePrivilege, writeHtmlPrivilege, readPrivilege));
|
|
|
|
createRoleIfNotFound(RoleService.ROLE_ADMIN, Arrays.asList(adminPrivilege, readPrivilege, writePrivilege));
|
|
createRoleIfNotFound(RoleService.ROLE_ADMIN_WITH_HTML_EDITOR, Arrays.asList(adminPrivilege, readPrivilege, writePrivilege, writeHtmlPrivilege));
|
|
createRoleIfNotFound(RoleService.ROLE_USER, Arrays.asList(readPrivilege, writePrivilege));
|
|
createRoleIfNotFound(RoleService.ROLE_USER_WITH_HTML_EDITOR, Arrays.asList(readPrivilege, writePrivilege, writeHtmlPrivilege));
|
|
createRoleIfNotFound(RoleService.ROLE_VISITOR, Arrays.asList(readPrivilege));
|
|
createRoleIfNotFound(RoleService.ROLE_BLOCKED, Arrays.asList(readPrivilege, blockedPrivilege));
|
|
|
|
|
|
if (userRepository.findAllByOneRoleByNameOrderById(RoleService.ROLE_OWNER).size() == 0) {
|
|
User user = new User();
|
|
user.setNickname(Constants.DEFAULT_ADMIN_NICKNAME);
|
|
user.setEmail(Constants.DEFAULT_ADMIN_EMAIL);
|
|
user.setPassword(passwordEncoder.encode(Constants.DEFAULT_ADMIN_PASSWORD));
|
|
user.setRoles(Arrays.asList(roleOwner));
|
|
user.setDisabled(false);
|
|
userRepository.save(user);
|
|
}
|
|
|
|
alreadySetup = true;
|
|
}
|
|
|
|
@Transactional
|
|
public Privilege createPrivilegeIfNotFound(String name) {
|
|
|
|
Privilege privilege = privilegeRepository.findByName(name);
|
|
if (privilege == null) {
|
|
privilege = new Privilege(name);
|
|
privilegeRepository.save(privilege);
|
|
}
|
|
return privilege;
|
|
}
|
|
|
|
@Transactional
|
|
public Role createRoleIfNotFound(String name, Collection<Privilege> privileges) {
|
|
|
|
Role role = roleRepository.findByName(name);
|
|
if (role == null) {
|
|
role = new Role(name);
|
|
role.setPrivileges(privileges);
|
|
} else {
|
|
// add new privileges
|
|
for (Privilege privilege : privileges) {
|
|
boolean found = false;
|
|
for (Privilege p : role.getPrivileges()) {
|
|
if (p.getName().equals(privilege.getName())) {
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!found) {
|
|
role.getPrivileges().add(privilege);
|
|
}
|
|
}
|
|
// remove unused privileges
|
|
List<Privilege> privilegeListForRemoving = new ArrayList<>();
|
|
for (Privilege p : role.getPrivileges()) {
|
|
boolean found = false;
|
|
for (Privilege privilege : privileges) {
|
|
if (p.getName().equals(privilege.getName())) {
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!found) {
|
|
privilegeListForRemoving.add(p);
|
|
}
|
|
}
|
|
for (Privilege privilege : privilegeListForRemoving) {
|
|
role.getPrivileges().remove(privilege);
|
|
}
|
|
}
|
|
roleRepository.save(role);
|
|
return role;
|
|
}
|
|
|
|
}
|