ServerController.java

package io.featureprobe.api.controller;

import io.featureprobe.api.base.db.ExcludeTenant;
import io.featureprobe.api.dto.TrafficCreateRequest;
import io.featureprobe.api.dto.SdkKeyResponse;
import io.featureprobe.api.dto.ServerResponse;
import io.featureprobe.api.server.ServerDataSource;
import io.featureprobe.api.service.EnvironmentService;
import io.featureprobe.api.service.TrafficService;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Objects;

@Slf4j
@RestController
@RequestMapping("/internal/server/")
@AllArgsConstructor
@Hidden
public class ServerController {
    private TrafficService trafficService;

    private ServerDataSource dataSource;

    private EnvironmentService environmentService;

    @GetMapping("/sdk_keys")
    public SdkKeyResponse queryAllSdkKeys(@RequestParam(value = "version", required = false) Long version,
                                          HttpServletResponse response) throws Exception {
        SdkKeyResponse sdkKeyResponse = dataSource.queryAllSdkKeys();
        if (Objects.isNull(sdkKeyResponse)) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        } else if (Objects.nonNull(version) && version >= sdkKeyResponse.getVersion()) {
            response.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE);
            return null;
        }
        return sdkKeyResponse;
    }

    @GetMapping("/toggles")
    public ServerResponse fetchToggles(@Parameter(description = "sdk key")
                                       @RequestHeader(value = "Authorization") String sdkKey,
                                       @RequestParam(value = "version", required = false) Long version,
                                       HttpServletResponse response) throws Exception {
        ServerResponse serverResponse = dataSource.queryServerTogglesByServerSdkKey(sdkKey);
        if (Objects.isNull(serverResponse)) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        } else if (Objects.nonNull(version) && version >= serverResponse.getVersion()) {
            response.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE);
            return null;
        }
        return serverResponse;
    }

    @PostMapping("/events")
    @ExcludeTenant
    public void createEvent(
            @RequestBody @Validated List<TrafficCreateRequest> batchRequest,
            @Parameter(description = "sdk key")
            @RequestHeader(value = "Authorization") String sdkKey,
            @RequestHeader(value = "user-agent", required = false) String userAgent,
            @RequestHeader(value = "UA", required = false) String javascriptUserAgent) {
        if (StringUtils.isNotBlank(javascriptUserAgent)) {
            userAgent = javascriptUserAgent;
        }
        trafficService.create(environmentService.getSdkServerKey(sdkKey), userAgent, batchRequest);
    }

}