admin user approval implemented

This commit is contained in:
Bernhard Müller 2026-06-10 17:17:44 +02:00
parent a46566f8c6
commit ab28328408
6 changed files with 75 additions and 9 deletions

View File

@ -1 +1,43 @@
GET {{host}}
### User Register
POST {{host}}/api/auth/register
Content-Type: application/json
{
"firstName": "Admin",
"lastName": "Admin",
"email": "admin@admin.at",
"password": "SuperAdmin",
"atNumber": "AT0010000000000000000000001234567"
}
### User Login
POST {{host}}/api/auth/login
Content-Type: application/json
{
"email": "admin@admin.at",
"password": "SuperAdmin"
}
> {%
client.global.set("auth_token", response.body.token);
%}
### Admin User Pending
GET {{host}}/api/admin/users/pending
Content-Type: application/json
Authorization: Bearer {{auth_token}}
> {%
if (response.status === 200 && response.body.length > 0) {
client.global.set("pending_user_id", response.body[0].id);
client.log("Gespeicherte User ID: " + client.global.get("pending_user_id"));
} else {
client.log("Keine Pending Users gefunden oder Fehler beim Abruf.");
}
%}
### Admin User Approve
POST {{host}}/api/admin/users/{{pending_user_id}}/approve
Content-Type: application/json
Authorization: Bearer {{auth_token}}

View File

@ -39,7 +39,7 @@
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>

View File

@ -8,7 +8,6 @@ import at.mueller.eeg.backend.community.repository.MeteringPointRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;
@ -20,7 +19,6 @@ public class MeteringPointEventListener {
private final ApplicationEventPublisher eventPublisher;
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
@Transactional
public void handleUserRegistered(UserRegisteredEvent event) {
MeteringPoint point = new MeteringPoint();
point.setUserId(event.userId());

View File

@ -1,15 +1,21 @@
package at.mueller.eeg.backend.iam.api;
import at.mueller.eeg.backend.iam.api.dto.IamDtos.UserProfileResponse;
import at.mueller.eeg.backend.iam.domain.RegistrationStatus;
import at.mueller.eeg.backend.iam.domain.User;
import at.mueller.eeg.backend.iam.mapper.UserMapper;
import at.mueller.eeg.backend.iam.repository.UserRepository;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@RestController
@ -21,20 +27,35 @@ public class AdminIamController {
private final UserRepository userRepository;
private final UserMapper userMapper;
@GetMapping("/pending")
@Operation(summary = "Lädt alle wartenden User",
description = "Zeigt User im Status PENDING inkl. der Ergebnisse des EDA-Netz-Checks.")
public ResponseEntity<List<UserProfileResponse>> getPendingUsers() {
//return ResponseEntity.ok(userRepository.findAllByStatus(RegistrationStatus.PENDING));
return null;
List<User> allByStatus = userRepository.findAllByStatus(RegistrationStatus.PENDING);
return ResponseEntity.ok(userMapper.mapToDto(allByStatus));
}
@PostMapping("/{userId}/approve")
@Operation(summary = "User freigeben",
description = "Setzt enabled=true, status=APPROVED und triggert die finale EDA-Anmeldung.")
public ResponseEntity<Void> approveUser(@PathVariable UUID userId) {
Optional<User> userOptional = userRepository.findById(userId);
if (userOptional.isPresent()) {
User user = userOptional.get();
if (RegistrationStatus.PENDING.equals(user.getStatus())) {
user.setStatus(RegistrationStatus.APPROVED);
} else {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "User in wrong status");
}
if (user.isEnabled()) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "User already enabled");
}
user.setEnabled(true);
userRepository.save(user);
}
// Logik: status auf APPROVED, enabled auf true
// Event feuern: UserApprovedEvent (Schickt E-Mail an User)

View File

@ -6,11 +6,15 @@ import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import java.util.List;
@Mapper(
uses = PasswordHashMapper.class
)
public interface UserMapper {
List<IamDtos.UserProfileResponse> mapToDto(List<User> users);
@Mapping(target = "primaryAtNumber", ignore = true)
IamDtos.UserProfileResponse mapToDto(User user);

View File

@ -6,8 +6,9 @@ import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
public interface UserRepository extends JpaRepository<User, String> {
public interface UserRepository extends JpaRepository<User, UUID> {
Optional<User> findByEmail(String email);