/*
* Copyright (c) 2015. Traveliko
*/
package com.bearchoke.platform.domain.user.init;
import com.bearchoke.platform.api.user.command.CreateRoleCommand;
import com.bearchoke.platform.api.user.identifier.RoleIdentifier;
import com.bearchoke.platform.base.init.DBInit;
import com.bearchoke.platform.domain.user.RoleConstants;
import com.bearchoke.platform.domain.user.document.Role;
import com.bearchoke.platform.domain.user.repositories.RoleRepository;
import lombok.extern.log4j.Log4j2;
import org.axonframework.commandhandling.CommandBus;
import org.axonframework.commandhandling.GenericCommandMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.List;
/**
*
*/
@SuppressWarnings("SpringJavaAutowiringInspection")
@Component
@Log4j2
@Order(1)
public class RoleDBInit implements DBInit {
private final MongoTemplate mongoTemplate;
private final CommandBus commandBus;
private final RoleRepository roleRepository;
@Autowired
public RoleDBInit(CommandBus commandBus,
MongoTemplate mongoTemplate,
RoleRepository roleRepository) {
this.commandBus = commandBus;
this.mongoTemplate = mongoTemplate;
this.roleRepository = roleRepository;
}
@Override
public boolean initEvenIfExist() {
// overwrite everything
if (mongoTemplate.collectionExists(Role.class)) {
initializeDB();
}
return initIfNotExist();
}
@Override
public boolean initIfNotExist() {
boolean result = true;
log.info("Creating new reference roles...");
createRole(RoleConstants.ROLE_USER, Collections.singletonList(RoleConstants.RIGHT_USER));
createRole(RoleConstants.ROLE_ADMIN, Collections.singletonList(RoleConstants.RIGHT_ADMIN));
createRole(RoleConstants.ROLE_MANAGER, Collections.singletonList(RoleConstants.RIGHT_MANAGER));
return result;
}
private void initializeDB() {
log.info("Dropping Role collections from MongoDb");
// clear our own collections
mongoTemplate.dropCollection(Role.class);
}
private void createRole(String name, List<String> rights) {
Role role = roleRepository.findByName(name);
if (role == null) {
log.info(String.format("Creating new role: %s", name));
RoleIdentifier roleId = new RoleIdentifier(name);
CreateRoleCommand command = new CreateRoleCommand(roleId, name, rights);
commandBus.dispatch(new GenericCommandMessage<>(command));
} else {
log.info(String.format("Role: %s already exists. Will not modify.", name));
}
}
}