feat: expose account identity and eligibility boundary
This commit is contained in:
+5
@@ -1,9 +1,14 @@
|
||||
package com.lab.labtimesheet.feature.account.repository;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import com.lab.labtimesheet.feature.account.model.InternshipStatus;
|
||||
import com.lab.labtimesheet.feature.account.model.entity.InternProfile;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface InternProfileRepository extends JpaRepository<InternProfile, Long> {
|
||||
boolean existsByUserIdAndInternshipStatus(Long userId, InternshipStatus status);
|
||||
|
||||
boolean existsByUserIdAndInternshipStatusAndInternshipStartDateLessThanEqualAndInternshipEndDateGreaterThanEqual(
|
||||
Long userId, InternshipStatus status, LocalDate latestStartDate, LocalDate earliestEndDate);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.lab.labtimesheet.feature.account.service;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import com.lab.labtimesheet.feature.account.model.AccountStatus;
|
||||
import com.lab.labtimesheet.feature.account.model.GlobalRole;
|
||||
import com.lab.labtimesheet.feature.account.model.InternshipStatus;
|
||||
@@ -42,6 +44,20 @@ public class AccountService {
|
||||
.isPresent();
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public boolean isEligibleIntern(long userId, LocalDate workDate) {
|
||||
if (workDate == null) {
|
||||
throw new IllegalArgumentException("Work date is required");
|
||||
}
|
||||
return users.findById(userId)
|
||||
.filter(user -> user.getGlobalRole() == GlobalRole.INTERN)
|
||||
.filter(user -> user.getAccountStatus() == AccountStatus.ACTIVE)
|
||||
.filter(user -> internProfiles
|
||||
.existsByUserIdAndInternshipStatusAndInternshipStartDateLessThanEqualAndInternshipEndDateGreaterThanEqual(
|
||||
user.getId(), InternshipStatus.ACTIVE, workDate, workDate))
|
||||
.isPresent();
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public AccountIdentity requireEligibleIntern(long userId) {
|
||||
if (!isEligibleIntern(userId)) {
|
||||
|
||||
+15
-8
@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
@@ -80,17 +81,23 @@ class BootstrapIntegrationTest {
|
||||
BootstrapService.BootstrapOutcome.CREATED, BootstrapService.BootstrapOutcome.ALREADY_INITIALIZED);
|
||||
assertThat(users.count()).isEqualTo(1);
|
||||
assertThat(users.countByGlobalRoleAndAccountStatus(GlobalRole.ADMIN, AccountStatus.ACTIVE)).isEqualTo(1);
|
||||
var createdUser = users.findAll().getFirst();
|
||||
var identityByEmail = accountService.requireIdentityByEmail(" " + createdUser.getEmail().toUpperCase() + " ");
|
||||
assertThat(identityByEmail.email()).isEqualTo(createdUser.getEmail());
|
||||
assertThat(identityByEmail.displayName()).isEqualTo("First Admin");
|
||||
assertThat(identityByEmail.role()).isEqualTo(GlobalRole.ADMIN);
|
||||
assertThat(identityByEmail.status()).isEqualTo(AccountStatus.ACTIVE);
|
||||
assertThat(accountService.requireIdentityById(identityByEmail.id())).isEqualTo(identityByEmail);
|
||||
assertThat(accountService.isEligibleIntern(identityByEmail.id())).isFalse();
|
||||
assertThat(bootstrapService.bootstrap(
|
||||
"another@example.com", "Another", "correct horse battery staple"))
|
||||
.isEqualTo(BootstrapService.BootstrapOutcome.ALREADY_INITIALIZED);
|
||||
assertThat(systemStates.findById((short) 1).orElseThrow().isInitialized()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
void exposesIdentityAndDateAwareInternEligibilityWithoutPersistenceTypes() {
|
||||
bootstrapService.bootstrap("admin@example.com", "First Admin", "correct horse battery staple");
|
||||
|
||||
var identityByEmail = accountService.requireIdentityByEmail(" ADMIN@EXAMPLE.COM ");
|
||||
assertThat(identityByEmail.email()).isEqualTo("admin@example.com");
|
||||
assertThat(identityByEmail.displayName()).isEqualTo("First Admin");
|
||||
assertThat(identityByEmail.role()).isEqualTo(GlobalRole.ADMIN);
|
||||
assertThat(identityByEmail.status()).isEqualTo(AccountStatus.ACTIVE);
|
||||
assertThat(accountService.requireIdentityById(identityByEmail.id())).isEqualTo(identityByEmail);
|
||||
assertThat(accountService.isEligibleIntern(identityByEmail.id())).isFalse();
|
||||
assertThat(accountService.isEligibleIntern(identityByEmail.id(), LocalDate.of(2026, 8, 14))).isFalse();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user