refactor(user): move user domain to user/ package, rename DataInitializer to UserDataInitializer

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Marcel
2026-05-05 12:45:30 +02:00
parent e85057bed2
commit af2c983fe2
96 changed files with 245 additions and 242 deletions

View File

@@ -1,186 +0,0 @@
package org.raddatz.familienarchiv.config;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.raddatz.familienarchiv.model.AppUser;
import org.springframework.context.annotation.DependsOn;
import org.raddatz.familienarchiv.document.Document;
import org.raddatz.familienarchiv.document.DocumentStatus;
import org.raddatz.familienarchiv.person.Person;
import org.raddatz.familienarchiv.tag.Tag;
import org.raddatz.familienarchiv.model.UserGroup;
import org.raddatz.familienarchiv.repository.AppUserRepository;
import org.raddatz.familienarchiv.document.DocumentRepository;
import org.raddatz.familienarchiv.person.PersonRepository;
import org.raddatz.familienarchiv.tag.TagRepository;
import org.raddatz.familienarchiv.repository.UserGroupRepository;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.time.LocalDate;
import java.util.Set;
@Configuration
@RequiredArgsConstructor
@Slf4j
@DependsOn("flyway")
public class DataInitializer {
@Value("${app.admin.email:admin@familyarchive.local}")
private String adminEmail;
@Value("${app.admin.password:admin123}")
private String adminPassword;
private final AppUserRepository userRepository;
private final UserGroupRepository groupRepository;
@Bean
public CommandLineRunner initAdminUser(PasswordEncoder passwordEncoder) {
return args -> {
if (userRepository.findByEmail(adminEmail).isEmpty()) {
log.info("Kein Admin-User '{}' gefunden. Erstelle Default-Admin...", adminEmail);
UserGroup adminGroup = UserGroup.builder()
.name("Administrators")
.permissions(Set.of("ADMIN", "READ_ALL", "WRITE_ALL", "ANNOTATE_ALL", "ADMIN_USER", "ADMIN_TAG", "ADMIN_PERMISSION"))
.build();
groupRepository.save(adminGroup);
AppUser admin = AppUser.builder()
.email(adminEmail)
.password(passwordEncoder.encode(adminPassword))
.groups(Set.of(adminGroup))
.build();
userRepository.save(admin);
log.info("Default Admin erstellt: Email='{}'", adminEmail);
}
};
}
/**
* Deterministic seed data for E2E tests.
*
* Activated only with --spring.profiles.active=e2e (local and CI).
* Idempotent: skips seeding if persons already exist (e.g. on restart).
*
* Persons, tags, and documents are hardcoded so E2E assertions are stable
* across every run — no random names or dates.
*/
@Bean
@Profile("e2e")
public CommandLineRunner initE2EData(PersonRepository personRepo,
DocumentRepository docRepo,
TagRepository tagRepo,
PasswordEncoder passwordEncoder) {
return args -> {
userRepository.findByEmail(adminEmail).ifPresent(admin -> {
admin.setPassword(passwordEncoder.encode(adminPassword));
userRepository.save(admin);
log.info("E2E seed: Admin-Passwort auf konfigurierten Wert zurückgesetzt.");
});
if (userRepository.findByEmail("reader@familyarchive.local").isEmpty()) {
log.info("E2E seed: Erstelle 'reader'-Testbenutzer...");
UserGroup leserGroup = groupRepository.findByName("Leser").orElseGet(() ->
groupRepository.save(UserGroup.builder()
.name("Leser")
.permissions(Set.of("READ_ALL"))
.build()));
userRepository.save(AppUser.builder()
.email("reader@familyarchive.local")
.password(passwordEncoder.encode("reader123"))
.groups(Set.of(leserGroup))
.build());
log.info("E2E seed: 'reader'-Testbenutzer erstellt.");
}
if (personRepo.count() > 0) {
log.info("E2E seed: Personendaten bereits vorhanden, überspringe Dokument-Seed.");
return;
}
log.info("E2E seed: Erstelle deterministische Testdaten...");
// ── Persons ──────────────────────────────────────────────────────
Person hans = personRepo.save(Person.builder()
.firstName("Hans").lastName("Müller").build());
Person anna = personRepo.save(Person.builder()
.firstName("Anna").lastName("Schmidt").build());
Person otto = personRepo.save(Person.builder()
.firstName("Otto").lastName("Fischer").build());
Person maria = personRepo.save(Person.builder()
.firstName("Maria").lastName("Weber").build());
// ── Tags ─────────────────────────────────────────────────────────
Tag tagFamilie = tagRepo.save(Tag.builder().name("Familie").build());
Tag tagKrieg = tagRepo.save(Tag.builder().name("Krieg").build());
Tag tagUrlaub = tagRepo.save(Tag.builder().name("Urlaub").build());
// ── Documents ────────────────────────────────────────────────────
docRepo.save(Document.builder()
.title("Geburtsurkunde Hans Müller")
.originalFilename("geburtsurkunde_hans.pdf")
.status(DocumentStatus.UPLOADED)
.documentDate(LocalDate.of(1923, 4, 12))
.location("Berlin")
.sender(hans)
.receivers(Set.of(anna))
.tags(Set.of(tagFamilie))
.transcription("Hiermit wird beurkundet, dass Hans Müller am 12. April 1923 in Berlin geboren wurde.")
.build());
docRepo.save(Document.builder()
.title("Brief aus dem Krieg")
.originalFilename("brief_krieg_1944.pdf")
.status(DocumentStatus.TRANSCRIBED)
.documentDate(LocalDate.of(1944, 6, 6))
.location("Normandie")
.sender(otto)
.receivers(Set.of(anna, maria))
.tags(Set.of(tagKrieg, tagFamilie))
.transcription("Liebe Anna, ich schreibe dir aus der Front. Es geht mir den Umständen entsprechend gut.")
.build());
docRepo.save(Document.builder()
.title("Urlaubspostkarte Ostsee")
.originalFilename("postkarte_1965.jpg")
.status(DocumentStatus.PLACEHOLDER)
.documentDate(LocalDate.of(1965, 8, 3))
.location("Rügen")
.sender(anna)
.receivers(Set.of(hans))
.tags(Set.of(tagUrlaub))
.build());
docRepo.save(Document.builder()
.title("Unbekanntes Dokument")
.originalFilename("unbekannt.pdf")
.status(DocumentStatus.PLACEHOLDER)
.documentDate(LocalDate.of(1950, 1, 1))
.location("München")
.receivers(Set.of(maria))
.build());
docRepo.save(Document.builder()
.title("Scan ohne Titel")
.originalFilename("scan_ohne_titel.pdf")
.status(DocumentStatus.UPLOADED)
.documentDate(LocalDate.of(1978, 11, 20))
.location("Hamburg")
.sender(maria)
.receivers(Set.of(otto))
.build());
log.info("E2E seed: {} Personen, {} Tags, {} Dokumente, {} Benutzer erstellt.",
personRepo.count(), tagRepo.count(), docRepo.count(), userRepository.count());
};
}
}

View File

@@ -2,7 +2,7 @@ package org.raddatz.familienarchiv.config;
import lombok.RequiredArgsConstructor;
import org.raddatz.familienarchiv.service.CustomUserDetailsService;
import org.raddatz.familienarchiv.user.CustomUserDetailsService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;