TagController.java

package no.nav.data.team.tag;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import no.nav.data.common.exceptions.ValidationException;
import no.nav.data.common.rest.RestResponsePage;
import org.apache.commons.lang3.Strings;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import static no.nav.data.common.utils.StartsWithComparator.startsWith;
import static no.nav.data.common.utils.StreamUtils.filter;

@Slf4j
@RestController
@RequestMapping("/tag")
@Tag(name = "Tag")
public class TagController {

    private final TagRepository tagRepository;

    public TagController(TagRepository tagRepository) {
        this.tagRepository = tagRepository;
    }

    @Operation(summary = "Get tags")
    @ApiResponse(description = "Tags fetched")
    @GetMapping
    public ResponseEntity<RestResponsePage<String>> getTags() {
        var tags = tagRepository.getTags();
        return new ResponseEntity<>(new RestResponsePage<>(tags), HttpStatus.OK);
    }

    @Operation(summary = "Search tags")
    @ApiResponse(description = "Tags fetched")
    @GetMapping("/search/{name}")
    public ResponseEntity<RestResponsePage<String>> searchTags(@PathVariable String name) {
        String trimmedName = name.trim();
        log.info("Tag search '{}'", trimmedName);
        if (trimmedName.length() < 3) {
            throw new ValidationException("Search resource must be at least 3 characters");
        }
        var tags = filter(tagRepository.getTags(), tag -> Strings.CI.contains(tag, trimmedName));
        tags.sort(startsWith(trimmedName));
        return new ResponseEntity<>(new RestResponsePage<>(tags), HttpStatus.OK);
    }

    static class TagPageResponse extends RestResponsePage<String> {

    }

}