package kickr.cli;
import io.dropwizard.cli.ConfiguredCommand;
import io.dropwizard.db.DataSourceFactory;
import io.dropwizard.hibernate.HibernateBundle;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import kickr.config.KickrConfiguration;
import kickr.db.dao.UserDAO;
import kickr.db.entity.user.Role;
import kickr.db.entity.user.User;
import kickr.security.service.CredentialsService;
import net.sourceforge.argparse4j.inf.Namespace;
import net.sourceforge.argparse4j.inf.Subparser;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import support.transactional.WithTransaction;
/**
*
* @author nikku
*/
public class SetupCommand extends ConfiguredCommand<KickrConfiguration> {
private static final Logger LOGGER = LoggerFactory.getLogger(SetupCommand.class);
public SetupCommand() {
super("setup", "Sets up the application");
}
@Override
public void configure(Subparser subparser) {
super.configure(subparser);
subparser.addArgument("username").help("Name of the admin user").required(true);
subparser.addArgument("email").help("Name of the admin user").required(true);
subparser.addArgument("password").help("Password for the admin user").required(true);
}
@Override
protected void run(Bootstrap<KickrConfiguration> bootstrap, Namespace namespace, KickrConfiguration configuration) throws Exception {
HibernateBundle<KickrConfiguration> hibernateBundle = new HibernateBundle<KickrConfiguration>(User.class) {
@Override
public DataSourceFactory getDataSourceFactory(KickrConfiguration configuration) {
return configuration.getDataSourceFactory();
}
};
Environment environment = new Environment(bootstrap.getApplication().getName(),
bootstrap.getObjectMapper(),
bootstrap.getValidatorFactory().getValidator(),
bootstrap.getMetricRegistry(),
bootstrap.getClassLoader());
configuration.getMetricsFactory().configure(environment.lifecycle(), bootstrap.getMetricRegistry());
bootstrap.run(configuration, environment);
hibernateBundle.run(configuration, environment);
SessionFactory sessionFactory = hibernateBundle.getSessionFactory();
WithTransaction transactional = new WithTransaction(sessionFactory);
UserDAO userDao = new UserDAO(sessionFactory);
CredentialsService credentialsService = new CredentialsService();
User user = new User(namespace.getString("username"), namespace.getString("email"));
user.setPassword(credentialsService.encryptPassword(namespace.getString("password")));
user.setPermissions(Role.toPermissions(Role.ADMIN, Role.USER));
transactional.run(() -> {
userDao.createUser(user);
});
LOGGER.info("Created user {}", user.getName());
}
}