AuthServerApplication.java

package org.petify.backend;

import org.petify.backend.models.Achievement;
import org.petify.backend.models.AchievementCategory;
import org.petify.backend.models.ApplicationUser;
import org.petify.backend.models.Role;
import org.petify.backend.models.VolunteerStatus;
import org.petify.backend.repository.AchievementRepository;
import org.petify.backend.repository.RoleRepository;
import org.petify.backend.repository.UserRepository;
import org.petify.backend.services.AchievementService;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.password.PasswordEncoder;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;

@SpringBootApplication
@EnableConfigurationProperties(AuthServerApplication.AdminProperties.class)
public class AuthServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(AuthServerApplication.class, args);
    }

    @ConfigurationProperties(prefix = "petify.admin.credentials")
    public record AdminProperties(String username, String password, String email) {}

    @Bean
    CommandLineRunner run(
            RoleRepository roleRepository,
            UserRepository userRepository,
            AchievementRepository achievementRepository,
            AchievementService achievementService,
            PasswordEncoder passwordEncoder,
            AdminProperties adminProperties) {
        return args -> {
            Role adminRole = roleRepository.findByAuthority("ADMIN")
                    .orElseGet(() -> roleRepository.save(new Role("ADMIN")));
            Role userRole = roleRepository.findByAuthority("USER")
                    .orElseGet(() -> roleRepository.save(new Role("USER")));

            roleRepository.findByAuthority("VOLUNTEER")
                    .orElseGet(() -> roleRepository.save(new Role("VOLUNTEER")));
            roleRepository.findByAuthority("SHELTER")
                    .orElseGet(() -> roleRepository.save(new Role("SHELTER")));

            Optional<ApplicationUser> existingAdmin = userRepository.findByUsername(adminProperties.username());
            if (existingAdmin.isEmpty()) {
                Set<Role> adminRoles = new HashSet<>();
                adminRoles.add(adminRole);
                adminRoles.add(userRole);

                ApplicationUser admin = new ApplicationUser();
                admin.setUsername(adminProperties.username());
                admin.setPassword(passwordEncoder.encode(adminProperties.password()));
                admin.setEmail(adminProperties.email());

                admin.setFirstName("Petify");
                admin.setLastName("Administrator");
                admin.setBirthDate(LocalDate.of(1980, 1, 1));
                admin.setGender("MALE");
                admin.setPhoneNumber("+48000000000");
                admin.setVolunteerStatus(VolunteerStatus.NONE);
                admin.setActive(true);
                admin.setCreatedAt(LocalDateTime.now());
                admin.setAuthorities(adminRoles);

                admin.setXpPoints(1000);
                admin.setLevel(10);
                admin.setLikesCount(0);
                admin.setSupportCount(0);
                admin.setBadgesCount(0);
                admin.setAdoptionCount(0);

                ApplicationUser savedAdmin = userRepository.save(admin);
                achievementService.initializeUserAchievements(savedAdmin);
            }

            long achievementCount = achievementRepository.count();
            if (achievementCount == 0) {
                Achievement achievement1 = new Achievement();
                achievement1.setName("Początkujący miłośnik");
                achievement1.setDescription("Polub 10 zwierząt");
                achievement1.setIconName("heart");
                achievement1.setXpReward(50);
                achievement1.setCategory(AchievementCategory.LIKES);
                achievement1.setRequiredActions(10);
                achievementRepository.save(achievement1);

                Achievement achievement2 = new Achievement();
                achievement2.setName("Entuzjastyczny miłośnik");
                achievement2.setDescription("Polub 50 zwierząt");
                achievement2.setIconName("heart");
                achievement2.setXpReward(100);
                achievement2.setCategory(AchievementCategory.LIKES);
                achievement2.setRequiredActions(50);
                achievementRepository.save(achievement2);

                Achievement achievement3 = new Achievement();
                achievement3.setName("Super miłośnik");
                achievement3.setDescription("Polub 100 zwierząt");
                achievement3.setIconName("heart");
                achievement3.setXpReward(200);
                achievement3.setCategory(AchievementCategory.LIKES);
                achievement3.setRequiredActions(100);
                achievementRepository.save(achievement3);

                Achievement achievement4 = new Achievement();
                achievement4.setName("Początkujące wsparcie");
                achievement4.setDescription("Wesprzyj 3 zwierzęta");
                achievement4.setIconName("hands-helping");
                achievement4.setXpReward(50);
                achievement4.setCategory(AchievementCategory.SUPPORT);
                achievement4.setRequiredActions(3);
                achievementRepository.save(achievement4);

                Achievement achievement5 = new Achievement();
                achievement5.setName("Entuzjastyczne wsparcie");
                achievement5.setDescription("Wesprzyj 10 zwierząt");
                achievement5.setIconName("hands-helping");
                achievement5.setXpReward(100);
                achievement5.setCategory(AchievementCategory.SUPPORT);
                achievement5.setRequiredActions(10);
                achievementRepository.save(achievement5);

                Achievement achievement6 = new Achievement();
                achievement6.setName("Super wsparcie");
                achievement6.setDescription("Wesprzyj 25 zwierząt");
                achievement6.setIconName("hands-helping");
                achievement6.setXpReward(250);
                achievement6.setCategory(AchievementCategory.SUPPORT);
                achievement6.setRequiredActions(25);
                achievementRepository.save(achievement6);

                Achievement profilePicture = new Achievement();
                profilePicture.setName("Pierwsza fotka");
                profilePicture.setDescription("Dodaj zdjęcie profilowe");
                profilePicture.setIconName("camera");
                profilePicture.setXpReward(50);
                profilePicture.setCategory(AchievementCategory.PROFILE);
                profilePicture.setRequiredActions(1);
                achievementRepository.save(profilePicture);

                Achievement completeProfile = new Achievement();
                completeProfile.setName("Kompletny profil");
                completeProfile.setDescription("Wypełnij wszystkie dane w profilu");
                completeProfile.setIconName("user-check");
                completeProfile.setXpReward(100);
                completeProfile.setCategory(AchievementCategory.PROFILE);
                completeProfile.setRequiredActions(1);
                achievementRepository.save(completeProfile);

                Achievement locationSet = new Achievement();
                locationSet.setName("Lokalizacja ustawiona");
                locationSet.setDescription("Dodaj swoją lokalizację");
                locationSet.setIconName("map-pin");
                locationSet.setXpReward(25);
                locationSet.setCategory(AchievementCategory.PROFILE);
                locationSet.setRequiredActions(1);
                achievementRepository.save(locationSet);

                Achievement volunteerAchievement = new Achievement();
                volunteerAchievement.setName("Ochotnik");
                volunteerAchievement.setDescription("Zgłoś się jako wolontariusz");
                volunteerAchievement.setIconName("hand-holding-heart");
                volunteerAchievement.setXpReward(75);
                volunteerAchievement.setCategory(AchievementCategory.VOLUNTEER);
                volunteerAchievement.setRequiredActions(1);
                achievementRepository.save(volunteerAchievement);

                Achievement firstAdoption = new Achievement();
                firstAdoption.setName("Pierwszy przyjaciel");
                firstAdoption.setDescription("Gratulacje za pierwszą adopcję zwierzęcia! Zmieniłeś czyjeś życie na lepsze.");
                firstAdoption.setIconName("heart-handshake");
                firstAdoption.setXpReward(200);
                firstAdoption.setCategory(AchievementCategory.ADOPTION);
                firstAdoption.setRequiredActions(1);
                achievementRepository.save(firstAdoption);

                Achievement animalRescuer = new Achievement();
                animalRescuer.setName("Ratownik zwierząt");
                animalRescuer.setDescription("Adoptowałeś już 5 zwierząt! Jesteś prawdziwym ratownikiem czworonogów.");
                animalRescuer.setIconName("shield-heart");
                animalRescuer.setXpReward(500);
                animalRescuer.setCategory(AchievementCategory.ADOPTION);
                animalRescuer.setRequiredActions(5);
                achievementRepository.save(animalRescuer);

                Achievement adoptionAngel = new Achievement();
                adoptionAngel.setName("Anioł adopcji");
                adoptionAngel.setDescription("Niesamowite! 10 adopcji za Tobą. Jesteś prawdziwym aniołem dla bezdomnych zwierząt.");
                adoptionAngel.setIconName("crown");
                adoptionAngel.setXpReward(1000);
                adoptionAngel.setCategory(AchievementCategory.ADOPTION);
                adoptionAngel.setRequiredActions(10);
                achievementRepository.save(adoptionAngel);
            }
        };
    }
}