DatabaseSeeder.java

package com.edtech.config;

import com.edtech.model.User;
import com.edtech.model.UserRole;
import com.edtech.repository.ProjectRepository;
import com.edtech.repository.UserRepository;
import java.util.Locale;
import java.util.Optional;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/** Documentação para DatabaseSeeder. */
@Component
@ConditionalOnWebApplication
public class DatabaseSeeder implements CommandLineRunner {

  private static final Logger logger = LoggerFactory.getLogger(DatabaseSeeder.class);

  private final UserRepository userRepository;
  private final ProjectRepository projectRepository;
  private final PasswordEncoder passwordEncoder;

  /** Javadoc. */
  public DatabaseSeeder(
      UserRepository userRepository,
      ProjectRepository projectRepository,
      PasswordEncoder passwordEncoder) {
    this.userRepository = userRepository;
    this.projectRepository = projectRepository;
    this.passwordEncoder = passwordEncoder;
  }

  @Override
  @Transactional
  public void run(String... args) {
    logger.info("Executando DatabaseSeeder...");

    UUID demoInstitutionId = UUID.fromString("00000000-0000-0000-0000-000000000001");
    String defaultPasswordHash = passwordEncoder.encode("Demo@1234");

    // 1. Criar usuários
    seedUser(
        "Pesquisador Demo",
        "pesquisador.demo@unb.br",
        defaultPasswordHash,
        UserRole.RESEARCHER,
        demoInstitutionId);
    User orientador =
        seedUser(
            "Orientador Demo",
            "orientador.demo@unb.br",
            defaultPasswordHash,
            UserRole.ADVISOR,
            demoInstitutionId);
    seedUser(
        "Auditor Demo",
        "auditor.demo@unb.br",
        defaultPasswordHash,
        UserRole.AUDITOR,
        demoInstitutionId);

    // 2. Criar projetos fake
    if (projectRepository.count() == 0) {
      logger.info("Populando banco com projetos falsos (Kaggle-like datasets)...");

      com.edtech.model.Project p1 = new com.edtech.model.Project();
      p1.setTitle("Previsão de Temperatura Oceânica");
      p1.setDescription("Análise de séries temporais de mudanças climáticas usando dados globais.");
      p1.setAdvisor(orientador);
      projectRepository.save(p1);

      com.edtech.model.Project p2 = new com.edtech.model.Project();
      p2.setTitle("Classificação de Expressão Genômica");
      p2.setDescription(
          "Dataset com 10.000 perfis genômicos focados em detecção de anomalias raras.");
      p2.setAdvisor(orientador);
      projectRepository.save(p2);

      com.edtech.model.Project p3 = new com.edtech.model.Project();
      p3.setTitle("Auditoria Algorítmica em Modelos de Crédito");
      p3.setDescription(
          "Projeto voltado à detecção de bias em inteligência artificial do setor financeiro.");
      p3.setAdvisor(orientador);
      projectRepository.save(p3);

      logger.info("Projetos criados com sucesso.");
    }

    logger.info("DatabaseSeeder concluído.");
  }

  private User seedUser(
      String name, String email, String passwordHash, UserRole role, UUID institutionId) {
    String normalizedEmail = email.toLowerCase(Locale.ROOT);
    Optional<User> existing = userRepository.findByEmailIgnoreCase(normalizedEmail);
    if (existing.isEmpty()) {
      User user = new User(name, normalizedEmail, passwordHash, role, institutionId);
      user.setActive(true);
      logger.info("Criando usuário demo: {}", email);
      return userRepository.save(user);
    }
    return existing.get();
  }
}