package se.bilhalsning.config; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.context.annotation.Profile; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import se.bilhalsning.entity.User; import se.bilhalsning.repository.UserRepository; @Component @Profile("prod") @RequiredArgsConstructor @Slf4j public class AdminBootstrap implements ApplicationRunner { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; @Value("${app.admin.email:}") private String adminEmail; @Value("${app.admin.password:}") private String adminPassword; @Override public void run(ApplicationArguments args) { if (userRepository.existsByRole("admin")) { log.info("Admin account already present, skipping bootstrap"); return; } if (!StringUtils.hasText(adminEmail) || !StringUtils.hasText(adminPassword)) { throw new IllegalStateException( "Production requires ADMIN_EMAIL and ADMIN_PASSWORD when no admin user exists"); } User admin = new User(); admin.setEmail(adminEmail.trim()); admin.setPasswordHash(passwordEncoder.encode(adminPassword)); admin.setRole("admin"); userRepository.save(admin); log.info("Created production admin account for {}", admin.getEmail()); } }