AdminController.java

package no.nav.data.team.settings;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import no.nav.data.common.mail.EmailService;
import no.nav.data.common.mail.MailTask;
import no.nav.data.common.security.SecurityUtils;
import no.nav.data.common.security.azure.AzureUserInfo;
import no.nav.data.common.security.dto.UserInfo;
import no.nav.data.common.storage.StorageService;
import no.nav.data.common.unleash.UnleashClient;
import no.nav.data.team.notify.NotificationService;
import no.nav.data.team.team.domain.Team;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@Slf4j
@RestController
@RequiredArgsConstructor
@Tag(name = "Admin", description = "Admin ops")
@RequestMapping("/admin")
public class AdminController {

    private final NotificationService notificationService;
    private final EmailService emailService;
    private final StorageService storage;
    private final UnleashClient unleashClient;
    private final SecurityUtils securityUtils;

    @Operation(summary = "mail test")
    @ApiResponses(value = {@ApiResponse(description = "mail")})
    @GetMapping(value = "/mail", produces = "text/html")
    public ResponseEntity<String> mail() {
        testMail();
        return ResponseEntity.ok("ok");
    }

    @Operation(summary = "trigger nudge")
    @ApiResponses(value = {@ApiResponse(description = "nudge")})
    @PostMapping(value = "/nudge", produces = "text/html")
    public ResponseEntity<String> nudge(@RequestParam(value = "teamId") UUID teamId) {
        var team = storage.get(teamId, Team.class);
        notificationService.nudge(team);
        return ResponseEntity.ok("ok");
    }

    public void testMail() {
        var email = securityUtils.getCurrentUser().map(UserInfo::getEmail).orElseThrow();
        emailService.sendMail(MailTask.builder().to(email).subject("test").body("testbody").build());
    }


    @Operation(
            summary = "unleash toggle check",
            description = "Check if toggle is enabled. Uses user token for context",
            security = @SecurityRequirement(name = "Bearer token")
    )
    @ApiResponses(value = {@ApiResponse(description = "toggle state")})
    @GetMapping("/unleash/togglestate/{toggleName}")
    public ResponseEntity<UnleashToggleResponse> isEnabled(@PathVariable String toggleName) {
        var auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth == null) {
            return ResponseEntity.status(401).build();
        }
        if (auth.getDetails() instanceof AzureUserInfo azureUserInfo) {
            if (azureUserInfo.isAdmin()) {
                return ResponseEntity.ok(new UnleashToggleResponse(this.unleashClient.isEnabled(toggleName), toggleName));
            }
        }
        return ResponseEntity.status(403).build();
    }

    public record UnleashToggleResponse(boolean isEnabled, String toggleName) {
    }
}